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

article/2025/9/28 16:05:08

目录

前言

一、目标检测技术

二、样本采集工作原理

三、创建自己的级联分类器

Step1:准备好样本图像

Step2:环境配置(OpenCV win10)

Step3:设置路径

Step4:实现样本数据采集 

Step5:实现样本数据训练

Step6:生成级联分类器文件 

四、案例实现

Step1:灰度处理

Step2:二次压缩

Step3:直方图均衡化

Step4:标定、框选目标

💡案例完整代码

五、总结 


前言

本文继续以车辆识别为目标,继续改进方法,以此提高车辆识别进准度,核心的内容包括:OpenCV级联分类器概念创建自己的级联分类器以及使用级联分类器对车流进行识别 

一、目标检测技术

目前常用实用性目标检测与跟踪的方法有以下两种:

  • 帧差法
  • 识别原理:基于前后两帧图像之间的差异进行对比,获取图像画面中正在运动的物体从而达到目标检测
  • 缺点:画面中所有运动中物体都能识别
  • 举个例子:我们的目标是识别运动的车辆,但是,在画面中镜头晃动,大风吹过树叶飘动也会被计算在甄别范围内,这就会导致甄别物出现错误
  • 级联分类器
  • 那么,有没有更好的方式能降低我们甄别目标出现错误的概率呢?
  • 这边就可以使用我们的级联分类器了,如果我们的识别目标是车辆,那就需要把车辆相关的信息全部统计出来,比如:车辆颜色车辆形状车辆大小等信息,将他们存储在一个文件中,以提高甄别准确度,这个文件就是级联分类器
  • 级联分类器也是机器视觉和机器学习中非常重要的一个环节

二、样本采集工作原理

  • 分析一 

使用基于Haar特征的级联分类器的对象检测,这是一种基于机器学习的方法,其中从许多正负图像中训练级联函数,然后,用于检测其他图像中的对象,在这里,我将进行人脸检测举例说明,最初,该算法需要大量正图像(面部图像)和负图像(无面部图像)来训练分类器, 然后,我们需要从中提取特征,为此,使用下图所示的Haar功能, 它们就像我们的卷积核一样,每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值

  • 分析二

现在,每个内核的所有可能大小和位置都用于计算许多功能,试想一下它产生多少计算?即使是一个24x24的窗口也会产生超过160000个特征,这对于每个特征计算,我们需要找到白色和黑色矩形下的像素总和,为了解决这个问题,引入了整体图像,无论你的图像有多大,它都会将给定像素的计算减少到仅涉及四个像素的操作,它使事情变得更快, 但是,在我们计算的所有这些特征中,大多数都不相关,例如,下图,第一行显示了两个良好的特征,选择的第一个特征似乎着眼于眼睛区域通常比鼻子和脸颊区域更暗的性质,选择的第二个特征依赖于眼睛比鼻梁更黑的属性,但是,将相同的窗口应用于脸颊或其他任何地方都是无关紧要的,那么,我们将如何从16万多个功能中选择最佳特征?

我们将所有特征应用于所有训练图像,对于每个特征,它会找到最佳的阈值,该阈值会将人脸分为正面和负面,显然,会出现错误或分类错误,我们选择错误率最低的特征,这意味着它们是对人脸和非人脸图像进行最准确分类的特征,此过程并非如此简单,在开始时,每个图像的权重均相等,在每次分类后,错误分类的图像的权重都会增加,然后执行相同的过程,将计算新的错误率,还要计算新的权重,继续进行此过程,直到达到所需的精度或错误率或找到所需的功能数量为止, 最终分类器是这些弱分类器的加权和,之所以称为弱分类,是因为仅凭它不能对图像进行分类,而是与其他分类一起形成强分类器,甚至200个功能都可以提供95%的准确度检测

三、创建自己的级联分类器

Step1:准备好样本图像

  • 正样本数据采集(我们需要检识别的目标图片,例如:车辆)

  • 负样本数据采集(非检测物的图片)

我们可以在生活中观察到,大马路上除了车辆,还存在诸多的干扰,比如说:行人、斑马线、交通设别(路障、护栏、红绿灯、路灯等等),以及上文所说的风吹动,树叶飘动等等

