QT--动态人流量监测系统
QT–动态人流量监测系统
文章目录
- QT--动态人流量监测系统
- 简介:
- 项目功能
- 1. pro文件
- 2.widget.h文件
- 3.widget.cpp文件
- 4.widget.ui文件
- 5.注意
- 6.工程源码
简介:
- 本项目使用了百度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_OBJECTpublic: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的请求URLQString 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-Typeconnect(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); //在布局器上添加finderui->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); //打开buttonSwitch = 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.工程源码
github.
QT--动态人流量监测系统相关推荐
- 【嵌入式开发】监测系统——用QT编写下位机
[嵌入式开发]监测系统--用QT编写嵌入式下位机界面 一.登陆界面 二.自定义弹出式小键盘 2.1设计思路 2.2具体实现 三.通讯协议 四.检测界面 五.历史信息显示 六.总结 本文为嵌入式课程的课 ...
- 海域动态监视监测管理系统_监视和管理备份系统
海域动态监视监测管理系统 上一次我们建立一个强大的备份系统时 ,现在我们将研究如何监视备份集. 我们需要验证是否正确清理了备份集(这称为删除策略),并且它们是一致的(称为一致性策略). 备份集可以包含 ...
- Qt实现天气预报与PM2.5监测系统(6)系统界面设计
Qt实现天气预报与PM2.5监测系统(6)系统界面设计 系统UI设计 一个图形化的应用,界面设计非常重要.现在软件企业一般有专门的UI设计师,交互设计师. 首先用绘图软件设计出软件界面的设计稿,确定色 ...
- 全球及中国微生物主动空气监测系统行业前景动态及投资规划分析报告(2022-2027)
全球及中国微生物主动空气监测系统行业前景动态及投资规划分析报告(2022-2027) ================================================ [报告编号]: ...
- 【开源分享】VIDO-SLAM:一种视觉惯性动态物体SLAM系统
文章:Inertial-Only Optimization for Visual-Inertial Initialization 作者:Carlos Campos, Jose M.M. Montiel ...
- 【开源方案共享】VDO-SLAM:基于视觉的动态SLAM感知系统
点云PCL免费知识星球,点云论文速读. 标题:VDO-SLAM: A Visual Dynamic Object-aware SLAM System 作者:Jun Zhang , Mina Henei ...
- Qt/PyQt中使用系统全局的快捷键
Qt/PyQt中使用系统全局的快捷键 除了全局快捷键部分外,其他的都比较简单,都是我实现"onekeycodehighlighter"中碰到的一些小问题,这里顺面整理一下.事实上, ...
- 工控设备 如何将数据发送到串口_嵌入式无风扇工控机在水质监测系统中的应用...
行业背景: 随着城市人口的增加和工农业生产的发展,污水排放量也日益增加,水体污染相当严重,大量生活污水和生产废水对生态环境造成破坏,在未来很长一段时间内保护生态环境治理水污染仍是我国实现经济社会可持续 ...
- iNeuOS工业互联网操作系统,矿山动态产量计量系统和铁路车辆识别系统应用场景案例...
目 录 1. 概述... 2 2. 平台演示... 2 3. 矿山动态产量计量系统... 2 4. 铁路车辆识别系统... 4 1. 概述 iN ...
最新文章
- 性能评估指标(Precision, Recall, Accuracy, F1-measure)
- Linux下用 lsof 命令查找指定端口被哪个进程占用
- Django使用心得(四)
- Java如何实现跨平台?原理是怎样的?
- 数字图像处理中的高通滤波和低通滤波
- 微软收购AI创业公司Bonsai,机械臂效率比DeepMind高45倍
- webpack配置工程师(一):基本篇
- Karabiner Elements使用技巧分享,帮您简单修改使用键位
- object c小代码——日期篇
- 2020王万生计算机组成原理,计算机组成原理课后习题-王万生(53页)-原创力文档...
- opencv_判断两张图片是否相同
- JAVA基础(4/17)-基本语法_流程控制
- STM8L驱动I2C类型的12864
- win7用友u8安装教程_用友u8怎么安装?分享一组用友u8安装教程(图文)
- 软件测试之测试用例设计(一)
- 全球与中国网络连接视频门铃对讲机系统市场深度研究分析报告势
- c# chart 各个属性_C# Chart详细解析(待)
- HTTP协议报文基本格式
- 变更百度智能云DNS--域名解析
- hh模型仿真matlab程序,gardner算法算法matlab仿真请教(附程序)