OpenCV捕获摄像头并进行录像、截图等功能的实现
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捕获摄像头并进行录像、截图等功能的实现相关推荐
- python人脸识别截图_Python OpenCV调用摄像头检测人脸并截图
本文实例为大家分享了Python OpenCV调用摄像头检测人脸并截图的具体代码,供大家参考,具体内容如下 注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarc ...
- OpenCV~捕获摄像头 帧率fps和waitkey函数 问题
本文分析在使用OpenCV捕获摄像头时发现的两个问题: 使用capture.get(CV_CAP_PROP_FPS)方法获取帧率为0! waitKey()函数有几个作用?改变它的参数大小会影响计算得到 ...
- 使用OpenCV调用摄像头检测人脸并截图-Python
注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarcascade_frontalface_alt.xml,模型可在https://github.com/Time ...
- buildroot+qt+qcamrea+opencv打开摄像头进行拍照录像保存功能
相关参考 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能_爱写代码的自由人-CSDN博客_ffmpeg 摄像头 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术. ...
- python调用摄像头录制视频_Python OpenCV使用摄像头捕获视频
我们知道,OpenCV是一款强大的跨平台的计算机视觉库,使用它能完成我们对于图像和视频处理的很多功能,今天,我们使用OpenCV来捕获计算机摄像头的视频. 使用OpenCV捕获摄像头视频 我们知道,视 ...
- AI 质检学习报告——实践篇——第三步:python利用OpenCV打开摄像头截图后实现图片识字
AI 质检学习报告--实践篇--第一步:python利用OpenCV打开摄像头并截图 AI 质检学习报告--实践篇--第二步:实现图片识字 前边两篇实践已经分别实现了利用OpenCV打开摄像头并截图和 ...
- AI 质检学习报告——实践篇——第一步:python利用OpenCV打开摄像头并截图
写在前边 想要做一个AI质检的项目,一点一点来,首先:python利用OpenCV打开摄像头并拍照. 效果 设摄像头像素不咋地,实际的产品肯定不会是这个像素,必须安排一个专业的. 实现代码 impor ...
- python opencv打开摄像头,截图保存
python opencv打开摄像头,截图保存,学习结果如下: 使用python打开摄像头 import cv2 cap = cv2.VideoCapture(0) #设置摄像头 0是默认的摄像头 如 ...
- python使用opencv调取摄像头捕获图片或视频通用模板
之前一直不清楚opencv调用摄像头的具体方法,于是参考b站视频写了个通用模板,以后可以根据需要自行调整.视频链接 先定义图片和视频的保存路径 img_path = './img_video/test ...
最新文章
- 如何1秒内向Sql Server插入几万条数据
- nagios中自己写的监控mysql主从复制的插件
- android webview参数,Android webView解析URL参数
- S3C6410 裸机硬件JPEG解码(转)
- ppz css栅格框架
- java 不存在就创建,java怎么实现判断文件是否存在,不存在就创建的方法
- 《计算机网络:自顶向下方法(原书第6版)》一2.7 TCP套接字编程
- elasticsearch备份与恢复4_使用ES-Hadoop将ES中的索引数据写入HDFS中
- 12月第三周各国域名总量榜:中国729万居全球第二
- 力扣-455 分发饼干
- python学习第二天标准输入输出和注释用法
- 1/4-36UNS-2A的螺纹
- elasticsearch单机版安装及安装过程踩的坑整理
- Choerodon猪齿鱼1.0先行版已发布!
- 如何比对excel表格两列数据中的相同部分或重复部分
- 组件分享之后端组件——用Go编写的IMAP4rev1库go-imap
- 计算机接口图形,图形设备接口
- 医院排队叫号系统(JAVA版)
- 土地资源管理考研资料分享
- 20210729-Codeforces Round #735 (Div. 2)
热门文章
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 重写boost内存池
- Java基础求质数——接收用户输入的数字,判断是否为质数
- R语言基于R6的面向对象编程
- windows+vscode搭建远程linux开发环境
- java中输入语句是怎么写的
- 计算机能思考吗?图1专题9:“计算机会不会有创造力?”
- Jgit基础教程(Java调用git)
- 语音信号处理论文优选:神农Shennong: a Python toolbox for audio speech features extraction​
- 姚期智:呼之欲出的量子计算机,和它漫长的最后一英里(全文)