QT--動態人流量監測系統
簡介:
-
本項目使用了百度AI的動態人流量監測api,以人體頭肩為主要識別目標,適用於低空俯拍,出入口場景,可用於統計當前圖像的鎖定人數和經過的人數
項目功能
-
本項目分為相機模塊和圖像識別模塊
-
相機模塊
-
使用了兩個button復用、一個滑動條
-
按下打開攝像頭button,開始准備拍照,button變成關閉攝像頭button,再點擊就關閉攝像頭。
-
在打開攝像頭之前,開始button是無法使用的。
-
當打開攝像頭后按下開始button,button變成停止button,同時開始拍攝照片,由於是動態監測人流量,所以抽禎頻率為5fps,也就是每秒需要拍攝上傳5張照片,第一打開需要連接網絡,所以可能有些慢。
-
滑動條在點擊開始之前是無法使用的,當開始拍照后,可拖動滑動條切換窗口界面,進入監測界面
-
-
圖像識別模塊
-
圖像識別模塊可將相機模塊拍攝的照片上傳網絡,進行人體識別,判斷當前圖片指定區域的人數、進入指定區域的人數,離開指定區域的人數
-
將圖片上傳到網絡上后可獲得返回的人數數值和渲染圖片,顯示在監測界面
-
圖片中的人被鎖定后會在人體頭部出現矩形框
-
左邊框為指定區域
-
畫面左上角分別為總的鎖定人數、進入指定區域的總人數、離開指定區域的總人數
-
左下角為此次打開運行的人數
-
-
1. pro文件
QT += core gui network multimedia multimediawidgets //network 為HTTP通信必加 //multimedia multimediawidgets 為相機必加
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QCamera> #include <QCameraViewfinder> #include <QCameraImageCapture> #include <QTimer> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QNetworkRequest> #include <QJsonObject> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); public: QTimer *timer; QCamera *camera; //系統攝像頭設備 QCameraViewfinder *finder; //攝像頭取景器 QCameraImageCapture *capture; //截圖部件 QImage Image; //保存照片 bool Switch; //開關 int Position; //保存滑動條值 QImage img ; //返回照片 int ins = 0; //進入人數 int outs = 0; //離開人數 void photo(); //拍照 void display(); //顯示 void photograph(); //相機初始化 void cameraImageCaptured(int id, QImage image); //獲得照片 /********************網絡**************************************/ QNetworkAccessManager *manager; //網絡訪問管理器 QNetworkReply * reply; //網絡回復 QNetworkRequest *requst; //網絡請求 bool connection = false; void initialization(); //網絡 void sendHTTP(); //發送請求 private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_horizontalSlider_sliderMoved(int position); private: Ui::Widget *ui; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" #include <QBuffer> #include <QByteArray> #include <QImageReader> #include <QJsonDocument> #include <QJsonObject> #include <QThread> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); photograph(); //相機 initialization(); //網絡 } Widget::~Widget() { delete ui; } //網絡 void Widget::initialization() { manager = new QNetworkAccessManager(this); requst = new QNetworkRequest; QString request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_tracking"; //填入百度AI的請求URL QString toke = "24.6878d2808d1dd6be2a3a760c82d0979a.2592000.1570716999.282335-17208954"; //填入百度AI的access_token,具體可看百度AI的文檔 QString url = request_url + "?access_token=" + toke; //注意格式 requst->setUrl(QUrl(url)); requst->setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); //頭不能填錯Content-Type connect(manager,&QNetworkAccessManager::finished,this, [=](QNetworkReply *reply) { QByteArray array = reply->readAll(); //獲取信息 qDebug() << array; QJsonObject json1 = QJsonDocument::fromJson(array).object(); QString image = json1.value("image").toString(); QByteArray ba; //解析返回渲染圖 ba.append(image); QByteArray ba1 = ba.fromBase64(ba); QBuffer buffer(&ba1); buffer.open(QIODevice::ReadOnly); QImageReader reader(&buffer,"jpg"); img = reader.read(); int person_num = json1.value("person_num").toInt(); QJsonObject object = json1.value("person_count").toObject(); qDebug() << object; int in = object.value("in").toInt(); int out = object.value("out").toInt(); ins += in; outs += out; QString str = "當前人數:" + QString::number(person_num); //返回人數 ui->label_2->setText(str); QString str1 = "進入人數:" + QString::number(ins); ui->label_3->setText(str1); QString str2 = "離開人數:" + QString::number(outs); ui->label_4->setText(str2); }); } //發送請求 void Widget::sendHTTP() { QByteArray ba; QBuffer buf(&ba); Image.save(&buf, "jpg"); QByteArray SendData = ""; SendData.append("&dynamic=true"); //封裝發送信息 SendData.append("&case_id=1"); SendData.append("&case_init=false"); SendData.append("&image="); SendData.append(ba.toBase64().toPercentEncoding()); SendData.append("&show=true"); SendData.append("&area=1,1,700,1,700,719,1,719"); qDebug() << SendData; manager->post(*requst,SendData); } //相機初始化 void Widget::photograph() { this->resize(640,450); //設置窗口大小 camera = new QCamera(this); //系統攝像頭設備 finder = new QCameraViewfinder(this); //攝像頭取景器部件 capture = new QCameraImageCapture(camera); //截圖部件 timer = new QTimer(this); ui->verticalLayout->addWidget(finder); //在布局器上添加finder ui->label->setMaximumSize(0,0); //設置照片初始化大小 ui->pushButton_2->setEnabled(false); Switch = false; Position = 0; connect(timer,&QTimer::timeout,this,&Widget::photo); //監聽定時器 connect(capture,&QCameraImageCapture::imageCaptured,this, &Widget::cameraImageCaptured); //圖像捕獲 capture->setCaptureDestination(QCameraImageCapture::CaptureToFile); //設置要捕獲的對象 camera->setCaptureMode(QCamera::CaptureStillImage); //攝像機配置為靜止幀捕獲。 camera->setViewfinder(finder); //設置取景器 } //拍照 void Widget::photo() { capture->capture(); //拍照 sendHTTP(); display(); //顯示 } //獲得圖像 void Widget::cameraImageCaptured(int id, QImage image) { Image = image; } //打開攝像頭 void Widget::on_pushButton_clicked() { if(!Switch) { camera->start(); //打開攝像頭 ui->pushButton->setText("關閉攝像頭"); ui->pushButton_2->setEnabled(true); //打開button Switch = true; } else { camera->stop(); ui->pushButton->setText("打開攝像頭"); ui->pushButton_2->setEnabled(false); Switch = false; // connection = false; } } //定時拍照 void Widget::on_pushButton_2_clicked() { if(!timer->isActive()) { timer->start(200); ui->pushButton_2->setText("停止"); } else { timer->stop(); ui->pushButton_2->setText("開始"); } } //滑動切換 void Widget::on_horizontalSlider_sliderMoved(int position) { Position = position; display(); } //顯示 void Widget::display() { ui->horizontalSlider->setMinimum(0); ui->horizontalSlider->setMaximum(this->width()); ui->label->setMaximumSize(Position * (16/9),Position); QPixmap pixmap = QPixmap::fromImage(img ); QPixmap fitpixmap = pixmap.scaled(Position * (16/9),Position, Qt::KeepAspectRatio, Qt::SmoothTransformation); // 按比例縮放 ui->label->setPixmap(fitpixmap); qDebug() << Position; }
4.widget.ui文件
-
左邊的空為一個部局器
-
右邊的空內為一個label
-
當前人數、進入人數、離開人數為三個label
5.注意
-
有的版本的QT編譯運行,在連接網絡時會出現下列錯誤
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed1
-
-
QT5.12的需要在QT安裝目錄下找到下列兩個文件
- 選擇與自己編譯器相同的文件,我的是64的,就選64的文件