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效果如下:

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

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值