鼠标作为画笔

作者|OpenCV-Python Tutorials
编译|Vincent
来源|OpenCV-Python Tutorials

目标

  • 了解如何在OpenCV中处理鼠标事件
  • 您将学习以下功能:cv.setMouseCallback()

简单演示

在这里,我们创建一个简单的应用程序,无论我们在哪里双击它,都可以在图像上绘制一个圆。

首先,我们创建一个鼠标回调函数,该函数在发生鼠标事件时执行。鼠标事件可以是与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等。它为我们提供了每个鼠标事件的坐标(x,y)。通过此活动和地点,我们可以做任何我们喜欢的事情。要列出所有可用的可用事件,请在Python终端中运行以下代码:

  1. import cv2 as cv
  2. events = [i for i in dir(cv) if 'EVENT' in i]
  3. print( events )

创建鼠标回调函数具有特定的格式,该格式在所有地方都相同。它仅在功能上有所不同。因此,我们的鼠标回调函数可以做一件事,在我们双击的地方绘制一个圆圈。因此,请参见下面的代码。代码在注释中是不言自明的:

  1. import numpy as np
  2. import cv2 as cv
  3. # 鼠标回调函数
  4. def draw_circle(event,x,y,flags,param):
  5. if event == cv.EVENT_LBUTTONDBLCLK:
  6. cv.circle(img,(x,y),100,(255,0,0),-1)
  7. # 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
  8. img = np.zeros((512,512,3), np.uint8)
  9. cv.namedWindow('image')
  10. cv.setMouseCallback('image',draw_circle)
  11. while(1):
  12. cv.imshow('image',img)
  13. if cv.waitKey(20) & 0xFF == 27:
  14. break
  15. cv.destroyAllWindows()

更高级的演示

现在我们去寻找一个更好的应用。在这里,我们通过拖动鼠标来绘制矩形或圆形(取决于我们选择的模式) ,就像我们在 Paint 应用程序中所做的那样。所以我们的鼠标回调函数有两部分,一部分用于绘制矩形,另一部分用于绘制圆形。这个具体的例子对于创建和理解一些交互式应用程序非常有帮助,比如目标跟踪,图像分割地图等等。

  1. import numpy as np
  2. import cv2 as cv
  3. drawing = False # 如果按下鼠标,则为真
  4. mode = True # 如果为真,绘制矩形。按 m 键可以切换到曲线
  5. ix,iy = -1,-1
  6. # 鼠标回调函数
  7. def draw_circle(event,x,y,flags,param):
  8. global ix,iy,drawing,mode
  9. if event == cv.EVENT_LBUTTONDOWN:
  10. drawing = True
  11. ix,iy = x,y
  12. elif event == cv.EVENT_MOUSEMOVE:
  13. if drawing == True:
  14. if mode == True:
  15. cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
  16. else:
  17. cv.circle(img,(x,y),5,(0,0,255),-1)
  18. elif event == cv.EVENT_LBUTTONUP:
  19. drawing = False
  20. if mode == True:
  21. cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
  22. else:
  23. cv.circle(img,(x,y),5,(0,0,255),-1)

其他资源

练习题

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