OpenCV I_07鼠标画笔 setMouseCallback()

来源:互联网 发布:邬桑为什么哭 知乎 编辑:程序博客网 时间:2024/06/06 00:02

目标

• 学习使用 OpenCV 处理鼠标事件

• 你将要学习的函数是:cv2.setMouseCallback()


鼠标事件 :cv2.setMouseCallback()

cv2_EVENT_MOUSEMOVE 0 滑动 
cv2_EVENT_LBUTTONDOWN 1 左键点击 
cv2_EVENT_RBUTTONDOWN 2 右键点击 
cv2_EVENT_MBUTTONDOWN 3 中间点击 
cv2_EVENT_LBUTTONUP 4 左键释放 
cv2_EVENT_RBUTTONUP 5 右键释放 
cv2_EVENT_MBUTTONUP 6 中间释放 
cv2_EVENT_LBUTTONDBLCLK 7 左键双击 
cv2_EVENT_RBUTTONDBLCLK 8 右键双击 
cv2_EVENT_MBUTTONDBLCLK 9 中间释放

cv2_EVENT_FLAG_LBUTTON 1 左键拖拽  
cv2_EVENT_FLAG_RBUTTON 2 右键拖拽  
cv2_EVENT_FLAG_MBUTTON 4 中间拖拽  
cv2_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件  
cv2_EVENT_FLAG_SHIFTKEY 16  (16~31)按Shift不放事件  
cv2_EVENT_FLAG_ALTKEY 32  (32~39)按Alt不放事件(后面8-39还有待研究)

实例1 :双击左键画圆圈 

用到的EVENT为:cv2_EVENT_LBUTTONDBLCLK

所有的鼠标事件回调函数都有一个统一的格式,他们所不同的地方仅仅是
被调用后的功能。我们的鼠标事件回调函数只用做一件事:在双击过的地方绘
制一个圆圈。下面是代码,不懂的地方可以看看注释。

import cv2import numpy as np import timeimg=cv2.imread('PIC/000.jpg') #读取图片作为背景#定义画圆事件,如果事件双击左键发生#则以此时双击的点为原点画一个半径为100px BGR为(255,255,0)粗细为3px的圆圈def draw_circle(event,x,y,flags,param): if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),100,(255,255,0),3)# 创建图像与窗口并将窗口与回调函数绑定cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle)while(1):cv2.imshow('image',img)if cv2.waitKey(100) == ord('q'):#等待100毫秒 刷新一次显示图像breakcv2.destroyAllWindows()


运行结果:



实例2

现在我们来创建一个更好的程序。这次我们的程序要完成的任务是根据我
们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以
我们的回调函数包含两部分,一部分画矩形,一部分画圆圈。这是一个典型的
例子他可以帮助我们更好理解与构建人机交互式程序,比如物体跟踪,图像分
割等。
下面我们要把这个回调函数与 OpenCV 窗口绑定在一起。在主循环中我
们需要将键盘上的“m”键与模式转换绑定在一起。

import cv2import numpy as np import timeimg=cv2.imread('PIC/000.jpg')# 当鼠标按下时变为Truedrawing=False# 如果mode 为true 绘制矩形。按下'm' 变成绘制曲线。mode=Trueix,iy=-1,-1# 创建回调函数def draw_circle(event,x,y,flags,param):global ix,iy,drawing,mode# 当按下左键是返回起始位置坐标if event==cv2.EVENT_LBUTTONDOWN:drawing=Trueix,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:# 绘制圆圈,小圆点连在一起就成了线cv2.circle(img,(x,y),3,(0,0,255),-1)# 当鼠标松开停止绘画。elif event==cv2.EVENT_LBUTTONUP:drawing==Falsecv2.namedWindow('image')cv2.setMouseCallback('image',draw_circle)while(1):cv2.imshow('image',img)k=cv2.waitKey(1)&0xFFif k==ord('m'):mode=not modeelif k==ord('q'):break


运行结果:




全部代码:

'''函数:cv2.setMouseCallback()'''import cv2import numpy as np import timeimg=cv2.imread('PIC/000.jpg')def draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),100,(255,255,0),3)cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle)while(1):cv2.imshow('image',img)if cv2.waitKey(100) == ord('q'):#等待100毫秒 刷新一次显示图像breakcv2.destroyAllWindows()# 当鼠标按下时变为Truedrawing=False# 如果mode 为true 绘制矩形。按下'm' 变成绘制曲线。mode=Trueix,iy=-1,-16# 创建回调函数def draw_circle(event,x,y,flags,param):global ix,iy,drawing,mode# 当按下左键是返回起始位置坐标if event==cv2.EVENT_LBUTTONDOWN:drawing=Trueix,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:# 绘制圆圈,小圆点连在一起就成了线cv2.circle(img,(x,y),3,(0,0,255),-1)# 当鼠标松开停止绘画。elif event==cv2.EVENT_LBUTTONUP:drawing==Falseimg=cv2.imread('PIC/000.jpg')cv2.namedWindow('image')cv2.setMouseCallback('image',draw_circle)while(1):cv2.imshow('image',img)k=cv2.waitKey(1)&0xFFif k==ord('m'):mode=not modeelif k==ord('q'):break











0 0
原创粉丝点击