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

2021-07-01 15:50:16 浏览数 (1)

前一篇文章《C OpenCV SVM实战Kindle检测(一)----训练数据》我们除了介绍了一下SVM,并且做了对Kindle的图片进行了数据的训练,生成了模型文件,这一篇我们就主要来看看怎么识别预测。

按照惯例,我们再放一个检测的视频。

视频演示效果

代码实现

01

新建SVM识别项目

我们新建一个opencv-svm的项目,然后在源文件中新建一个svmpredict.cpp文件,OpenCV的配置还是参考《VS2017配置OpenCV通用属性》。

02

定义参数

程序开始时,我们加入了训练文件的定义位置,还有在opencv-svmtrain项目中的那个hog_deal的方法,这个方法在上一篇《》有介绍,这里就不再详细说明。

03

目标检测

★ 检测流程 ★

01

加载训练文件

02

加载视频文件

03

视频中每一帧的读取

04

当前帧的目标检测识别

1.加载训练文件

代码语言:javascript复制
//加载训练文件
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就说明匹配了,我们再用红色画个矩形框即可。

视频中截图

Demo源码地址:

https://github.com/Vaccae/OpenCVSVMDemo.git

-END-

0 人点赞