OpenCV  4.10.0
开放源代码计算机视觉
加载中...
搜索中...
没有匹配项
鼠标作为画笔

目标

简单演示

我们创建了一个简单应用程序,用于在图片上双击时画一个圆。

首先,我们创建一个鼠标回调函数,当鼠标事件发生时执行。鼠标事件可以是与鼠标相关的任何内容,如鼠标左键按下、鼠标左键松开、鼠标左键双击等。它为我们提供每次鼠标事件的坐标 (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
cv.circle(img,(x,y),100,(255,0,0),-1)
# 创建一个黑色图像、一个窗口,并将此函数绑定到窗口
img = np.zeros((512,512,3), np.uint8)
cv.setMouseCallback('image',draw_circle)
while(1)
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27
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 # 如果为真,则绘制矩形。按“m”切换到曲线
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
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP
drawing = False
if mode == True
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
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)
cv.setMouseCallback('image',draw_circle)
while(1)
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == ord('m')
mode = not mode
elif k == 27
break

附加资源

练习

  1. 在我们的最后一个示例中,我们绘制了一个填充的矩形。你可以修改代码来绘制一个未填充的矩形。