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进行构造,这里因为是双目摄像头,我们构造的界面就是这样子的了:

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吖~~ 笔芯~~

来源:https://blog.csdn.net/geng333abc/article/details/79727358

标签:Python,OpenCV,pyQt5,摄像头
0
投稿

猜你喜欢

  • Python机器学习算法之决策树算法的实现与优缺点

    2023-06-20 18:29:44
  • Python基础篇之字符串方法总结

    2022-11-25 11:42:36
  • PHP+Ajax简单get验证操作示例

    2024-05-13 09:24:27
  • 利用Python第三方库实现预测NBA比赛结果

    2022-07-01 09:48:29
  • 如何在pyqt中实现全局事件实战记录

    2023-07-01 02:25:46
  • Python文件遍历os.walk()与os.listdir()使用及说明

    2022-11-10 21:53:36
  • python操作excel之xlwt与xlrd

    2023-02-11 08:05:52
  • python使用webdriver爬取微信公众号

    2022-10-06 02:13:30
  • flask+layui+echarts实现前端动态图展示数据效果

    2023-06-24 15:41:55
  • 分析并输出Python代码依赖的库的实现代码

    2022-04-05 17:07:23
  • HTML中使背景图片自适应浏览器大小实例详解

    2024-05-02 16:18:32
  • 酷! 程序员用Python带你玩转冲顶大会

    2022-02-20 11:56:08
  • Linux下python制作名片示例

    2022-06-07 00:29:33
  • django admin管理工具自定义时间区间筛选器DateRangeFilter介绍

    2023-03-23 04:12:20
  • Python编程实现控制cmd命令行显示颜色的方法示例

    2023-07-24 05:39:45
  • 用python实现的线程池实例代码

    2023-11-06 23:04:54
  • 跟我学习javascript的闭包

    2024-04-23 09:11:51
  • PHP hebrev()函数用法讲解

    2023-06-03 12:49:32
  • IronPython连接MySQL的方法步骤

    2024-01-27 05:43:05
  • linux下源码安装mysql5.6.20教程

    2024-01-16 20:13:42
  • asp之家 网络编程 m.aspxhome.com