【Qt学习】OpenCV帧差法 车辆识别

article/2025/9/28 14:22:59

目录

一:效果展示

二:Qt UI界面设计

三:源码分享


一:效果展示

使用Qt界面实现 点击 线程启动按钮播放视频 同时

左边界面显示原视频 右边界面显示车辆识别视频

初始界面

点击线程启动后,即可车辆识别 框选车辆

二:Qt UI界面设计

在设计好界面之后最好先保存一下

对按钮可以设置槽函数

三:源码分享

难点在于:

线程同步问题

需要使用到connect函数中的第五个参数【第五个参数 具体说明如下】

1 AutoConnection 为默认参数,由发送信号决定,如果发送信号和接受信号是同一个线程,则调用DirectConnection。如果不在同一个线程则调用QueuedConnection;
2 DirectConnection 槽函数运行于信号发送者所在的线程,效果上就像是直接在信号发送的位置调用了槽函数
3 QueuedConnection 槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号后,槽函数不会立即被调用,等到接收者当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程下用这个类型
4 BlockingQueuedConnection 槽函数的调用时机与Qt::QueuedConnection 一致,不过在发送完信号后,发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则会死锁。在多线程间需要同步的场合会用到这个
5 UniqueConnection 此类型可通过 “|” 与以上四个结合在一起使用。此类型为当某个信号和槽已经连接时,在进行重复连接时就会失败,可避免重复连接。如果重复连接,槽函数会重复执行

Widget.h头文件导入OpenCV包

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<opencv2/opencv.hpp>
#include"videothread.h"using namespace cv;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = 0);~Widget();void paintEvent(QPaintEvent *e);
private slots:void on_pushButton_clicked();
public slots://绑定线程 需要两帧画面 原图和处理之后的图   接收由同一个信号发送来的两帧画面void ChangeImg(Mat oldimg,Mat newimg);
private:Ui::Widget *ui;videothread *pthread;QImage oldimg;QImage newimg;
};#endif // WIDGET_H

Widget.cpp源文件 界面实现 

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->pthread = new videothread("D:/00000000000003jieduanshipincailliao/carMove.mp4");//由于线程同步问题 需要使用第五个参数connect(this->pthread,SIGNAL(send2UI(Mat,Mat)),this,SLOT(ChangeImg(Mat,Mat)),Qt::BlockingQueuedConnection);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *e)
{ui->label->setPixmap(QPixmap::fromImage(this->oldimg));ui->label_2->setPixmap(QPixmap::fromImage(this->newimg));//qDebug()<<"paintEvent";
}void Widget::on_pushButton_clicked()
{this->pthread->start();
}void Widget::ChangeImg(Mat oldimg,Mat newimg)
{//Mat是BGR 而QImage是RGB 需要转换颜色cvtColor(oldimg,oldimg,CV_BGR2RGB);cvtColor(newimg,newimg,CV_BGR2RGB);this->oldimg = QImage(oldimg.data,oldimg.cols,oldimg.rows,QImage::Format_RGB888);this->oldimg = this->oldimg.scaled(ui->label->width(),ui->label->height());this->newimg = QImage(newimg.data,newimg.cols,newimg.rows,QImage::Format_RGB888);this->newimg = this->newimg.scaled(ui->label_2->width(),ui->label_2->height());//update();
}

VideoThread.h头文件导入OpenCV包

#ifndef VIDEOTHREAD_H
#define VIDEOTHREAD_H
#include<QThread>
#include<opencv2/opencv.hpp>
#include<vector>
#include<QDebug>
#include <QObject>using namespace std;
using namespace cv;class videothread : public QThread
{Q_OBJECT
public://explicit videothread(QObject *parent = 0);//线程传参视频路径videothread(char *path);void run();
private:VideoCapture cap;Mat frame;//读一帧Mat temp;//保存上一帧
signals://发送信号void send2UI(Mat oldimg,Mat newimg);
public slots:
};#endif // VIDEOTHREAD_H

VideoThread.cpp源文件 帧差法 车辆识别 

