控制鼠标
cv2.setMouseCallback
是 OpenCV 提供的一个非常有用的函数,它允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。这在创建交互式应用程序时特别有用,比如图像标注工具、绘图程序等。
案例:
import cv2
#创建鼠标回调函数
def draw_test(event,x,y,flag,param):
print(x,y)
img = cv2.imread('images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
cv2.imshow('image', img)
# 等待用户按键
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
-
draw_test函数:
-
event
: 鼠标事件类型,如cv2.EVENT_LBUTTONDOWN
表示左键按下。 -
x
,y
: 鼠标事件发生时的坐标。 -
flags
: 额外的标志位,通常不用。 -
param
: 传递给回调函数的参数,通常不用。
-
cv2.setMouseCallback('image', draw_test)
设置鼠标回调函数,当在 'image' 窗口中发生鼠标事件时,调用 draw_circle
函数
案例:在图像上绘制圆形
import cv2
import numpy as np
#创建鼠标回调函数
def draw_test(event,x,y,flag,param):
global drawing
# cv2.EVENT_LBUTTONDOWN 鼠键左键按下事件
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
# cv2.EVENT_MOUSEMOVE 鼠键左键移动事件
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
cv2.circle(img,(x,y),15,(255,0,0),-1)
#cv2.EVENT_LBUTTONUP 鼠键左键释放事件
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.circle(img, (x, y), 15, (255, 0, 0), -1)
img= cv2.imread('../images/car.png')
cv2.namedWindow('image')
#设置鼠标回调函数
cv2.setMouseCallback('image', draw_test)
# 真正的标志,表示是否正在绘制
drawing = False
#永真循环,图像被绘制后显示图片,直到按下ESC键退出
while(True):
cv2.imshow('image', img)
if cv2.waitKey(20) == 27: # 按ESC退出
break
cv2.destroyAllWindows()