本篇文章,将学习如何进行鼠标操作。主要学习函数setMouseCallback()使用。
环境:Windows 7(64) python 3.6 opencv 3.4.2
鼠标作为交互式操作,使用起来友好,符合很多人的操作习惯。所以本次学习鼠标的操作。函数形式如下:
void cv::setMouseCallback( const String & winname,MouseCallback onMouse,void * userdata = 0 )
功能:为指定的窗口设置鼠标处理程序。
参数:
winname:窗口的名字,指定为哪个窗口设置鼠标处理程序。
onMouse:鼠标回调函数,当鼠标事件发生时,调用该函数。如鼠标左键按下时,做什么事情,该回调函数自己根据需要编写。
userdata:传递给回调的可选参数。默认为0。
创建鼠标回调函数具有特定的格式,在任何地方都是相同的,它仅在功能方面有所不同。显然,我们知道鼠标操作很多,如左右键单击或双击等,有多个事件,OpenCV提供了如下的事件类型,红色部分是常用的几个:
cv.EVENT_MOUSEMOVE:表示鼠标指针已在窗口上移动。
cv.EVENT_LBUTTONDOWN:表示按下了鼠标左键。
cv.EVENT_RBUTTONDOWN:表示按下了鼠标右键。
cv.EVENT_MBUTTONDOWN:表示按下鼠标中键。
cv.EVENT_LBUTTONUP:表示已释放鼠标左键。
cv.EVENT_RBUTTONUP:表示已释放鼠标右键。
cv.EVENT_MBUTTONUP:表示中鼠标按钮被释放。
cv.EVENT_LBUTTONDBLCLK:表示双击鼠标左键。
cv.EVENT_RBUTTONDBLCLK:表示双击鼠标右键。
cv.EVENT_MBUTTONDBLCLK:表示双击鼠标中键。
cv.EVENT_MOUSEWHEEL:正值和负值分别表示向前和向后滚动。
cv.EVENT_MOUSEHWHEEL:正值和负值分别表示向右和向左滚动。
鼠标操作中,主要的是回调函数的编写,即当某个鼠标事件发生时做什么事。我们编程实现鼠标单击左键时画个固定大小的白色实心圆。代码如下:
import numpy as np
import cv2 as cv
#先编写好回调函数
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDOWN:
cv.circle(img,(x,y),50,(255,255,255),-1)
#创建一幅全黑图像
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
#按Esc退出循环
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
程序运行后,点击单击左键,会出现白色实心圆,按Esc可以退出程序,结果图如下:
在写一个例程,鼠标绘制矩形,代码如下:
import numpy as np
import cv2 as cv
drawing = False
ix,iy = -1,-1#鼠标初始化位置
#编写回调函数,鼠标画矩形
def mouse_draw(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_LBUTTONUP:
drawing = False
cv.rectangle(img,(ix,iy),(x,y),(255,0,0),1)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',mouse_draw)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
代码运行结果如下图所示: