前一篇文章《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-