Step2:环境配置(OpenCV win10

  • 下载OpenCV win10系统安装包
  • 从安装包中的opencv\build\x64\vc15\bin 找到

        -  opencv_createsamples.exe

        -  opencv_traincascade.exe

        -  opencv_world342.dll

  • 将以上文件拷贝到正负样本文件路径下

Step3:设置路径

  • 创建正负样本的图像路径的 .txt文件

Step4:实现样本数据采集 

  • 调用opencv中opencv_createsamples.exe实现样本数据采集

通过命令行执行命令进行样本采集生成car_samples.vec正样本矢量集文件,命令行如下:

opencv_createsamples.exe -info car_list.txt -vec car_samples.vec  -num 80 -w 33 -h 33

  • - info字段填写正样本描述文件
  • - vec用于保存制作的正样本
  • - num制定正样本的数目
  •  - w和-h分别指定正样本的宽和高
  • 在windows下终端运行,如下图所示: 

Step5:实现样本数据训练

  • 调用opencv中opencv_traincascade.exe对样本进行训练 

通过命令行执行命令进行训练生成,命令行如下:

opencv_traincascade.exe -data data -vec car_samples.vec  -bg ng_data.txt  -numPos 80 -numNeg 240 -numStages 7 -w 33 -h 33 -minHitRate 0.995 -maxFalseAlarmRate 0.45 -mode ALL

  • -data:指定保存训练结果的文件夹
  • -vec:指定正样本集; -bg:指定负样本的描述文件夹 
  • -numPos:指定每一级参与训练的正样本的数目(要小于正样本总数)
  • -numNeg:指定每一级参与训练的负样本的数目(可以大于负样本图片的总数)
  • -numStage:训练的级数
  • -w:正样本的宽
  • -h:正样本的高 
  • -minHitRate:每一级需要达到的命中率(一般取值0.95-0.995)
  • -maxFalseAlarmRate:每一级所允许的最大误检率 
  • -mode:使用Haar-like特征时使用,可选BASIC、CORE或者ALL 

  • 另外,还可指定以下字段:
  • -featureType:可选HAAR或LBP,默认为HAAR;
  • 在windows下终端运行,进行训练,每一层训练都会有显示,如下图所示:  
  • PS:训练时需要考虑一下自身电脑配置,小心电脑跑出问题!

Step6:生成级联分类器文件 

  • 生成文件,如下所示: 

四、案例实现

我们将继续编写代码通过C++ 编写 OpenCVQt上来展现出我们的案例效果

Step1:灰度处理

  • 将我们的色彩通道缩小,简化矩阵,提高运算速度 
    //【灰度处理】Mat gray;cvtColor(frame,gray,CV_RGB2GRAY);

Step2:二次压缩

  • 灰度处理还不够,级联分类器比帧差法还更加慢,因此,再将灰度图大小压缩一半左右 
    //一次还不够,级联分类器比帧差法还更加慢//【二次压缩】因此,再将灰度图大小压缩一半左右Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);

Step3:直方图均衡化

  • 将缩小一半的灰度图进行均值化使其更加黑白分明
    equalizeHist(smalling,smalling);//imshow("smalling",smalling);

Step4:标定、框选目标

  • 调用级联分类器进行模型匹配并框选目标
    //调用级联分类器进行模型匹配并框出内容vector<Rect>cars;//【参数说明】 待检测的图片帧  被检测物体的矩形向量容器  每次搜索减小的图像比例  检测目标周围相邻矩形的最小个数(此处设为2个) 类型 目标区域的大小尺寸cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));vector<Rect>::const_iterator iter;//【绘制标记框】注意,标记要画在原帧上,要讲方框的大小和帧坐标扩大,因为是根据灰度图识别的,灰度图被缩小了for(iter=cars.begin();iter!=cars.end();iter++){rectangle(frame,cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),Scalar(0,255,0),2,8);}imshow("frame",frame);
}

