Python+OpenCV+pyQt5录制双目摄像头视频的实例


Posted in Python onJune 28, 2019

起因

说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用python自己写一个。要是OpenCV+python。貌似很简单就能OK的事情,但是,我们的项目不是一般要展示给老师看嘛。谁愿意看一个没有界面的录制过程是吧~,最后会附上源代码~

依赖的包

在这里,我直接把import的包写出来了各位可以进行对号入座,然后就能知道需要安装哪个包啦!

import cv2
import numpy as np
from PyQt5.QtWidgets import (QMainWindow, QApplication, QFileDialog)
import threading
import threadpool 
from CvPyGui import ImageCvQtContainer
from CvPyGui.ui import gui

界面设计

pyqt的界面可以用designer进行构造,这里因为是双目摄像头,我们构造的界面就是这样子的了:

Python+OpenCV+pyQt5录制双目摄像头视频的实例

其中TextLabel就是用来进行显示图像的,这里更新图像的代码如下:

class Image(QWidget):
 """Common base for the images"""

 def __init__(self, name, label):
 super().__init__()

 # Label (frame) where the original image will be located, with scaling
 self.frame_lbl = label

 def updateImage(self, opencv_rgb_image):

 self.cv_img_rgb = opencv_rgb_image

 height, width, channel = self.cv_img_rgb.shape
 bytesPerLine = 3 * width
 self.q_image = QImage(self.cv_img_rgb.data, width,
  height, bytesPerLine, QImage.Format_RGB888)

 self.frame_lbl.setPixmap(QPixmap.fromImage(self.q_image))

 def saveImage(self):
 # Function for saving the processed image

 filter = "Images (*.png *.jpg)"

 image_path, _ = QFileDialog.getSaveFileName(self, filter=filter)

 cv_img_bgr = cv2.cvtColor(
 self.cv_img_rgb, cv2.COLOR_RGB2BGR)
 cv2.imwrite(image_path, cv_img_bgr)

我们也知道,视频是一帧一帧的进行播放的。所以,我们在播放的时候实际上就是在更新每一帧的画面了。

OpenCV的视频获取

使用OpenCV获取视频很简单

cap = cv2.VideoCapture(int(text))
 cap.set(6 ,cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') );
 cap.set(3,w);
 cap.set(4,h);
 global update1
 update1 = 1
 global shotmark1
 ret, frame = cap.read()

这样就能够获取到一帧图像了,其中cap.set()函数用来设置相机的参数,本来应该有宏定义的,但是在python里面老是报错,直接用数字替代了,其中3就是获取视频的宽度像素,4是高度,这个要和摄像头手册上的参数一致。一般的Webcam有两种图像获取格式:一种是YUV2格式这种事10bit回传的数据,理论上质量更好,但是有个很大的问题是分辨率高的时候,帧率就会变得十分低。另一种格式是MJPEG格式,这个是使用了压缩技术得到的视频流。通过这个格式,手册上说在1920x1080分辨率下都能获得30fps的表现,而YUV2只有5fps(后来发现,这个就是坑爹的,信了就怪了)。cap.set(6 ,cv2.VideoWriter_fourcc(‘M', ‘J', ‘P', ‘G') );这个参数就是使用MJPEG格式来读取摄像头的数据。

多线程

刚才我们呢也提到了,cap.read()这个函数是获取到了一帧图像,但是呢。我们要的是动画啊,要是写个循环的话,又会吧进程卡死在循环中,照成假死的状态,所以对于图像的绘制,一定要使用多线程技术。在这里我不仅要吐槽一下了。学了好多年计算机,讲了很多串行算法和编程,一讲到多线程,无非就是打印个Hello World!,根本就没有什么实践,理论倒是学了很多,感觉用的时候头真的好大!

其实这里的多线程也没有什么是吧,就是起调一下。但是要注意的是要控制线程的退出,在python这个我引入的多线程包里面,贼坑的是没有外界控制线程退出的办法!所以,我设置了一个全局变量,使用判断全局变量的值来判断是否让子线程继续下去。

结尾

实际上,还有分辨率/帧率设置功能呢,只不过懒得写了!!!3

GitHub:https://github.com/anonymouslycn/bjtu_BinocularCameraRecord

路过的还新希望你能够高抬贵手给个Star吖~~ 笔芯~~

以上这篇Python+OpenCV+pyQt5录制双目摄像头视频的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 随机生成中文验证码的实例代码
Mar 20 Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
Django中间件实现拦截器的方法
Jun 01 Python
Python返回数组/List长度的实例
Jun 23 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
python MD5加密的示例
Oct 19 Python
python实现大文本文件分割成多个小文件
Apr 20 Python
Pyqt QImage 与 np array 转换方法
Jun 27 #Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 #Python
对python中GUI,Label和Button的实例详解
Jun 27 #Python
python 整数越界问题详解
Jun 27 #Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 #Python
python 反编译exe文件为py文件的实例代码
Jun 27 #Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 #Python
You might like
php curl 伪造IP来源的实例代码
2012/11/01 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
php事务处理实例详解
2014/07/11 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
餐厅考勤管理制度
2014/01/28 职场文书
大学生社团活动总结
2014/04/26 职场文书
元旦晚会活动总结
2014/07/09 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
个性发展自我评价2015
2015/03/09 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python