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

1. 废话篇(可跳过)

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

2. 人流量统计效果图

3. 业务逻辑

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_())

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我无法实际执行代码,但是我可以为您提供一些指导和建议。 PyQt5是一个Python GUI库,用于创建交互式应用程序。而OpenCV是一个计算机视觉库,用于处理图像和视频。 在PyQt5中,可以使用QThread类将图像处理放在单独的线程中,以避免阻塞主线程。 下面是一个简单的示例,演示如何在PyQt5中实时处理图像: ```python import sys import cv2 from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget class VideoThread(QThread): change_pixmap_signal = pyqtSignal(QImage) def __init__(self): super().__init__() def run(self): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if ret: # 在此处添加图像处理代码 rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgb_frame.shape bytes_per_line = ch * w convert_to_qt_format = QImage(rgb_frame.data, w, h, bytes_per_line, QImage.Format_RGB888) p = convert_to_qt_format.scaled(640, 480, Qt.KeepAspectRatio) self.change_pixmap_signal.emit(p) class MainWindow(QMainWindow): def __init__(self): super().__init__() # 窗口设置 self.setWindowTitle("Real-time Image Processing") self.setGeometry(100, 100, 640, 480) # 图像显示 self.label = QLabel(self) self.label.resize(640, 480) self.thread = VideoThread() self.thread.change_pixmap_signal.connect(self.update_image) self.thread.start() # 窗口布局 layout = QVBoxLayout() layout.addWidget(self.label) central_widget = QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) def update_image(self, pixmap): self.label.setPixmap(pixmap) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的示例中,我们创建了一个名为VideoThread的子类,用于在后台运行图像处理代码。该类包含一个名为change_pixmap_signal的信号,用于在图像更新时发出信号。 在run()方法中,我们使用OpenCV从摄像头读取帧。然后,我们可以添加任何我们想要的图像处理代码。在这个例子中,我们只是将图像从BGR格式转换为RGB格式,并将其转换为QImage以在PyQt5中显示。 最后,我们创建了一个名为MainWindow的主窗口类,并在其中创建一个QLabel,用于显示图像。我们还将VideoThread的change_pixmap_signal连接到MainWindow的update_image方法中,以更新图像。最后,我们启动了VideoThread并将MainWindow显示在屏幕上。 当您运行此示例时,您将看到一个名为Real-time Image Processing的窗口,其中包含来自计算机摄像头的实时视频。您可以在VideoThread类中添加任何图像处理代码,例如人脸检测,对象跟踪等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值