目标
简单演示
我们创建了一个简单应用程序,用于在图片上双击时画一个圆。
首先,我们创建一个鼠标回调函数,当鼠标事件发生时执行。鼠标事件可以是与鼠标相关的任何内容,如鼠标左键按下、鼠标左键松开、鼠标左键双击等。它为我们提供每次鼠标事件的坐标 (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)
绘制一个圆。
更高级的演示
现在我们进行一个更好的应用。在这个应用中,我们通过拖动鼠标来绘制矩形或圆形(取决于我们选择的模式),就像我们在 Paint 应用程序中所做的那样。因此,我们的鼠标回调函数有两个部分,一个用于绘制矩形,另一个用于绘制圆形。这个特定的示例对于创建和理解一些交互式应用程序(如对象跟踪、图像分割等)非常有帮助。
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
附加资源
练习
- 在我们的最后一个示例中,我们绘制了一个填充的矩形。你可以修改代码来绘制一个未填充的矩形。