PyQt结合OpenCV实现实时人流量统计

1. 废话篇(可跳过)

之前学的基本都是Web端的技术。前两天的面试,让我深入的去学习一下 Qt 技术,了解完概念之后,才知道我之前接触的类 TkInter 技术,有点安卓开发的味道。。。

2. 人流量统计效果图

PyQt结合OpenCV实现实时人流量统计_第1张图片

3. 业务逻辑

PyQt结合OpenCV实现实时人流量统计_第2张图片

4. 核心代码

import sys
import cv2
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget


class PeopleCounter(QWidget):
    def __init__(self):
        super().__init__()

        # 创建用于显示图像的 QLabel
        self.image_label = QLabel()

        # 创建用于显示人流量的 QLabel
        self.count_label = QLabel()

        # 创建垂直布局并将 QLabel 添加到其中
        layout = QVBoxLayout()
        layout.addWidget(self.image_label)
        layout.addWidget(self.count_label)

        # 设置布局
        self.setLayout(layout)

        # 创建视频捕捉对象
        self.video_capture = cv2.VideoCapture(0)

        # 初始化人数统计器
        self.people_count = 0

        # 设置定时器,每隔 50 毫秒读取一帧图像
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(50)

    def update_frame(self):
        # 从视频捕捉对象中读取一帧图像
        ret, frame = self.video_capture.read()

        if ret:
            # 进行人流量统计
            # 在这里使用人流量统计算法对图像进行处理,并获取人数统计结果
            # 这里使用示例的人脸检测算法作为人流量统计的简单示例

            # 使用人脸检测器进行人脸检测
            face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

            # 统计人脸数量
            self.people_count = len(faces)

            # 在图像上绘制人脸矩形框
            for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

            # 将 OpenCV 图像转换为 QImage
            image = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped()

            # 将 QImage 转换为 QPixmap 并显示在 QLabel 上
            pixmap = QPixmap.fromImage(image)
            self.image_label.setPixmap(pixmap)

            # 更新人数统计信息
            self.count_label.setText(f"People Count: {self.people_count}")

    def closeEvent(self, event):
        # 停止定时器和视频捕捉
        self.timer.stop()
        self.video_capture.release()
        event.accept()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    people_counter = PeopleCounter()
    people_counter.show()
    sys.exit(app.exec_())

你可能感兴趣的:(AI,pyqt)