这是我参与更文挑战的第25天,活动详情查看: 更文挑战
OpenCV
是一个C++
库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块。在Python
中常使用OpenCV
库实现图像处理。
本文将介绍如何在Python3
中使用OpenCV
实现鼠标操作。
鼠标事件
鼠标事件作为人与计算机的交互式操作,使用起来非常方便,符合很多人的操作习惯。
其Opencv
源代码的函数形式如下:
void cv::setMouseCallback( const String & winname,MouseCallback onMouse,void * userdata = 0 )
复制代码
-
代码功能
:为指定的窗口设置鼠标处理程序。 -
winname
:窗口的名字,指定为哪个窗口设置鼠标处理程序。 -
onMouse
:鼠标回调函数,当鼠标事件发生时,调用该函数。如鼠标左键按下时,做什么事情,该回调函数自己根据需要编写。 -
userdata
:传递给回调的可选参数。默认为0。
创建鼠标回调函数具有特定的格式,在任何地方都是相同的,它仅在功能方面有所不同。
回调函数形如:def callback(event,x,y,flags,param)
event
:鼠标事件。x,y
: 当前鼠标对应的坐标。flags
: 是CV_EVENT_FLAG
的组合。param
: 用户自定义传入的参数。
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 cv2
import numpy as np
#新建图片
img=np.zeros((500,500))
#定义回调函数,此处只用到了event,x,y三个参数
def draw_circle(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
#画圆函数,参数分别表示原图、坐标、半径、颜色、线宽(若为-1表示填充)
cv2.circle(img,(x,y),20,255,-1)
cv2.namedWindow('img')
#新建鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
cv2.imshow('img',img)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
复制代码
输出为:
画矩形
下面通过一个简单的案例来实现鼠标画矩形操作。
代码如下:
import cv2
import numpy as np
drawing = False
ix,iy = -1,-1#鼠标初始化位置
#编写回调函数,鼠标画矩形
def mouse_draw(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img,(ix,iy),(x,y),(255,0,0),1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('img')
cv2.setMouseCallback('img',mouse_draw)
while(1):
cv2.imshow('img',img)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
复制代码
输出为:
本月将陆续推出相关系列文章,
篇篇精彩,尽请关注。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END