2018-7-3
好几天没来了,上周五按照书中程序,手打一份代码跑了一下,今天分析总结一下。
实现的功能:
1、从摄像头读取视频流,将其在窗口中实时显示
2、使用键盘按键可以实现截图、录取视频、退出的功能
首先这个程序将视频I/O流代码与应用程序代码分离。
I/O流接口分为:CaptureManager类和WindowManager类
CaptureManager:读取新的帧,将帧分派到一个或多个输出中(如图想、视频和窗口)
WindowManager:以面向对象的形式处理窗口和事件
Cameo.py
import cv2, time
from managers import WindowManager, CaptureManager
class Cameo(object):
def __init__(self):
self._windowManager = WindowManager('Cameo', self.onKeypress)
self._captureManager = CaptureManager(cv2.VideoCapture(0), self._windowManager, True)
# self._t1 = None
# self._t2 = None
def run(self):
"""Running the main loop."""
self._windowManager.createWindow()
while self._windowManager.isWindowCreated:
# self._t1 = time.time()
self._captureManager.enterFrame()
frame = self._captureManager.frame
# TODO:Filter the frame
self._captureManager.exitFrame()
self._windowManager.processEvents()
# self._t2 = time.time()
# print(self._t2 - self._t1)
def onKeypress(self, keycode):
"""Handle a keypress.
space - > Take a screenshot.
tab - > Start/stop recording a screencast.
escape - > Quit.
"""
if keycode == 32: # space
self._captureManager.writeImage('screenshot.png')
elif keycode == 9: # table
if not self._captureManager.isWritingVideo:
print("2222")
self._captureManager.startWritingVideo('screencast111.avi')
else:
print("23333")
self._captureManager.stopWritingVideo()
elif keycode == 27: # escape
self._windowManager.destroyWindow()
if __name__ == "__main__":
Cameo().run()
- 定义初始化函数
__init__
,创建WindowManager、CaptureManager两个类的实例对象 - 定义
run
函数
(1)创建一个窗口
(2)执行循环:不停地捕获下一帧,存入文件,释放帧。也就是不停地调用enterFrame()
和exitFrame()
。同时不停扫描键盘输入。 - 定义
onKeypress
函数
① space(32):截屏
② tab(9):录视频
③escape(27):退出,关闭窗口
managers.py
class CaptureManager(object):
#####################
# 导入构造函数、属性值 #
#####################
def __init__(self, capture, previewWindowManager = None, shouldMirrorPreview = False):
self.previewWindowManager = previewWindowManager
self.shouldMirrorPreview = shouldMirrorPreview
# 前面有一个下划线_标示的为非公有变量
# '_'表示保护变量,只有类对象和子类对象中能访问这些变量
# '__'表示私有成员变量,只有类对象自己能访问,子类对象都不能访问
self._capture = capture
self._channel = 0
self._enteredFrame = False
self._frame = None