【Python+OpenCV入门学习】六、鼠标操作

本篇文章,将学习如何进行鼠标操作。主要学习函数setMouseCallback()使用。

环境:Windows 7(64)   python 3.6    opencv 3.4.2

一、了解函数setMouseCallback()

鼠标作为交互式操作,使用起来友好,符合很多人的操作习惯。所以本次学习鼠标的操作。函数形式如下:

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()

代码运行结果如下图所示:   

                               

猜你喜欢

转载自blog.csdn.net/qq_18995069/article/details/83003700
今日推荐