鼠标作为画笔
目标
- 学习处理OpenCV中的鼠标事件
- 你将学习这些函数:cv2.setMouseCallback()
简单的演示
在这里,我们创建了一个简单的应用程序,无论我们双击它,在图像上绘制一个圆圈。
首先我们创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有关的任何事情,例如左键向下,左键向上,左键双击等等。它给我们每个鼠标事件的坐标(x,y)。有了这个活动和地点,我们可以做任何我们喜欢的事情。要列出所有可用的事件,请在Python终端中运行以下代码:
>>> 进口 CV2
>>> 事件 = [ 我 为 我 在 DIR (CV2 ) 如果 “事件” 在 我]
>>> 打印 事件
创建鼠标回调??函数具有各处相同的特定格式。它仅在功能上有所不同。所以我们的鼠标回调函数做了一件事,它在我们双击的地方绘制了一个圆圈。所以看下面的代码。代码是不言自明的:
导入 cv2
导入 numpy 为 np
#鼠标回调函数
def draw_circle (event ,x ,y ,flags ,param ):
if event == cv2 。EVENT_LBUTTONDBLCLK :
cv2 。圈(IMG ,(X ,? ),100 ,(255 ,0 ,0 ),- 1 )
#创建一个黑色图像,一个窗口并将该函数绑定到窗口
img = np 。零((512 ,512 ,3 ), NP 。UINT8 )
CV2 。namedWindow (‘image‘ )
cv2 。setMouseCallback (‘image‘ ,draw_circle )
而(1 ):
cv2 。imshow (‘image‘ ,img )
如果 cv2 。waitKey (20 ) & 0xFF == 27 :
break
cv2 。destroyAllWindows ()
更高级的演示
现在我们去更好的应用。在这里,我们通过像在Paint应用程序中那样拖动鼠标来绘制矩形或圆形(取决于我们选择的模式)。所以我们的鼠标回调函数有两个部分,一个绘制矩形和其他绘制圆圈。这个具体的例子在创建和理解一些交互式应用程序如对象跟踪,图像分割等方面将非常有用。
导入 cv2
导入 numpy 为 np
drawing = False #如果按下鼠标,则为true
mode = True #如果为True,绘制矩形。按‘m‘切换到曲线
ix ,iy = - 1 ,- 1
#鼠标回调函数
def draw_circle (event ,x ,y ,flags ,param ):
全局 ix ,iy ,绘图,模式
如果 event == cv2 。EVENT_LBUTTONDOWN :
drawing = True
ix ,iy = x ,y
elif 事件 == cv2 。EVENT_MOUSEMOVE :
if drawing == True :
if mode == True :
cv2 。矩形(IMG ,(IX ,IY ),(X ,Y ),(0 ,255 ,0 ),- 1 )
否则:
CV2 。圆(img ,(x ,y ),5 ,(0,0 ,255 ),- 1 )
elif 事件 == cv2 。EVENT_LBUTTONUP :
如果模式== True,则绘图 = False
:cv2 。矩形(IMG ,(IX ,IY ),(X ,Y ),(0 ,255 ,0 ),- 1 )否则:CV2 。圈(IMG ,(X ,? ),5 ,(0 ,0
,255 ),- 1 )
接下来,我们必须将此鼠标回调函数绑定到OpenCV窗口。在主循环中,我们应该为键‘m‘设置键盘绑定,以在矩形和圆形之间切换。
img = np 。零((512 ,512 ,3 ), NP 。UINT8 )
CV2 。namedWindow (‘image‘ )
cv2 。setMouseCallback (‘image‘ ,draw_circle )
而(1 ):
cv2 。imshow (‘image‘ ,img )
k = cv2 。waitKey (1 ) & 0xFF
if k == ord (‘m‘ ):
mode = not mode
elif k == 27 :
break
cv2 。destroyAllWindows ()