PyQt5下+OpenCV启动摄像头
PyQt5下+OpenCV启动摄像头
- 第一步:用PyQt5下的QtDesigner设计界面,如下:
其中:
1、摄像头为QLabel,大小设置为640X480,这也是笔记本上普通摄像头的分辨率。如果有高清摄像头,可以根据实际情况设置分辨率也行的,或者在打开摄像头后,调整图片的大小。
2、有两个QPushButton,其中,“开始”按钮为启动摄像头,启动后显示为“暂停”。“退出”按钮点击后直接终止程序运行。
ui设计完成后,用PYQT的转换工具,转换为ui_mainwindow.py文件。
第二步:定义按钮功能,设计定时器,图像处理。
1)启动和关闭摄像头设计
def btn_start(self):
if self.btn_status:
self.btn_status = False
else:
self.btn_status = True
if self.btn_status:
self.pushButton.setText('暂停')
self.my_timer.start(40) # 25fps
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # start camera
else:
self.pushButton.setText('开始')
self.label.clear() # 清楚label内容
self.my_timer.stop() # 停止定时器
self.cap.release() # 关闭摄像头入代码片
2)在初始化代码中,定义定时器,以及按钮状态设置
def __init__(self) -> None:
super().__init__()
self.setupUi(self)
'''自定义部分'''
self.my_timer = QTimer() # 创建定时器
self.my_timer.timeout.connect(self.my_timer_cb) # 创建定时器任务
'''按钮状态控制'''
self.btn_status = False
3)在定时任务中,完成摄像头数据捕获和基本处理,并转化为PyQt5格式。
补充一点:在图像提取后,可以增强图像处理,如:做人脸识别,视频文件存储等。(这里不再提供)
def my_timer_cb(self):
if self.cap:
"""图像获取"""
ret, self.image = self.cap.read()
show = cv2.resize(self.image,(640,480))
show = cv2.flip(show, 1)
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
"""图像处理"""
"""处理结果存储"""
"""结果呈现"""
showImage = QImage(show.data, show.shape[1],show.shape[0],QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(showImage))
最后:完整代码如下。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : run.py
@Time : 2022/03/23 14:24:02
@Author : xxxxxxxxx
@Version : 1.00.000
@Contact : xxxxxxx@qq.com
@License : (C)Copyright 2022, Info Analysis and Insight for Future Studios
@https : None
@Desc : 启动程序
'''
# here put the import lib
import sys
# from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage, QPixmap
from ui.Ui_mainwin import Ui_MainWindow
import numpy as np
import cv2
class UI_main(QMainWindow, Ui_MainWindow):
def __init__(self) -> None:
super().__init__()
self.setupUi(self)
'''自定义部分'''
self.my_timer = QTimer() # 创建定时器
self.my_timer.timeout.connect(self.my_timer_cb) # 创建定时器任务
'''按钮状态控制'''
self.btn_status = False
'''加载所有的命令'''
def action_list(self):
self.btn_start()
'''所有命令详细定义'''
def btn_start(self):
if self.btn_status:
self.btn_status = False
else:
self.btn_status = True
if self.btn_status:
self.pushButton.setText('暂停')
self.my_timer.start(40) # 25fps
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # start camera
else:
self.pushButton.setText('开始')
self.label.clear() # 清楚label内容
self.my_timer.stop() # 停止定时器
self.cap.release() # 关闭摄像头
def my_timer_cb(self):
if self.cap:
"""图像获取"""
ret, self.image = self.cap.read()
show = cv2.resize(self.image,(640,480))
show = cv2.flip(show, 1)
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
"""图像处理"""
"""处理结果存储"""
"""结果呈现"""
showImage = QImage(show.data, show.shape[1],show.shape[0],QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(showImage))
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = UI_main()
ui.show()
sys.exit(app.exec_())