#include "videothread.h"videothread::videothread(char *path):QThread()
{//打开一个视频cap.open(path);
}void videothread::run()
{int count = 0;Mat resFrame,diff;Mat frontGray,afterGray;vector<vector<Point>>contours;Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3));Mat element2 = cv::getStructuringElement(MORPH_RECT,Size(20,20));int x,y,w,h;while (cap.read(frame)){count++;if(count == 1){//保存第一帧temp = frame.clone();continue;}else {//绘制矩形 使用此帧resFrame = frame.clone();//1 灰度处理 目的 RGB三通道转灰度单通道 压缩到原图片三分之一大小cvtColor(temp,frontGray,CV_RGB2GRAY);cvtColor(frame,afterGray,CV_RGB2GRAY);//2 帧差处理 目的 找到帧与帧之间的差异(正在运动的物体)absdiff(frontGray,afterGray,diff);//3 二值化处理 目的 将灰度图继续识别转换为黑白分明的图像threshold(diff,diff,25,255,CV_THRESH_BINARY);//4 图像降噪//4-1 腐蚀处理 目的 去除白色噪点erode(diff,diff,element);//4-2 膨胀 目的 把白色区域变大dilate(diff,diff,element2);//5 提取关键点//5-1 查找特征点findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));//qDebug()<<contours.size();//5-2 提取关键点vector<vector<Point>>contours_poly(contours.size());vector<Rect>boundRect(contours.size());//5-3 确定下四个点来用于框选目标物体int num=contours.size();for(int i = 0;i < num;i++){approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);//多边拟合boundRect[i]=boundingRect(Mat(contours_poly[i]));x=boundRect[i].x;y=boundRect[i].y;w=boundRect[i].width;h=boundRect[i].height;//绘制矩形rectangle(resFrame,Point(x,y),Point(x+w,y+h),Scalar(0,0,255),2);}}temp = frame.clone();emit send2UI(frame,resFrame);msleep(1);}
}

主入口测试:

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

http://chatgpt.dhexx.cn/article/6ARLH7dU.shtml

相关文章

【车辆识别】基于卷积神经网络yolov3识别车辆和车辆速度附matlab代码

1 简介 近年来,自动驾驶研究,智慧交通建设突飞猛进,车辆检测技术成为业界的研究热点.由于深度卷积神经网络具有一定的旋转与平移不变性等特点,在车辆检测任务中得到广泛应用,其中,YOLOv3(You Only Look Once version 3)算法是目前主要的检测算法之一. 2 部分代码 clearclc​%…

基于深度学习的车牌+车辆识别(YOLOv5和CNN)

yolov5车牌识别+车辆识别 行人识别yolov5和v7对比 订阅专栏获得源码(提供完整代码,无需看下文) 基于深度学习的车牌识别(YOLOv5和CNN) 目录 一、综述 二、车牌检测 一、综述 本篇文章是面向的是小白,想要学习深度学习上的应用,本文中目前应用了YOLO v5和CNN来对车牌进行…

Qt +opencv 通过级联分类器训练的模型进行识别(车辆识别+人脸识别)

有不对的或更好的方法欢迎交流 一些内容可参照这篇文章&#xff1a;https://blog.csdn.net/m0_64596200/article/details/126748697?spm1001.2014.3001.5502 训练好的的模型&#xff1a; 车辆识别模型&#xff1a;https://download.csdn.net/download/m0_64596200/86507302?…

机器学习1:OpenCV4.5.5加载xml进行车辆识别

深度学习准确率高识别效果好&#xff0c;但是对软硬件环境要求高&#xff0c;使用及部署有一定难度&#xff0c;应用受限。相比之下&#xff0c;机器学习效果差一个量级&#xff0c;但是计算量小&#xff0c;计算迅速&#xff0c;部署相对容易&#xff0c;尤其是在一些计算能力…

基于YOLOv5的车辆识别系统

基于YOLOv5的车辆识别系统&#xff08;展示&#xff09; 文章目录 基于YOLOv5的车辆识别系统&#xff08;展示&#xff09;前言车牌识别车型识别 前言 YOLO能实现图像或视频中物体的快速识别&#xff0c;在相同的识别类别范围和识别准确率条件下&#xff0c;YOLO识别速度最快。…

Review of Vehicle Recognition Technology - 车辆识别技术综述

Review of Vehicle Recognition Technology - 车辆识别技术综述 ZHANG Qiang, LI Jiafeng, ZHUO Li Faculty of Information Technology, Beijing University of Technology, Beijing 100124, China 北京工业大学信息学部&#xff0c;北京 100124 Beijing University of Tech…

deeplearning.36车辆识别YOLO算法实践

车辆识别 下载相关资料导入相关包数据集定义YOLO模型细节分类阈值过滤非最大值抑制非最大值抑制函数对所有框进行过滤 测试训练好的yolo模型定义分类、锚框、图像维度加载已经训练好的模型模型的输出转换为边界框过滤锚框实际图像中运行计算图实际预测一下 下载相关资料 下载本…

基于python的transform行人车辆识别

Transformer是一种神经网络体系结构&#xff0c;由于它能够有效地处理顺序数据中的长期依赖性&#xff0c;因此在自然语言处理(NLP)任务中受到欢迎。它还被应用于各种其他任务&#xff0c;包括图像分类、对象检测和语音识别。 在车辆和行人识别方面&#xff0c;transformer可用…

使用Python和docTR提取车辆识别号

VIN&#xff08;车辆识别号&#xff09;是一个17个字符的字符串&#xff0c;由数字和大写字母组成&#xff0c;用作汽车的指纹。 它可以帮助识别任何一辆汽车的寿命&#xff0c;并获得有关它的具体信息。该唯一标识符在制造过程中打印在车辆的某个位置&#xff0c;以便人们在租…

Opencv python之车辆识别项目(附代码)

文章目录 图片车辆识别视频车辆识别 图片车辆识别 根据文章搭建好环境后开始进行做项目link import sys import cv2 from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon, QPalette, QPixmap, QBrush, QRegExpValidatorclass mainWin(QW…

java opencv 之车辆识别

上篇写了人脸识别&#xff0c;因为人脸识别的训练模型 haarcascade_frontalface_alt.xml 之类的官方已经训练好了可以直接用&#xff0c;但是我们要识别车辆或者其它物体就得训练模型&#xff0c;好在废了一点力 找到了一位大神训练好的模型 核心代码 几乎和人脸识别的差不多 s…

如何开发一个车牌识别,车牌识别系统,车辆识别系统毕业设计毕设作品

开发准备 第1步&#xff1a;准备好百度智能云的账号 第2步&#xff1a;在百度智能云领取对应AI开发的免费资源包 第3步&#xff1a;创建对应的应用&#xff0c;然后获取对应的开发信息&#xff0c;主要是下面几个 AppID&#xff1a;应用列表中 API Key&#xff1a;应用列表…

车辆识别

一&#xff1a;简介 车牌识别系统(Vehicle License Plate Recognition&#xff0c;VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息&#xff08;含汉字字符、英文字母、阿拉伯数字及号牌颜色&#xff09;进行处理的技术。车牌识别是现代智能交通系统中的重要组成…

【OpenCV】 车辆识别 运动目标检测

目录 一&#xff1a;车辆识别 运动目标检测 二&#xff1a;车辆识别实现 超详细步骤解析 步骤一&#xff1a;灰度化处理 步骤二&#xff1a;帧差处理 步骤三&#xff1a;二值化处理 步骤四&#xff1a;图像降噪 4-1 腐蚀处理 目的 去除白色噪点 4-2 膨胀处理 目的 把白…

【OpenCV】车辆识别 C++ OpenCV 原理介绍 + 案例实现

目录 前言 一、图像处理 &#x1f4bb;二值化处理 &#x1f4bb;膨胀、腐蚀 &#x1f4bb;开运算、闭运算 二、案例实现 Step1&#xff1a;灰度处理 Step2&#xff1a;对视频进行帧差处理 Step3&#xff1a;二值化处理 Step4&#xff1a;腐蚀处理 Step5&#xff1a…

【OpenCV】车辆识别 目标检测 级联分类器 C++ 案例实现

目录 前言 一、目标检测技术 二、样本采集工作原理 三、创建自己的级联分类器 Step1&#xff1a;准备好样本图像 Step2&#xff1a;环境配置&#xff08;OpenCV win10&#xff09; Step3&#xff1a;设置路径 Step4&#xff1a;实现样本数据采集 Step5&#xff1a;实…

使用华为modelarts进行车辆识别

要求&#xff1a;从图像&#xff08;图3&#xff09;中检测并识别出车辆。车辆检测和识别算法可采用深度学习、BP网络或特征匹配等方法&#xff0c;方法不限。 图5-1待识别图像 原理&#xff1a;ModelArts是面向AI开发者的一站式开发平台&#xff0c;支持自动学习的功能&#…

车辆识别(特征提取+svm分类器)

以下为udacity的SDCND的一个项目 ps:这里使用的是用opencv进行特征提取+svm分类器的方法实现物体检测,是在深度学习流行前比较经典的实现方法 项目描述: 使用openCV提取图片特征,训练svm分类器,分类车辆与非车辆。用训练好的模型识别汽车前置摄像头记录视频中的车辆。 …

深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)

深度学习目标检测&#xff1a;YOLOv5实现车辆检测(含车辆检测数据集训练代码) 目录 深度学习目标检测&#xff1a;YOLOv5实现车辆检测(含车辆检测数据集训练代码) 1. 前言 2. 车辆检测数据集说明 &#xff08;1&#xff09;车辆检测数据集 &#xff08;2&#xff09;自定…

案例-使用python实现基于opencv的车辆识别

写在开头&#xff0c;接触opencv也有很长一段时间了&#xff0c;中间还接触了halcon。但都是基于C实现&#xff0c;发现如果有什么idea&#xff0c;还是使用python可以快速实现。基于C版本的后期会有更新。 首先&#xff0c;这个案例是一个老生常谈的问题-车辆识别。首先我们要…