Python+OpenCV+pyQt5录制双目摄像头视频的实例
作者:ANONYMOUSLYCN 发布时间:2021-12-22 02:07:24
起因
说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用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进行构造,这里因为是双目摄像头,我们构造的界面就是这样子的了:
其中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吖~~ 笔芯~~
来源:https://blog.csdn.net/geng333abc/article/details/79727358
猜你喜欢
- 关于DHT协议DHT协议作为BT协议的一个辅助,是非常好玩的。它主要是为了在BT正式下载时得到种子或者BT资源。传统的网络,需要一台中央服务
- 当我们在使用pycharm时,输入特殊的关键字会有提示,然后按enter就可以自动补全,如果我们经常需要输出重复的代码时,能否也利用这种方法
- 1.0 为什么要做这个博客站?在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满
- 一般跟踪训练的ground_truth的数据保存在文本文文件中,故每一行的数据为一张图片的标签数据,这个时候读取每一张图片的标签,具体实现如
- 引言随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还
- Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list, tuple, d
- 众所周知,Python开发框架大大减少了开发者不必要的重复劳动,提高了项目开发效率的同时,还使得创建的程序更加稳定。目前比较主流的Pytho
- 平时自己写了很多代码,但从没好好计算总共写了多少行,面试时被问起来,就傻了。。。闲来无事,写个python程序来统计下import os##
- 在网上查找大量资料,经过自己的不懈努力,终于测试成功了。原来要在服务器上安装mysql odbc 3.51 ,还有数据库用户名及密码,用下面
- IN主要用于传入参数,可以是变量,常量,表达式,在子程序内部不能改变其值. 代码如下:DECLARE n NUMBER := 10; PRO
- 索引是加速表内容访问的主要手段,特别对涉及多个表的连接的查询更是如此。这是数据库优化中的一个重要内容,我们要了解为什么需要索引,索引如何工作
- 用过NumPY的应该都知道,在二维数组中可以方便地使用区域切片功能,如下图:而这个功能在Python标准库的List中是不支持的,在List
- 介绍这个例子主要利用turtle库实现根据输入动态展示不同机器人的图像和属性信息。代码部分非原创只是做了些许修改和整理使得更易阅读。图片和文
- 背景在爬取网站数据时,我们通常会遇到一些动态渲染页面的网站。传统的静态网站我们可以直接通过 requests.get() 函数获取页面源代码
- 本文实例讲述了Python实现简单的文本相似度分析操作。分享给大家供大家参考,具体如下:学习目标:1.利用gensim包分析文档相似度2.使
- 前言今天我看到线性规划模型开头的介绍,特别不错,因此,我把它记录下来了,分享给大家在工程技术、经济管理、科学研究、军事作战训练及日常生活等众
- 概述线性回归 (Linear Regression) 是利用回归分析来确定两种或两种以上变量间相互依赖的定量关系.对线性回归还不是很了解的同
- 这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 下面的例子简单的演示了DOM对XML的操作,详细解释请看代码中的注释 <? /****************************
- 一、介绍这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。虽然这