微信与与网站建设,xml网站模板,wordpress相同字段调用,厦门网页设计学校一.目标检测技术
目前常用实用性目标检测与跟踪的方法有以下两种#xff1a; 帧差法
识别原理#xff1a;基于前后两帧图像之间的差异进行对比#xff0c;获取图像画面中正在运动的物体从而达到目标检测
缺点#xff1a;画面中所有运动中物体都能识别
举个例子#xf…一.目标检测技术
目前常用实用性目标检测与跟踪的方法有以下两种 帧差法
识别原理基于前后两帧图像之间的差异进行对比获取图像画面中正在运动的物体从而达到目标检测
缺点画面中所有运动中物体都能识别
举个例子我们的目标是识别运动的车辆但是在画面中镜头晃动大风吹过树叶飘动也会被计算在甄别范围内这就会导致甄别物出现错误 级联分类器
那么有没有更好的方式能降低我们甄别目标出现错误的概率呢
这边就可以使用我们的级联分类器了如果我们的识别目标是车辆那就需要把车辆相关的信息全部统计出来比如车辆颜色、车辆形状、车辆大小等信息将他们存储在一个文件中以提高甄别准确度这个文件就是级联分类器
级联分类器也是机器视觉和机器学习中非常重要的一个环节 二.样本采集工作原理
使用基于Haar特征的级联分类器的对象检测这是一种基于机器学习的方法其中从许多正负图像中训练级联函数然后用于检测其他图像中的对象在这里我将进行人脸检测举例说明最初该算法需要大量正图像面部图像和负图像无面部图像来训练分类器 然后我们需要从中提取特征为此使用下图所示的Haar功能 它们就像我们的卷积核一样每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值。 三.创建自己的级联分类器
1.准备好样本图像 正样本数据采集我们需要检识别的目标图片例如车辆 负样本数据采集非检测物的图片 2.环境配置OpenCV win10
下载OpenCV win10系统安装包
从安装包中的opencv\build\x64\vc15\bin 找到 - opencv_createsamples.exe - opencv_traincascade.exe - opencv_world342.dll
将以上文件拷贝到正负样本文件路径下 3.设置路径
创建正负样本的图像路径的 .txt文件 4.实现样本数据采集
调用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下终端运行如下图所示 5.实现样本数据训练
调用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下终端运行进行训练每一层训练都会有显示如下图所示 6.生成级联分类器文件
生成文件如下所示 四.代码实现
我们将继续编写代码通过C 编写 OpenCV 在Qt上来展现出我们的案例效果
#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); //调用级联分类器进行模型匹配并框出内容 vectorRectcars; //【参数说明】 待检测的图片帧 被检测物体的矩形向量容器 每次搜索减小的图像比例 检测目标周围相邻矩形的最小个数(此处设为2个) 类型 目标区域的大小尺寸 cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25)); vectorRect::const_iterator iter; //【绘制标记框】注意,标记要画在原帧上,要讲方框的大小和帧坐标扩大,因为是根据灰度图识别的,灰度图被缩小了 for(itercars.begin();iter!cars.end();iter) { rectangle(frame, cvPoint(cvRound(iter-x*scale),cvRound(iter-y*scale)), cvPoint(cvRound((iter-xiter-width)*scale),cvRound((iter-yiter-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;
} 为了方便对比再次使用帧差法实现可以看到移动的电动车都被识别进去了如下图所示
帧差法实现如下图所示