当前位置: 代码迷 >> 综合 >> OpenCV处理鼠标事件
  详细解决方案

OpenCV处理鼠标事件

热度:43   发布时间:2024-03-07 12:42:21.0

使用工具:Python3.5
涉及包:cv2
函数:cv2.setMouseCallback()

简单的程序,在图片上双击过的位置绘制一个圆圈
1.创建鼠标事件回调函数,当鼠标事件发生时就会被执行。
比如左键按下,松开,左键双击等。可以通过鼠标事件获得相对应的图片上的坐标,根据这些信息可以做想做的事。所有鼠标事件回调函数都有一个统一的格式,不同的地方是被调用后的功能。

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

功能实现

import cv2
import numpy as np# mouse callback functiondef 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'):#按q键退出break
cv2.destroyAllWindows()

高级点程序
根据我们选择的模式在拖动鼠标时绘制矩形。所以回调函数包含两个部分。

import cv2
import numpy as np
#当鼠标按下时为True
drawing = False
#如果mode为true时绘制矩形,按下'm'变成绘制曲线
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 = 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:#绘制圆圈,小圆点连在一起就成了线,3代表笔画的粗细cv2.circle(img,(x,y),3,(0,0,255),-1)#当鼠标松开时停止绘图elif event ==cv2.EVENT_LBUTTONUP:drawing == False'''
下面把回调函数与OpenCV窗口绑定在一起,在主循环中奖'm'键与模式转换绑定在一起
'''
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 modeelif k==ord('q'):break
cv2.destroyAllWindows()