目标
简单演示
在这里,我们创建一个简单的应用程序,只要我们在图像上双击,它就会在图像上绘制一个圆。
首先,我们创建一个鼠标回调函数,该函数在鼠标事件发生时执行。鼠标事件可以是任何与鼠标相关的事件,例如鼠标左键按下、鼠标左键抬起、鼠标左键双击等。它会为我们提供每个鼠标事件的坐标 (x,y)。有了这个事件和位置,我们可以做任何我们喜欢的事情。要列出所有可用的事件,请在 Python 终端中运行以下代码
import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print( events )
创建鼠标回调函数具有一种特定的格式,这种格式在任何地方都相同。它唯一的不同之处在于函数的功能。所以我们的鼠标回调函数做一件事,它在我们双击的地方画一个圆。所以看看下面的代码。代码中的注释是不言自明的
import numpy as np
import cv2 as cv
def draw_circle(event,x,y,flags,param)
if event == cv.EVENT_LBUTTONDBLCLK
img = np.zeros((512,512,3), np.uint8)
while(1)
break
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建窗口。
void destroyAllWindows()
销毁所有HighGUI窗口。
void setMouseCallback(const String &winname, MouseCallback onMouse, void *userdata=0)
为指定窗口设置鼠标处理程序。
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
更高级的演示
现在我们来进行一个更好的应用程序。在这个应用程序中,我们通过拖动鼠标来绘制矩形或圆形(取决于我们选择的模式),就像我们在画图应用程序中所做的那样。因此,我们的鼠标回调函数有两个部分,一个用于绘制矩形,另一个用于绘制圆形。这个特定的示例将非常有助于创建和理解一些交互式应用程序,例如对象跟踪、图像分割等。
import numpy as np
import cv2 as cv
drawing = False
mode = True
ix,iy = -1,-1
def draw_circle(event,x,y,flags,param)
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE
if drawing == True
if mode == True
else:
elif event == cv.EVENT_LBUTTONUP
drawing = False
if mode == True
else:
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
绘制一个简单、粗或填充的矩形。
接下来,我们必须将此鼠标回调函数绑定到 OpenCV 窗口。在主循环中,我们应该为键“m”设置一个键盘绑定,以便在矩形和圆形之间切换。
img = np.zeros((512,512,3), np.uint8)
while(1)
if k == ord('m')
mode = not mode
elif k == 27
break
练习
- 在我们的上一个示例中,我们绘制了填充的矩形。您修改代码以绘制一个未填充的矩形。