C++使用opencv调用级联分类器来识别目标物体的详细流程_第1页
C++使用opencv调用级联分类器来识别目标物体的详细流程_第2页
C++使用opencv调用级联分类器来识别目标物体的详细流程_第3页
C++使用opencv调用级联分类器来识别目标物体的详细流程_第4页
C++使用opencv调用级联分类器来识别目标物体的详细流程_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++使用opencv调用级联分类器来识别目标物体的详细流程目录前言:流程讲解:1.创建一个级联分类器对象2.创建一个视频流3.将传入的视频帧转换为灰度图4.将多余的空通道进行压缩5.直方图均衡化6.调用级联分类器,并将内容框出,然后将此帧显示出来总结使用编译器:QtCreator4.2.1

前言:

相较于帧差法捕捉目标物体识别,级联分类器识别目标物体更加具有针对性,使用前者只要是动的物体都会被捕捉识别到,画面里有一点风吹草动,都会被捕捉识别下来,如果我想识别具体的人或者物,都无法做到精准的目标识别,所以有了级联分类器识别(即模型识别),会按照训练好的级联分类器(模型)来进行目标识别

流程讲解:

1.创建一个级联分类器对象

创建一个级联分类器对象,并读取已经已经训练好的模型

CascadeClassifiercascade;//级联分类器(模型)

cascade.load("D:/Qt_Opencv_Project/cars.xml");//读取级联分类器

2.创建一个视频流

读取一个要识别的视频路径

Matframe;

VideoCapturecap("D:/VideoTraining/carMove.mp4");

while(cap.read(frame))

imshow("video",frame);//将读到的帧显示出来

datectCarDaw(frame,cascade,2);//将读到的帧传入函数用作识别

waitKey(25);//延时25ms,避免播放过快

}

3.将传入的视频帧转换为灰度图

转换为灰度图,色彩通道缩小一半,减少图片数据计算量,提升计算速度

Matgray;

//转换为灰度图,色彩通道缩小一半

cvtColor(frame,gray,CV_RGB2GRAY);

效果如下:

4.将多余的空通道进行压缩

原通道为RGB三通道图片数据,转换为灰度图后,变为单通道数据,多余的通道可以压缩掉,可以看到图片减小三分之二

//再将灰度图缩小一半

Matsmalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);

resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);

效果如下:

可以发现,图一下子小了很多,大大降低了计算量

5.直方图均衡化

将缩小一半的灰度图进行均衡化,使其更加黑白分明,增强局部的对比度,便于计算机识别

//直方图均衡化:将缩小一半的灰度图进行均值化使其更加黑白分明

equalizeHist(smalling,smalling);

效果如下:

降低了渐进效果的像素数目,更加的黑白分明

6.调用级联分类器,并将内容框出,然后将此帧显示出来

调用读取已经训练好的模型,调用detectMultiScale函数器参数含义为:

待检测的图片帧(此处为均衡化后的图片帧)

被检测物体的矩形向量容器(调用前声明了一个向量容器cars)

每次搜索减小的图像比例(每次缩小1.05倍,扫描的细致一点)

检测目标周围相邻矩形的最小个数(此处设为5个,此处视道路情况可以适当增加个数)

类型(扫描类型)

目标区域可能的最小尺寸(此处为25*25,太小了会识别不到,太大了可能几辆车贴的很近可能只能识别出一辆)

//调用级联分类器进行模型匹配并框出内容

vectorRectcars;

//此函数参数说明:待检测的图片帧被检测物体的矩形向量容器每次搜索减小的图像比例

//检测目标周围相邻矩形的最小个数(此处设为2个)类型目标区域的大小尺寸

cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));

vectorRect::const_iteratoriter;

//绘制方块,标记目标,注意,标记要画在原帧上,要讲方框的大小和帧坐标扩大,因为是根据灰度图识别的,灰度图被缩小了

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);

效果如下:

循环显示每一帧,最终成果展示:

博主所使用的这个模型训练的样本较为有限,主要训练的是普通轿车的车头,车尾训练较少,货车等其他车型没有做特别的训练,所以只能保证识别轿车的车头

可以根据实际车流量和车辆距离摄像头的距离来调整最小目标大小和最大矩形框个数

代码:

#includeiostream

#includeopencv2/opencv.hpp

usingnamespacecv;

usingnamespacestd;

voiddatectCarDaw(Matframe,CascadeClassifiercascade,doublescale)

Matgray;

//转换为灰度图,色彩通道缩小一半

cvtColor(frame,gray,CV_RGB2GRAY);

//imshow("huidu",gray);

//再将灰度图缩小一半

Matsmalling(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);

//调用级联分类器进行模型匹配并框出内容

vectorRectcars;

//此函数参数说明:待检测的图片帧被检测物体的矩形向量容器每次搜索减小的图像比例检测目标周围相邻矩形的最小个数(此处设为2个)类型目标区域的大小尺寸

cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));

vectorRect::const_iteratoriter;

//绘制方块,标记目标,注意,标记要画在原帧上,要讲方框的大小和帧坐标扩大,因为是根据灰度图识别的,灰度图被缩小了

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);

intmain(intargc,char*argv[])

CascadeClassifiercascade;//级联分类器(模型)

cascade.load("D:/Qt_Opencv_Project/cars.xml");//读取级联分类器

//cascade.load("D:/Qt_Opencv_Project/face.xml");

Matframe;

VideoCapturecap("D:/VideoTraining/carMove.mp4");

//VideoCapturecap(0);

while(cap.read(frame))

imshow("video",frame);//将读到的帧显示出来

datectCarDaw(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论