PyQt5+OpenCV *** 作本地摄像头

PyQt5+OpenCV *** 作本地摄像头,第1张

文章目录
  • 前言
  • 一、PyCharm+PyQt5的环境配置
  • 二、使用OpenCV播放摄像头视频
  • 三、利用百度AI平台实现人脸识别
  • 四、PyQt5+OpenCV显示摄像头图像
    • 1. 程序效果
    • 2. 核心源码
    • 2. 程序拓展
  • 总结


前言

学习了PyQt5,可以使用python设计出基于Qt的各种GUI,OpenCV是机器视觉处理库,提供了Python语言的接口,今天就尝试在使用PyQt5开出出来的界面上,显示使用OpenCV库采集到的摄像头视频数据。


一、PyCharm+PyQt5的环境配置

详见:Python桌面应用开发(PyQT)入门思维导图,果断收藏

二、使用OpenCV播放摄像头视频

详见:OpenCV关于视频相关 *** 作

三、利用百度AI平台实现人脸识别

详见:Python利用百度AI平台实现人脸识别

四、PyQt5+OpenCV显示摄像头图像 1. 程序效果

2. 核心源码
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import cv2
#from PyQt5.QtCore import QTimer


class Video(QWidget):

    def __init__(self):
        super(Video, self).__init__()
        self.frame = []  # 存图片
        self.detectFlag = False  # 检测flag
        self.cap = []
        self.timer_camera = QTimer()  # 定义定时器
        
        # 外框
        self.resize(900, 650)
        self.setWindowTitle("PyQt5+OpenCV显示摄像头图像")
        # 图片label
        self.label = QLabel(self)
        self.label.setText("等待摄像头开启")
        self.label.setFixedSize(800, 450)
        self.label.move(50, 100)
        self.label.setStyleSheet("QLabel{background:pink;}"
                                 "QLabel{color:rgb(100,100,100);font-size:15px;font-weight:bold;font-family:宋体;}"
                                 )
        # 显示人数label
        self.label_title = QLabel(self)
        self.label_title.setText("PyQt5+OpenCV显示摄像头图像")
        self.label_title.setFixedSize(430, 40)
        self.label_title.move(200, 20)
        self.label_title.setStyleSheet("QLabel{background:yellow;}")
        # 开启视频按键
        self.btn = QPushButton(self)
        self.btn.setText("打开")
        self.btn.move(150, 570)
        self.btn.clicked.connect(self.slotStart)
        # 检测按键
        self.btn_detect = QPushButton(self)
        self.btn_detect.setText("检测")
        self.btn_detect.move(400, 570)
        self.btn_detect.setStyleSheet("QPushButton{background:red;}")  # 没检测红色,检测绿色
        self.btn_detect.clicked.connect(self.detection)
        # 关闭视频按钮
        self.btn_stop = QPushButton(self)
        self.btn_stop.setText("停止")
        self.btn_stop.move(700, 570)
        self.btn_stop.clicked.connect(self.slotStop)

    def slotStart(self):
        self.cap = cv2.VideoCapture(0)
        self.timer_camera.start(100)
        self.timer_camera.timeout.connect(self.openFrame)

    def slotStop(self):

        if self.cap != []:
            self.cap.release()
            self.timer_camera.stop()  # 停止计时器
            self.label.setText("本地摄像头被关闭")
            self.label.setStyleSheet("QLabel{background:pink;}"
                                     "QLabel{color:rgb(100,100,100);font-size:15px;font-weight:bold;font-family:宋体;}"
                                     )
        else:
            Warming = QMessageBox.warning(self, "警告", "请先打开摄像头",
                                          QMessageBox.Yes)

    def openFrame(self):

        if (self.cap.isOpened()):
            ret, self.frame = self.cap.read()
            if ret:
                frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
                height, width, bytesPerComponent = frame.shape
                bytesPerLine = bytesPerComponent * width
                q_image = QImage(frame.data, width, height, bytesPerLine,
                                 QImage.Format_RGB888).scaled(self.label.width(), self.label.height())
                self.label.setPixmap(QPixmap.fromImage(q_image))
            else:
                self.cap.release()
                self.timer_camera.stop()  # 停止计时器

    def detection(self):
        self.detectFlag = not self.detectFlag  # 取反
        if self.detectFlag == True:
            self.btn_detect.setStyleSheet("QPushButton{background:green;}")
        else:
            self.btn_detect.setStyleSheet("QPushButton{background:red;}")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    my = Video()
    my.show()
    sys.exit(app.exec_())
2. 程序拓展

利用级联分类器实现人脸框选
1、加载前脸级联器

self.face_detect = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")

2、图像处理,框选出人脸

 if self.detectFlag == True:
                    # 检测代码self.frame
                    self.faces = self.face_detect.detectMultiScale(self.frame, 1.1, 3, cv2.CASCADE_SCALE_IMAGE,
                                                                   (200, 200), (300, 300))
                    for (x, y, w, h) in self.faces:
                        # 把人脸部分框出来
                        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 255), 1, cv2.LINE_AA)


总结

以上这篇Python+OpenCV+PyQt5 *** 作本地摄像头的实例就是本次分享给大家的全部内容了,希望能给大家一个参考。如要利用百度AI平台实现人脸识别,并且实现人脸库管理,可参考利用百度AI平台实现人脸识别

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/713959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存