💡案例完整代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;void datectCarDaw(Mat &frame,CascadeClassifier cascade,double scale)
{//【灰度处理】Mat gray;cvtColor(frame,gray,CV_RGB2GRAY);//一次还不够,级联分类器比帧差法还更加慢//【二次压缩】因此,再将灰度图大小压缩一半左右Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);//【直方图均衡化】将缩小一半的灰度图进行均值化使其更加黑白分明equalizeHist(smalling,smalling);//imshow("smalling",smalling);//调用级联分类器进行模型匹配并框出内容vector<Rect>cars;//【参数说明】 待检测的图片帧  被检测物体的矩形向量容器  每次搜索减小的图像比例  检测目标周围相邻矩形的最小个数(此处设为2个) 类型 目标区域的大小尺寸cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));vector<Rect>::const_iterator iter;//【绘制标记框】注意,标记要画在原帧上,要讲方框的大小和帧坐标扩大,因为是根据灰度图识别的,灰度图被缩小了for(iter=cars.begin();iter!=cars.end();iter++){rectangle(frame,cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),Scalar(0,255,0),2,8);}imshow("frame",frame);
}int main(int argc, char *argv[])
{//级联分类器(模型)CascadeClassifier cascade;cascade.load("C:/Users/86177/Desktop/cars-face/cars.xml");//读取级联分类器Mat frame;VideoCapture cap("C:/Users/86177/Desktop/image/test.mp4");//视频路径while (cap.read(frame)){imshow("video",frame);//将读到的帧显示出来datectCarDaw(frame,cascade,2);//将读到的帧传入函数用作识别waitKey(5);//延时5ms}return 0;
}
  • 实现效果,总体来说还是相当不错的,相较于帧差法而言,精度提高很多
  • 级联分类器实现,如下图所示:

  • 为了方便对比,再次使用帧差法实现,可以看到移动的电动车都被识别进去了,如下图所示:
  • 帧差法实现,如下图所示:

五、总结 

  • 本文核心的内容包括:OpenCV级联分类器概念创建自己的级联分类器以及使用级联分类器对车流进行识别
  • 以车辆识别为例子,讲解了级联分类器相较于帧差法的实战案例,实际效果还是不错的
  • 车辆识别在我们日常生活中非常常见,是一个很经典的案例,本案例采用了较高级别的级联分类器,可以实现对车辆较高精度的识别,车辆识别还是需要更大更复杂的样本量才能在复杂环境下对车辆进行精确的识别,总体而言效果相较于帧差法更加精准了!新能源汽车的发展,与车辆识别同理的无人驾驶技术,在针对实际路况的识别难度还是较大的,各大巨头还在努力研究相关技术,相信在不久的将来,我们能看到无人驾驶技术达到较为成熟的一天!

以上就是本文的全部内容啦!如果对您有帮助,麻烦点赞啦!收藏啦!欢迎各位评论区留言!! 


http://chatgpt.dhexx.cn/article/hvVvT7vm.shtml

相关文章

使用华为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;这个案例是一个老生常谈的问题-车辆识别。首先我们要…

MySQL清空单表数据

一&#xff1a;问题背景 1. 问题描述 之前测试1千万数据插入MySQL数据库里面,分别使用单线程的方式和线程池的方式对比测试&#xff0c;查看效果,但是插入了1千万数据后,由于是测试数据,现在不能在新建一张表浪费存储空间,还是之前的表,要清空原来的数据.有哪些方式可用&#x…

mysql清空表数据_mysql数据库之如何清空表中数据

本篇文章主要讲述的是在数据库中使用清空命令&#xff0c;具有一定学习价值&#xff0c;有需要的朋友可以了解一下&#xff0c;希望能够对你有所帮助。 在做数据迁移&#xff0c;数据清洗或者写web项目时要将数据替换更新&#xff0c;那么有时要将表做清空处理 常用的清空数据表…

mysql删除表中所有数据_MySQL删除或清空表中数据的方法

原标题&#xff1a;MySQL删除或清空表中数据的方法 要想把MySQL中的数据删除或清空&#xff0c;可以通过两种方法来实现&#xff1a;DELETE语句和TRUNCATE TABLE语句。 DELETE语句可以将表中所有记录都删除&#xff0c;也可以指定WHERE子句&#xff0c;对要删除的记录进行选择;…

清空MySQL单库下所有表数据 || 删除MySQL单库下所有表

一、清空MySQL单库下所有表数据 -- 清空MySQL单库下所有表数据 SELECT CONCAT(truncate table ,TABLE_NAME,;) AS PLEASE_EXEC_ALL_SQL FROMinformation_schema.TABLES WHERETABLE_SCHEMA datagateway_std;如下图&#xff0c;然后复制所有查询结果&#xff0c;依次执行清表命…

Mysql如何清空数据库中所有的表数据

