python+openCV鼠标事件

鼠标事件即包括:左键按下,左键松开,左键双击,鼠标移动等,主要需掌握函数cv2.setMouseCallback(windowName, onMouse [, param])及其对应的回调函数。下面一一进行介绍。

cv2.setMouseCallback(windowName, onMouse [, param])

  • windowName:鼠标事件执行的窗口
  • onMouse:       回调函数
  • param:            用户自定义传入到回调函数中的参数

 

回调函数形如:def callback(event,x,y,flags,param)

event:鼠标事件,通过如下代码可以查看所有事件

[i for i in dir(cv2) if 'EVENT' in i]
  1. 'EVENT_FLAG_ALTKEY',
  2. 'EVENT_FLAG_CTRLKEY',
  3. 'EVENT_FLAG_LBUTTON',
  4. 'EVENT_FLAG_MBUTTON',
  5. 'EVENT_FLAG_RBUTTON',
  6. 'EVENT_FLAG_SHIFTKEY',
  7. 'EVENT_LBUTTONDBLCLK',
  8. 'EVENT_LBUTTONDOWN',
  9. 'EVENT_LBUTTONUP',
  10. 'EVENT_MBUTTONDBLCLK',
  11. 'EVENT_MBUTTONDOWN',
  12. 'EVENT_MBUTTONUP',
  13. 'EVENT_MOUSEHWHEEL',
  14. 'EVENT_MOUSEMOVE',
  15. 'EVENT_MOUSEWHEEL',
  16. 'EVENT_RBUTTONDBLCLK',
  17. 'EVENT_RBUTTONDOWN',
  18. 'EVENT_RBUTTONUP'
  • x,y:     当前鼠标对应的坐标
  • flags:  是CV_EVENT_FLAG的组合,状态有:
  1. EVENT_FLAG_LBUTTON 
  2. EVENT_FLAG_RBUTTON 
  3. EVENT_FLAG_MBUTTON 
  4. EVENT_FLAG_CTRLKEY 
  5. EVENT_FLAG_SHIFTKEY 
  6. EVENT_FLAG_ALTKEY 
  • param: 用户自定义传入的参数


下面通过一个简单的案例来实现鼠标画圆操作,代码如下:

import cv2
import numpy as np
#新建图片
img=np.zeros((500,500))
#定义回调函数,此处只用到了event,x,y三个参数
def draw_circle(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDBLCLK:
        #画圆函数,参数分别表示原图、坐标、半径、颜色、线宽(若为-1表示填充)
        cv2.circle(img,(x,y),20,255,-1)
cv2.namedWindow('img')
#新建鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
    cv2.imshow('img',img)
    if cv2.waitKey(1)==ord('q'):
        break
cv2.destroyAllWindows()

拓展:现通过结合滑动条和鼠标事件绘制不同半径大小的圆,代码如下:

import cv2
import numpy as np
#新建图片
img=np.zeros((500,500))
#初始半径为5
radius=5
#新建窗口
cv2.namedWindow('img')
#定义滑动条回调函数,修改半径值
def circle_radius(x):
    global radius
    radius=x
#新建滑动条,初始值5,最大值为50
cv2.createTrackbar('radius','img',5,50,circle_radius)
#定义鼠标事件回调函数,此处只用到了event,x,y三个参数
def draw_circle(event,x,y,flags,param):
    global radius
    if event==cv2.EVENT_LBUTTONDBLCLK:
        #画圆函数,参数分别表示原图、坐标、半径、颜色、线宽(若为-1表示填充)
        cv2.circle(img,(x,y),radius,255,-1)
#新建鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
    cv2.imshow('img',img)
    if cv2.waitKey(1)==ord('q'):
        break
cv2.destroyAllWindows()

GIF效果如下:

#欢迎关注我的微信公众号

python+openCV鼠标事件_第1张图片

你可能感兴趣的:(openCV)