【Python3-OpenCV】鼠标操作

522 阅读3分钟

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

OpenCV是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块。在Python中常使用OpenCV库实现图像处理。

image.png

本文将介绍如何在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()

输出为:

image.png

画矩形

下面通过一个简单的案例来实现鼠标画矩形操作。

代码如下:

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

输出为:

image.png

本月将陆续推出相关系列文章,

篇篇精彩,尽请关注。