人机交互在物体跟踪、图像特征提取、图像分割等方面都有着广泛的应用。比如说,现在有一张图片,上面存在若干个空洞(数据缺失部分),为了将这些空洞部分提取出来,最简单的一种方法就是构建人机交互程序,首先显示该图片,然后由人手动地画方框来将这些空洞部分给圈出来。这种方法在数据量比较少的时候非常有效且准确。
要实现类似的这种人机交互功能,OpenCV里通常需要用到鼠标回调函数,即setMouseCallback(),下面首先对这个函数进行介绍,接着实现两个简单的人机交互程序。
setMouseCallback函数
1. 语法
- 原型
- 参数
参数 | 描述 |
---|---|
winname | 绑定的窗口名 |
onMouse | 鼠标的回调函数 |
userdata | 可选参数 |
与鼠标相关的事件及其说明,如下表:
事件(Event) | 说明 |
---|---|
EVENT_MOUSEMOVE | 滑动 |
EVENT_LBUTTONDOWN | 左键点击 |
EVENT_RBUTTONDOWN | 右键点击 |
EVENT_MBUTTONDOWN | 中键点击 |
EVENT_LBUTTONUP | 左键放开 |
EVENT_RBUTTONUP | 右键放开 |
EVENT_MBUTTONUP | 中键放开 |
EVENT_LBUTTONDBLCLK | 左键双击 |
EVENT_RBUTTONDBLCLK | 右键双击 |
EVENT_MBUTTONDBLCLK | 中键双击 |
EVENT_FLAG_LBUTTON | 左键拖拽 |
EVENT_FLAG_RBUTTON | 右键拖拽 |
EVENT_FLAG_MBUTTON | 中间拖拽 |
EVENT_FLAG_CTRLKEY | 按Ctrl不放事件 |
EVENT_FLAG_SHIFTKEY | 按Shift不放事件 |
EVENT_FLAG_ALTKEY | 按Alt不放事件 |
2. 例子
绘制填充的矩形或圆形
下面程序的功能是,根据选择的模式,绘制填充的矩形或圆形。更详细的说明见代码里的注释。
import cv2
import numpy as np
mode = True #画图模式,画圆形或矩形,True表示画圆形
drawing = False #当鼠标左键单击时变为True,即说明要开始绘图了
x0 = -1
y0 = -1
#定义鼠标响应函数,此函数绘制矩形或圆形
def draw_CirRec(event,x,y,flags,param):
global mode,drawing