Opencv+Python(4):鼠标作为画笔

时间:2021-12-27 06:01:44

鼠标作为画笔

目标

  • 学习处理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 Ý ),(0 255 0 ),- 1  否则 CV2 img ,(x y ),5 ,(00 255 ),- 1  elif  事件 ==  cv2 EVENT_LBUTTONUP  如果模式== True,绘图 =  False  cv2 矩形IMG ,(IX IY ),(X Ý ),(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 ()