QT--動態人流量監測系統


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  為相機必加

2.widget.h文件

#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
3.widget.cpp文件
#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.13的目前我不知道如何解決

  • QT5.12的需要在QT安裝目錄下找到下列兩個文件    

  • 選擇與自己編譯器相同的文件,我的是64的,就選64的文件

  • 將找到的兩個文件放入項目的可執行文件所在文件夾下,即bebug或release,再編譯運行就可以了

 

6.工程源碼

https://github.com/mahuifa/AI-person-flow-monitoring


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM