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