“db”是数据库名称 SELECT CONCAT(truncate table ,TABLE_NAME,;) AS a FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA db ; 全部复制出来运行即可 有外键约束的话&#xff0c;我们可以使用 SET FOREIGN_KEY_CHECKS0; 来禁用外键约束&#xff0c;执行完我们的语句之…

90个外国英文网站强力推荐!!!

2019独角兽企业重金招聘Python工程师标准>>> http://www.mtime.com/group/lazy/discussion/163374/ 转载于:https://my.oschina.net/crazyinsomnia/blog/2739

常用的英文文献网站

最常用的英文文献网站当然是&#xff1a;sci-hub。 除此之外&#xff0c;推荐几个比较常用的英文文献网站&#xff1a; Elsevier ScienceDirect 数据库试用&#xff1a; http://www.sciencedirect.com 科学引文索引数据库&#xff08;SCI&#xff09;学术资源&#xff1a; h…

十大实用网站推荐(1)

Iiconfont矢量图标库http://www.iconfont.cn/设计师必备网站&#xff0c;成千上万个矢量图标&#xff0c;真正的“图标库”&#xff1a; 稿定设计https://www.gaoding.com/有点懒&#xff1f;抠图太麻烦&#xff1f;做设计有点烦&#xff1f;来这个网站看看吧&#xff0c;懒人…

英语网站学习

一说到英语学习网站&#xff0c;脑子里肯定就是啥BBC&#xff0c;TED&#xff0c;华尔街日报啊&#xff0c;但如果你是英语小白&#xff0c;你一定看的懂吗&#xff1f;太多的专业词汇&#xff0c;看都看不懂&#xff0c;还怎么帮助你快速提升英语&#xff1f;英语网站是学习的…

强烈推荐这 15 个网站!

作者 | ithuangqing 来源 | 编码之外&#xff08;ID&#xff1a;ithuangqing&#xff09; 电子书&#xff1f;纸质书&#xff1f;我喜欢免费 不得不说&#xff0c;纸质书看起来是最有感觉的&#xff0c;可是纸质书也有非常不好的两点&#xff1a; 搬家的时候真的头大贵&#x…

常用的15个国外网站

1.Random-Image-Api 地址&#xff1a;https://source.unsplash.com/ Random-Image-Api 一个能够获取随机图片的 Api&#xff0c;基于 Spring Boot 构建可读取本地图片列表的地址&#xff0c;并提供随机访问服务&#xff0c;可配置域名白名单访问。 2. Carbon 地址&#xff1…

国外有什么好的网站推荐?

先来一张用百度脑图做的“国外优秀网站”思维导图&#xff0c;让你一目了然。 / 一&#xff0c;知识类 1、维基百科-自由的百科全书&#xff1a;点击打开链接 2、Coursera-致力于普及全世界最好的教育:点击打开链接 3、IMDB- 互联网电影资料库:点击打开链接http://www. …

国外常用网站

作者&#xff1a;Allen9527 链接&#xff1a;https://www.zhihu.com/question/20247711/answer/113476501 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 放眼看世界&#xff0c;才能看得更远 &#xff08;持续更…

浅谈什么是嵌入式以及嵌入式就业前景

近期&#xff0c;很多问我什么是嵌入式&#xff1f;其实关于这个问题真的不好实际性的形容表达&#xff0c;毕竟不是一个实物和东西&#xff0c;让你看到见摸的着&#xff0c;但是它确实存在你的生活中&#xff0c;工作中。今天粤嵌就来浅谈一下&#xff0c;什么是嵌入式以及嵌…

嵌入式软件开发工程师就业发展前景怎么样?

嵌入式技术虽然不是新兴的技术&#xff0c;但是随着科学的不断发展&#xff0c;嵌入式能应用的领域也越来越多&#xff0c;例如人工智能、互联网等&#xff0c;这么说起来嵌入式开发工程师的就业前景应该会很不错&#xff0c;下面小编就具体的为大家介绍关于嵌入式软件开发和硬…

嵌入式人才发展前景

嵌入式计算机在应用数量上远远超过了各种通用计算机&#xff0c;一台通用计算机的外部设备中就包含了5-10个嵌入式微处理器。嵌入式发展前景怎样呢?嵌入式系统在制造工业、过程控制、网络、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等方面均是嵌入式计…