
上QQ阅读APP看书,第一时间看更新
2.4.2 基于managers.WindowManager提取窗口和键盘
正如我们所见,OpenCV提供了一些函数用于创建、撤销窗口,显示图像以及处理事件。这些函数不是窗口类的方法,因而要求将窗口名称作为参数传递。因为这个接口不是面向对象的,所以与OpenCV的一般风格不一致。而且,它不太可能与我们最终想要使用的(而不是OpenCV的)其他窗口或者事件处理接口兼容。
为了面向对象和适应性,我们将这个功能抽象成具有createWindow、destroy Window、show和processEvents方法的WindowManager类。作为一个属性,WindowManager有一个名为keypressCallback的函数,在响应按键时可以从processEvents调用(如果不是None的话)。keypressCallback对象必须是一个接受单个参数(尤其是ASCII键码)的函数。
我们将WindowManager的实现添加到managers.py。该实现首先定义下列类声明和__init__方法:

该实现接着使用下面的方法来管理窗口及其事件的生命周期:

当前的实现只支持键盘事件,对于Cameo足够了。但是,我们也可以修改Window Manager来支持鼠标事件。例如,类接口可以扩展为包含mouseCallback属性(和可选的构造函数参数),但是其他方面保持不变。使用OpenCV之外的事件框架,我们可以通过添加回调属性以同样的方式支持其他事件类型。