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 = ; //进入人数
int outs = ; //离开人数 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(,); //设置窗口大小 camera = new QCamera(this); //系统摄像头设备
finder = new QCameraViewfinder(this); //摄像头取景器部件
capture = new QCameraImageCapture(camera); //截图部件
timer = new QTimer(this); ui->verticalLayout->addWidget(finder); //在布局器上添加finder
ui->label->setMaximumSize(,); //设置照片初始化大小
ui->pushButton_2->setEnabled(false); Switch = false;
Position = ; 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();
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();
ui->horizontalSlider->setMaximum(this->width());
ui->label->setMaximumSize(Position * (/),Position); QPixmap pixmap = QPixmap::fromImage(img );
QPixmap fitpixmap = pixmap.scaled(Position * (/),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

QT--动态人流量监测系统的更多相关文章

  1. win环境下,用虚拟化工具打包Qt动态编译exe的过程(使用Enigma Virtual Box)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://goldlion.blog.51cto.com/4127613/834075 引子 ...

  2. Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库     本文地址:https ...

  3. Qt元对象(Meta-Object)系统与反射

    反射 -在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 要注意 ...

  4. Security基础(五):部署Cacti监控平台、构建Cacti监测系统

    一.部署Cacti监控平台 目标: 本案例要求部署一台Cacti监控主机,并安装相关监控组件,为进一步执行具体的监控任务做准备: 安装net-snmp.net-snmp-utils 安装LAMP及相关 ...

  5. iNeuOS工业互联网操作系统,矿山动态产量计量系统和铁路车辆识别系统应用场景案例

    目       录 1.      概述... 2 2.      平台演示... 2 3.      矿山动态产量计量系统... 2 4.      铁路车辆识别系统... 4 1.   概述 iN ...

  6. 将Qt 动态链接生成的exe及依赖dll打包方法

    源地址:http://blog.csdn.net/ztz0223/article/details/8939341 将Qt 动态链接生成的exe及依赖dll打包方法 原文:http://www.qtcn ...

  7. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  8. 嵌入式系统及应用课程设计——基于STM32的温湿度监测系统

    大三上学期期末总结,嗯,没错上学期,写在新学期开始,hhh. 上学期学了一门嵌入式系统及应用的课程,期末的课程设计题目是基于STM32的温湿度监测系统. 记得刚开始做课程设计的时候,听说先设计画出原理 ...

  9. 基于stm32的水质监测系统项目基础部分详细记录

    基于stm32的水质监测系统项目基础部分详细记录 软件环境:MDK5 硬件环境:STM32F103ZET6 开发板.颜色传感器.串口屏.串口打印机 搭建工程模板 在进行项目软件的撰写时,首先新建一个基 ...

随机推荐

  1. luogu P1754 球迷购票问题

    题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...

  2. SDK版本管理

    在编写API时,有些API被废弃.如何在使用者调用该API时就报出已经被废弃呢? 方法如下: 1.在OC中 在@interface里将要废弃的方法引用后边加上 __attribute__((depre ...

  3. python scapy的使用总结

    基本命令 ls() List all available protocols and protocol options lsc() List all available scapy command f ...

  4. 2018HDU多校训练-3-Problem D. Euler Function

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322 Problem Description In number theory, Euler's toti ...

  5. 进程-(process)、线程-(Thread)

    进程和线程之间的区别: 内存之间的区别: 进程之间不可以共享内存空间,每个进程都有各自独立的内存空间: 线程之间则是可以共享一个进程里的内存空间: 通信机制方面的区别 默认情况下,进程之间很难互通的, ...

  6. python 中 and or

    在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一. 一.and: 在布尔上下文中从左到右演算表达式的值,如果布尔上下 ...

  7. 获取浏览器视口高度device-width

    在进行移动设备web开发时,我们总会用到这样一条代码“<meta name='viewport' content='width=device-width,initial-scale=1.0' / ...

  8. Node6-2单元测试 覆盖率Istanbul

    Step1:安装Istanbul npm install -g istanbul Step2:在package.json里面添加,具体参考Istanbul的API写法 "scripts&qu ...

  9. 《Dotnet9》建站-本站Logo设计之路

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  10. LAMPSecurity: CTF6 Vulnhub Walkthrough

    镜像下载地址: https://www.vulnhub.com/entry/lampsecurity-ctf6,85/ 主机扫描: ╰─ nmap -p- -sV -oA scan 10.10.202 ...