OpenCV捕获摄像头并进行录像、截图等功能的实现

本文主要介绍一个小项目,此项目实现了对于摄像头画面的捕捉以及,对于画面的截取和一段画面的存储和处理的功能
我们将采用三个类来进行实现
1 CaptureManager类:
提取视频流
实现进入画面,退出画面(获取图像、估计帧速率、通过窗口管理器显示图像、暂停、写入图像)
2 WindowManager类:
抽象窗口和键盘
进行窗口的管理(初始化、 创建、展示、 释放)
3 Cameo 类:
进行初始化、运行(主循环捕获图像、显示图像 会调用到CaptureManager类中的方法)、触发事件(调用 Windows类中的方法)

import cv2
import numpy
import time
# fps frames per second   每秒传输的帧数class CaptureManager(object):# 进入画面# 退出画面(绘制到窗口,写入文件, 释放帧)# 写入图像# 开始录像 (捕获摄像头的画面)# 停止录像 存储录像
# args:
#     capture:VideoCapture 对象, 用于读取视频文件或者 捕捉摄像头图像(capture = cv2.VideoCapture(0))
#     preview_window_manager: 预处理窗口管理器 若设置了该参数则会在调用 enterFrame()
#       函数的时候将捕获的图像显示在指定的窗体上
#     should_mirror_preview:是否在指定窗口上镜像显示(水平翻转)def __init__(self, capture, previewWindowManager = None,shouldMirrorPreview = False):# mirrorPreview 进行镜面反转self.previewWindowManager = previewWindowManagerself.shouldMirrorPreview = shouldMirrorPreview#定义私有属性# 属性加单下划线或者双下划线可以表示私有变量self._capture = captureself._channel = 0self._enteredFrame = Falseself._frame = Noneself._imageFileName = Noneself._videoFileName = Noneself._videoEncoding = Noneself._videoWriter = None#摄像头调用   通道和帧的设置   图像文件 以及 视频文件self._startTime = Noneself._frameElapsed = int(0)self._fpsEstimate = None@property # 只读属性#内置的@property装饰器Python负责将一种方法转换为属性调用。def channel(self):return self.channel@channel.setterdef channel(self, value):if self._channel !=value:self._channel =valueself._frame = None@propertydef frame(self):if self._enteredFrame and self._frame is None:_, self._frame = self._capture.retrieve()# retrieve 适用于多个摄像头进行同步return self._frame@propertydef isWritingImage(self):return self._imageFileName is not None@propertydef isWritingVideo(self):return self._videoFileName is not Nonedef enterFrame(self):# 检测之前是不是有其他的帧还未退出assert not self._enteredFrame,\"previous enterFrame() had no matching exitFrame()"if self._capture is not None:#捕获帧self._enteredFrame = self._capture.grab()def exitFrame(self):"""绘制到窗口  写入文件  释放帧"""#检测是否还有其他的帧是可以获取的# the getter 可以检索并取回帧if self.frame is None:self._enteredFrame = Falsereturn#更新帧速度估算值以及相关变量if self._frameElapsed == 0:self._startTime = time.time()else:timeElaspsed = time.time() - self._startTimeself._fpsEstimate = self._frameElapsed / timeElaspsedself._frameElapsed += 1# 如果指定了窗口管理器,则在窗口中显示图像if self.previewWindowManager is not None:if self.shouldMirrorPreview:  # 想要返回镜像mirroredFrame = numpy.fliplr(self._frame).copy()# 使得矩阵x沿着垂直轴左右进行翻转self.previewWindowManager.show(mirroredFrame)else:self.previewWindowManager.show(self.frame)#是否指定图片路径,将图片写入到文件中if self.isWritingImage:cv2.imwrite(self._imageFileName, self._frame)self._imageFileName = None#将每一帧图像写到视频文件中self._WriteVideoFrame()  #_WriteVideoFrame# 清空标志位 释放帧self._frame = Noneself._enteredFrame = False# 指定录入的图像路径def writeImage(self, filename):"""指定每一帧图像的写入路径, 实际的写入操作会推迟到"下一次调用exitFrame 函数"""self._imageFilename = filenamedef startWritingVideo(self, filename,encoding = cv2.VideoWriter_fourcc("I", "4", "2", "0")):self._videoFileName = filenameself._videoEncoding = encoding#结束录制def stopWritingVideo(self):self._videoEncoding = Noneself._videoFilename = Noneself._videoWriter = None
# 录制视频  非公有函数def _WriteVideoFrame(self):if not self.isWritingVideo:returnif self._videoWriter is None:fps = self._capture.get(cv2.CAP_PROP_FPS)if fps == 0.0:if self._framesElapsed < 20:# 等待直到更多的帧经过 ,这样的话估算就比较容易和合适returnelse:fps = self._fps_Estimatesize = (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)
class WindowManager(object):
#创建窗体   绑定触发事件def __init__(self, windowName, keypressCallback = None):self.keypressCallback = keypressCallbackself._windowName = windowNameself._isWindowCreated = Falsedef show(self, frame):cv2.imshow(self._windowName, frame)@propertydef isWindowCreated(self):return self._isWindowCreateddef createWindow(self):cv2.namedWindow(self._windowName)self._isWindowCreated = Truedef destroyWindow(self):cv2.destroyWindow(self._windowName)self._isWindowCreated = Falsedef processEvents(self):keycode = cv2.waitKey(1)if self.keypressCallback is not None and keycode != -1:keycode &= 0xFFself.keypressCallback(keycode)
import cv2
from managers import WindowManager, CaptureManager
import filtersclass Cameo(object):def __init__(self):self._windowManager = WindowManager("Cameo", self.onKeypress)self._CaptureManager = CaptureManager(cv2.VideoCapture(0), self._windowManager, True)#self._curveFilter = filters.BGRPortraCurveFilter()def run(self):" 进行主循环"self._windowManager.createWindow()while self._windowManager.isWindowCreated:self._CaptureManager.enterFrame()frame = self._CaptureManager.frame# 过滤帧filters.strokeEdges(frame, frame)#self._curveFilter.apply(frame, frame)self._CaptureManager.exitFrame()self._windowManager.processEvents()def onKeypress(self, keycode):""" 对特殊的按键 进行相应"""if keycode == 32: #空格self._CaptureManager.writeImage("screenhot.png")elif keycode == 9: # tabif not self._CaptureManager.isWritingVideo:self._CaptureManager.startWritingVideo("screencast.avi")else:self._CaptureManager.stopWritingVideo()elif keycode == 27:self._windowManager.destroyWindow()if __name__ =="__main__":c1 =  Cameo()c1.run()

OpenCV捕获摄像头并进行录像、截图等功能的实现相关推荐

  1. python人脸识别截图_Python OpenCV调用摄像头检测人脸并截图

    本文实例为大家分享了Python OpenCV调用摄像头检测人脸并截图的具体代码,供大家参考,具体内容如下 注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarc ...

  2. OpenCV~捕获摄像头 帧率fps和waitkey函数 问题

    本文分析在使用OpenCV捕获摄像头时发现的两个问题: 使用capture.get(CV_CAP_PROP_FPS)方法获取帧率为0! waitKey()函数有几个作用?改变它的参数大小会影响计算得到 ...

  3. 使用OpenCV调用摄像头检测人脸并截图-Python

    注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarcascade_frontalface_alt.xml,模型可在https://github.com/Time ...

  4. buildroot+qt+qcamrea+opencv打开摄像头进行拍照录像保存功能

    相关参考 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能_爱写代码的自由人-CSDN博客_ffmpeg 摄像头 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术. ...

  5. python调用摄像头录制视频_Python OpenCV使用摄像头捕获视频

    我们知道,OpenCV是一款强大的跨平台的计算机视觉库,使用它能完成我们对于图像和视频处理的很多功能,今天,我们使用OpenCV来捕获计算机摄像头的视频. 使用OpenCV捕获摄像头视频 我们知道,视 ...

  6. AI 质检学习报告——实践篇——第三步:python利用OpenCV打开摄像头截图后实现图片识字

    AI 质检学习报告--实践篇--第一步:python利用OpenCV打开摄像头并截图 AI 质检学习报告--实践篇--第二步:实现图片识字 前边两篇实践已经分别实现了利用OpenCV打开摄像头并截图和 ...

  7. AI 质检学习报告——实践篇——第一步:python利用OpenCV打开摄像头并截图

    写在前边 想要做一个AI质检的项目,一点一点来,首先:python利用OpenCV打开摄像头并拍照. 效果 设摄像头像素不咋地,实际的产品肯定不会是这个像素,必须安排一个专业的. 实现代码 impor ...

  8. python opencv打开摄像头,截图保存

    python opencv打开摄像头,截图保存,学习结果如下: 使用python打开摄像头 import cv2 cap = cv2.VideoCapture(0) #设置摄像头 0是默认的摄像头 如 ...

  9. python使用opencv调取摄像头捕获图片或视频通用模板

    之前一直不清楚opencv调用摄像头的具体方法,于是参考b站视频写了个通用模板,以后可以根据需要自行调整.视频链接 先定义图片和视频的保存路径 img_path = './img_video/test ...

最新文章

  1. 如何1秒内向Sql Server插入几万条数据
  2. nagios中自己写的监控mysql主从复制的插件
  3. android webview参数,Android webView解析URL参数
  4. S3C6410 裸机硬件JPEG解码(转)
  5. ppz css栅格框架
  6. java 不存在就创建,java怎么实现判断文件是否存在,不存在就创建的方法
  7. 《计算机网络:自顶向下方法(原书第6版)》一2.7 TCP套接字编程
  8. elasticsearch备份与恢复4_使用ES-Hadoop将ES中的索引数据写入HDFS中
  9. 12月第三周各国域名总量榜:中国729万居全球第二
  10. 力扣-455 分发饼干
  11. python学习第二天标准输入输出和注释用法
  12. 1/4-36UNS-2A的螺纹
  13. elasticsearch单机版安装及安装过程踩的坑整理
  14. Choerodon猪齿鱼1.0先行版已发布!
  15. 如何比对excel表格两列数据中的相同部分或重复部分
  16. 组件分享之后端组件——用Go编写的IMAP4rev1库go-imap
  17. 计算机接口图形,图形设备接口
  18. 医院排队叫号系统(JAVA版)
  19. 土地资源管理考研资料分享
  20. 20210729-Codeforces Round #735 (Div. 2)

热门文章

  1. SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
  2. 重写boost内存池
  3. Java基础求质数——接收用户输入的数字,判断是否为质数
  4. R语言基于R6的面向对象编程
  5. windows+vscode搭建远程linux开发环境
  6. java中输入语句是怎么写的
  7. 计算机能思考吗?图1专题9:“计算机会不会有创造力?”
  8. Jgit基础教程(Java调用git)
  9. 语音信号处理论文优选:神农Shennong: a Python toolbox for audio speech features extraction​
  10. 姚期智:呼之欲出的量子计算机,和它漫长的最后一英里(全文)