OpenCV 4计算机视觉:Python语言实现(原书第3版)
上QQ阅读APP看书,第一时间看更新

2.2.7 在窗口中显示摄像头帧

OpenCV允许使用namedWindow、imshow和destroyWindow函数来创建、重新绘制和注销指定的窗口。此外,任何窗口都可以通过waitKey函数捕获键盘输入,通过setMouseCallback函数捕获鼠标输入。我们来看一个例子,展示从实时摄像头获取的帧:

waitKey的参数是等待键盘输入的毫秒数,默认情况下为0,这是一个特殊的值,表示无穷大。返回值可以是-1(表示未按下任何键),也可以是ASCII键码(如27表示Esc)。有关ASCII键码的列表,请参阅http://www.asciitable.com/。另外,请注意Python提供了一个标准函数ord,可以将字符转换成ASCII键码。例如,ord('a')返回97。

同样,请注意,OpenCV的窗口函数和waitKey是相互依赖的。OpenCV窗口只在调用waitKey时更新。相反,waitKey只在OpenCV窗口有焦点时才捕捉输入。

传递给setMouseCallback的鼠标回调应有5个参数,如代码示例所示。把回调的param参数设置为setMouseCallback的第3个可选参数,默认情况下为0。回调的事件参数是以下操作之一:

·cv2.EVENT_MOUSEMOVE:这个事件指的是鼠标移动。

·cv2.EVENT_LBUTTONDOWN:这个事件指的是按下左键时,左键向下。

·cv2.EVENT_RBUTTONDOWN:这个事件指的是按下右键时,右键向下。

·cv2.EVENT_MBUTTONDOWN:这个事件指的是按下中间键时,中间键向下。

·cv2.EVENT_LBUTTONUP:这个事件指的是释放左键时,左键回到原位。

·cv2.EVENT_RBUTTONUP:这个事件指的是释放右键时,右键回到原位。

·cv2.EVENT_MBUTTONUP:这个事件指的是释放中间键时,中间键回到原位。

·cv2.EVENT_LBUTTONDBLCLK:这个事件指的是双击左键。

·cv2.EVENT_RBUTTONDBLCLK:这个事件指的是双击右键。

·cv2.EVENT_MBUTTONDBLCLK:这个事件指的是双击中间键。

鼠标回调的flag参数可能是以下事件的一些按位组合:

·cv2.EVENT_FLAG_LBUTTON:这个事件指的是按下左键。

·cv2.EVENT_FLAG_RBUTTON:这个事件指的是按下右键。

·cv2.EVENT_FLAG_MBUTTON:这个事件指的是按下中间键。

·cv2.EVENT_FLAG_CTRLKEY:这个事件指的是按下Ctrl键。

·cv2.EVENT_FLAG_SHIFTKEY:这个事件指的是按下Shift键。

·cv2.EVENT_FLAG_ALTKEY:这个事件指的是按下Alt键。

可是,OpenCV不提供任何手动处理窗口事件的方法。例如,单击窗口关闭按钮不能停止应用程序。因为OpenCV的事件处理和GUI功能有限,许多开发人员更喜欢将其与其他应用程序框架集成。在本章的2.4节中,我们将设计一个抽象层来帮助OpenCV与应用程序框架集成。