【opencv3 学习记录】第四章 调用鼠标

一:鼠标操作

1.查看支持的鼠标事件

     鼠标事件可以是鼠标上的任何动作,比如左键按下,左键松开,左键双击等。 我们可以通过鼠标事件获得与鼠标对应的图片上的坐标

#查看支持的鼠标事件
import cv2
events=[i for i in dir(cv2) if 'EVENT'in i]
print(events)

截取一部分结果

EVENT_MOUSEMOVE              滑动
EVENT_LBUTTONDOWN          左键点击
EVENT_RBUTTONDOWN          右键点击
EVENT_MBUTTONDOWN          中键点击
EVENT_LBUTTONUP                 左键放开
EVENT_RBUTTONUP                 右键放开
EVENT_MBUTTONUP                 中键放开
EVENT_LBUTTONDBLCLK          左键双击
EVENT_RBUTTONDBLCLK         右键双击
EVENT_MBUTTONDBLCLK         中键双击
 

2.指定鼠标操作消息回调函数的函数:SetMouseCallback

(1)函数作用:为指定的窗口设置鼠标回调函数

(2)函数:SetMouseCallback(const String &  winname,
                                                 MouseCallback  onMouse,
                                                 void *  userdata = 0 )

(3)参数说明:

  • 参数1:str类型的winname,窗口的名字
  • 参数2:回调函数
  • 参数3:用户定义的传递到回调函数的参数,默认值为0,一般可以省略

二:举例

例1:在图片上你双击过的位置绘制一个半径100蓝色填充圆(以点击位置为圆心)

#在图片上你双击过的位置绘制一个半径100蓝色填充圆(以点击位置为圆心)#
import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
def draw_circle(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(255,0,0),-1)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20)&0xFF==27:
        break
cv2.destroyAllWindows()

 例2:根据我们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以我们的回调函数包含两部分,按住左键移动画矩形,按‘c’后按住左键移动画圆圈。

# 开发时间:
import cv2
import numpy as np
img=np.zeros((512,512,3),np.uint8)
#定义画图开关,和画圆开关
#当按下鼠标后drawing为True
drawing=False
#如果mode为True绘制矩形。按下‘c’绘画圆
mode=True
ix,iy=-1,-1
def draw_circle(event,x,y,flags,param):
    #定义全局变量ix,iy,drawing,mode
    global ix,iy,drawing,mode
    #当按下左键返回起始坐标值
    if event==cv2.EVENT_LBUTTONDOWN:
        drawing=True
        ix,iy=x,y
    #当鼠标左键按下并移动绘制图形。event可以查看移动,flag查看是否按下
    elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
         if drawing==True:
             if mode==True:
                 cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
             else:
                 r=int(np.sqrt((x-ix)**2+(y-iy)**2))
                 cv2.circle(img,(ix,iy),r,(0,0,255),-1)
    #当鼠标松开是停止绘画
    elif event==cv2.EVENT_LBUTTONUP:
        drawing==False
    #展示绘图
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
        cv2.imshow('image',img)
        k=cv2.waitKey(1)&0xFF
        if k==ord('c'):
                mode=not mode
        elif k==27:
                break

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值