OpenCV计算机视觉(Python实现)-2:Cameo项目

书名:《OpenCV 3计算机视觉:Python语言实现(原书第2版)》

Cameo项目

此程序能显示摄像头帧、监听键盘输入以及记录截图或截屏。

managers.py

# 使用managers.CaptureManager提取视频流
import numpy
import cv2
import time
# 增加要导入的包、构造函数和属性值
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
        self._imageFilename = None
        self._videoFilename = None
        self._videoEncoding = None
        self._videoWriter = None

        self._startTime = None
        self._framesElapsed = int(0)
        self._fpsEstimate = None
    @property
    def channel(self):
        return self._channel
    @channel.setter
    def channel(self, value):
        if self._channel != value:
            self._channel = value
            self._frame = None
    @property
    def frame(self):
        if self._enteredFrame and self._frame is None:
            _, self._frame = self._capture.retrieve()
        return self._frame
    @property
    def isWritingImage(self):
        return self._imageFilename is not None
    @property
    def isWritingVideo(self):
        return self._videoFilename is not None

    def enterFrame(self):
        assert not self._enteredFrame, 'previous enterFrame() had no matching exitFram()'
        if self._capture is not None:
            self._enteredFrame = self._capture.grab()
    def exitFrame(self):
        if self.frame is None:
            self._enteredFrame = False
            return
        if self._framesElapsed == 0:
            self._startTime = time.time()
        else:
            timeElapsed = time.time() - self._startTime
            self._fpsEstimate = self._framesElapsed / timeElapsed
        self._framesElapsed += 1
        if self.previewWindowManager is not None:
            if self.shouldMirrorPreview:
                mirroredFrame = numpy.fliplr(self._frame).copy()
                self.previewWindowManager.show(mirroredFrame)
            else:
                self.previewWindowManager.show(self._frame)
        if self.isWritingImage:
            cv2.imwrite(self._imageFilename, self._frame)
            self._imageFilename = None
        self._writerVideoFrame()
        self._frame = None
        self._enteredFrame = False

    def writeImage(self, filename):
        self._imageFilename = filename
    def startWritingVideo(self, filename, encoding = cv2.VideoWriter_fourcc('I', '4', '2', '0')):
        self._videoFilename = filename
        self._videoEncoding = encoding
    def stopWritingVideo(self):
        self._videoFilename = None
        self._videoEncoding = None
        self._videoWriter = None
    def _writerVideoFrame(self):
        if not self.isWritingVideo:
            return
        if self._videoWriter is None:
            fps = self._capture.get(cv2.CAP_PROP_FPS)
            if fps == 0.0:
                if self._framesElapsed < 20:
                    return
                else:
                    fps = self._fpsEstimate
            size = (int(self._capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
                    int(self._capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
            self._videoWriter = cv2.VideoWriter(self._videoFilename, self._videoEncoding,fps,size)
            self._videoWriter.write(self._frame)

 

# 使用managers.WindowManager抽象窗口和键盘
class WindowManager(object):
    # 实现支持键盘事件
    def __init__(self, windowName, keypressCallback = None):
        self.keypressCallback = keypressCallback
        self._windowName = windowName
        self._isWindowCreated = False
    @property
    def isWindowCreated(self):
        return self._isWindowCreated
    def createWindow(self):
        cv2.namedWindow(self._windowName)
        self._isWindowCreated = True
    def show(self, frame):
        cv2.imshow(self._windowName, frame)
    def destoryWindow(self):
        cv2.destroyWindow(self._windowName)
        self._isWindowCreated = False
    def processEvents(self):
        keycode = cv2.waitKey(1)
        if self.keypressCallback is not None and keycode != -1:
            keycode &= 0xFF
            self.keypressCallback(keycode)

 

 

 

cameo.py

按空格键可获取截图信息,按tab键可启动/停止截屏(一个视频记录),按Esc键可退出应用程序。

 

import cv2
from Chapter2 import WindowManager, CaptureManager
class Cameo(object):
    def __init__(self):
        self._windowManager = WindowManager('Cameo', self.onKeypress)
        self._captureManager = CaptureManager(cv2.VideoCapture(0), self._windowManager, True)
    def run(self):
        self._windowManager.createWindow()
        while self._windowManager.isWindowCreated:
            self._captureManager.enterFrame()
            frame = self._captureManager.enterFrame
            self._captureManager.exitFrame()
            self._windowManager.processEvents()
    def onKeypress(self,keycode):
        if keycode == 32:  # space
            self._captureManager.writeImage('screenshot.png')
        elif keycode == 9:  # tab
            if not self._captureManager.isWritingVideo:
                self._captureManager.startWritingVideo('screenshot.avi')
            else:
                self._captureManager.stopWritingVideo()
        elif keycode == 27:    # escape
            self._windowManager.destoryWindow()
if __name__ == "__main__":
    Cameo().run()

 

有几个bug根据我的理解改了一下,

 

这里有一个问题就是,保存视频的时候时间过短?是不是我改代码的时候改成这样的,存个疑问!

 

 

 

 

OpenCV 3计算机视觉 Python语言实现(第二版)(含示例代码) 编辑推荐 OpenCV 3是一种*先进的计算机视觉库,它提供了很多图像和视频处理操作,以及一些代表计算机视觉未来发展方向的功能,如人脸识别或目标跟踪。学习计算机视觉算法、模型和OpenCV API的基本概念之后,可以开发各种现实生活中的应用程序(如安全和监控方面的应用程序)。 本书从图像处理的基本操作出发,带你开启先进计算机视觉的探索之旅。计算机视觉是一个快速发展的学科,与其相关的现实应用也呈爆炸性增长,本书的目的就是帮助计算机视觉领域的新手和想要了解全新的OpenCV 3.0.0的计算机视觉专家快速掌握基于PythonOpenCV计算机视觉开发的实用方法、技巧和*佳实践。 通过阅读本书,你将学到:   安装和熟练使用基于PythonOpenCV 3的API   掌握图像处理和视频分析的基础知识   在图像和视频中检测和识别目标   使用OpenCV检测和识别人脸   训练和使用自己的对象分类器   了解计算机视觉中的机器学习概念   使用OpenCV的人工神经网络来解决实际问题   开发现实生活中的计算机视觉应用 内容简介 OpenCV是开源、跨平台的计算机视觉库,由英特 尔公司发起并参与开发,在商业和研究领域中可以免费使用。本书介绍了如何通过Python来开发基于OpenCV 3.0的应用。作为当前非常流行的动态语言之一,Python不仅使用非常简单,而且功能强大。通过Python来学习OpenCV框架,可以让你很快理解计算机视觉的基本概念以及重要算法。 本书分8章来介绍计算机视觉的重要概念,所有的概念都融入了一些很有趣的项目。本书首先详细介绍了多个平台下基于PythonOpenCV安装,继而介绍了计算机视觉应用的基本操作,包括图像文件的读取与显示,图像处理的基本操作(比如边缘检测等),深度估计与分割,人脸检测与识别,图像的检索,目标的检测与识别,目标跟踪,神经网络的手写体识别。可以这样说,本书是一本不可多得的采用OpenCV实践计算机视觉应用的好书。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故沉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值