网络知识 娱乐 C++ OpenCV SVM实战Kindle检测(二)----目标检测

C++ OpenCV SVM实战Kindle检测(二)----目标检测

代码实现

01

新建SVM识别项目

我们新建一个opencv-svm的项目,然后在源文件中新建一个svmpredict.cpp文件。

02

定义参数

程序开始时,我们加入了训练文件的定义位置,还有在opencv-svmtrain项目中的那个hog_deal的方法。

03

目标检测

★ 检测流程 ★

01

加载训练文件

02

加载视频文件

03

视频中每一帧的读取

04

当前帧的目标检测识别

1.加载训练文件

//加载训练文件
cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::load(trainfile);

2、3.加视频文件读取每一帧

上面的红框是读取视频文件,然后下面红框while开始就是代表每一帧的读取。

3.当前帧目标检测

我们上一篇介绍hog的时候,默认生成的winRect的Size就是64*128的,一般网上介绍的图像检测也是从当前帧的图像开始第一个块(block)进行平移的检测,最初用了这个方法,检测时间有点长,如果说单张图片检测还可以容忍,但是在视频中就不行了,太卡,所以这里我们换了一个思路进行检测。

划重点

目标检测

为了能够在视频中进行检测,所以我们直接就在先当前图中寻找轮廓,再根据我们自己的定义判断,排除了不太可能的轮廓最后进行识别,这样明显速度快了很多,像开头视频效果那样,并不卡。

★ 检测流程 ★

01

缩放图像

02

高斯模糊

03

转为灰度图

04

二值化图像

05

形态学闭操作

06

寻找轮廓

07

排除不可能轮廓

08

SVM检测

图像的预处理:高斯模糊,灰度、二值化,闭操作。

寻找轮廓:以前的findContours中没怎么介绍hierarchy,这里上面红框说明应该挺清楚了,下面的红框可以屏蔽后看看视频2的效果,应该就知道为什么要加上这个了,推荐大家下了DEMO后自己试试。

排除不可能的轮廓:这里面我自己定义的是宽高不能小于图像的5分之1,这里也可以自己调试看看。

目标检测:开始还是用了hog_deal进行了预处理,下面的目标识别很简单的,就一个

//进行svm的预测

float result = svm->predict(one_row);

当结果大于0就说明匹配了,我们再用红色画个矩形框即可。

视频中截图

-END-