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