OpenCV鼠标事件处理详解:回调函数与常用事件解析
本文详细介绍OpenCV中鼠标事件的处理机制,重点讲解cv2.setMouseCallback函数的语法与参数。通过示例代码演示如何绑定窗口与响应函数,实现双击画圆、拖拽画矩形等交互功能,并列出所有支持的鼠标事件常量,帮助开发者快速掌握图像交互编程。
鼠标事件是指触发鼠标按钮后程序所做出的相应反应,且该过程不会阻塞主线程。这种机制类似于异步处理:即使不按下鼠标,程序也能正常执行后续代码;而当鼠标事件发生时,系统会调用相应的响应函数。这种“一边运行一边等待”的模式确保了程序的流畅性。
为了实现鼠标操作与画面显示的绑定,我们需要创建一个回调函数。
cv2.setMouseCallback函数语法
cv2.setMouseCallback(img,onMouse)
cv2.setMouseCallback函数参数解释:
img:指定需要绑定鼠标事件的窗口名称。
onMouse:指定响应函数,即当鼠标事件触发时将被调用的用户自定义函数。
示例代码:
cv2.setMouseCallback('image',draw_circle)
举个例子:
当在画面内单击鼠标时,会触发draw_circle函数。该函数作为响应函数,其功能是绘制一个圆形。通过调用此函数,我们成功实现了画面窗口与回调函数的绑定。
011-2-鼠标事件
查看所有被支持的鼠标事件:
import cv2 events = [i for i in dir(cv2) if 'EVENT' in i] print(events)
程序显示的鼠标事件:
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
回调函数
在OpenCV中没有预设的通用回调函数,需要开发者自行编写。回调函数的标准模板如下:
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
函数分析:
代码第一行定义了函数名draw_circle及其参数。其中,event参数表示触发该函数的具体事件类型;x和y参数表示鼠标指针在图像中的像素坐标;后续两个参数(flags和param)在此处暂不使用。
代码第二行进行事件判断,如果检测到指定事件发生,则执行第三行的绘图代码。
下面我们来通过双击鼠标左键画一个圆:
import cv2
import numpy as np
#设置回调函数
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
#创建图像与窗口并将窗口与回调函数进行绑定
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(1)&0xFF == ord('q'):
break
cv2.destroyAllWindows()
结果:

在通过拖动鼠标画一个矩形:
import cv2
import numpy as np
#按下鼠标时为True
drawing = False
#当mode为true时绘制矩形,按下m后mode变成false,用来绘制曲线
mode = True
ix,iy=-1,-1
#设置回调函数
def draw_circle(event,x,y,flags,param):
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:
#绘制圆圈,圆点连成线,3代表笔的粗细
cv2.circle(img,(x,y),3,(0,255,0),-1)
#当松开鼠标时停止绘制
elif event == cv2.EVENT_LBUTTONUP:
drawing ==False
#创建图像与窗口并将窗口与回调函数进行绑定
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1)
if k == ord('m'):
mode=not mode
elif k == ord('q'):
break
elif k == ord('r'):
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
cv2.destroyAllWindows()
结果:

到此这篇关于详解OpenCV中简单的鼠标事件处理的文章就介绍到这了,更多相关OpenCV鼠标事件处理内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









