点击蓝字关注我们
前一篇文章《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.加载训练文件
//加载训练文件
cv::Ptr 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-
Vaccae的往期经典
OpenCV
《C++ OpenCV案例实战---卡号获取》
《C++ OpenCV案例实战---卡片截取(附代码)》
《C++ OpenCV透视变换---切换手机正面图片》
《C++ OpenCV实战---获取数量》
《C++ OpenCV实战---利用颜色分割获取数量》
《OpenCV4Android NDK方式进行Canny边缘检测》
《OpenCV4Android NDK方式TesserartOCR实时进行识别》
《OpenCV4Android NDK级联方式实时进行人脸检测》
《OpenCV4Android NDK稠密光流调用》
《OpenCV4Android NDK背景消除建模(新Demo附源码)》
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
《Android根据类生成签名字符串》
《Android碎片化布局fragment的实战应用》
《Android中RecyclerView嵌套RecyclerView》
《Android里用AsyncTask后的接口回调》
.Net C#
《C#自定义特性(Attribute)讲解与实际应用》
《C#根据类生成签名字符串(附DEMO下载地址)》
《C++创建动态库C#调用》
《C#与三菱PLC(型号FX2N)串口通讯类》
《C#开源跨平台机器学习框架ML.NET----二元分类情绪分析》
《C#开源跨平台机器学习框架ML.NET----结合SqlSugar进行多类分类》
数据库及其它
《Oracel存储过程写报表实战》
《Delphi轮播视频和图片程序(用于双屏显示程序)》
《SQL随机增加销售数据的脚本编写(附脚本下载地址)》
《SQL Server中With As的介绍与应用(三)--递归的实战应用》
《Oracle通过ODBC连接SQL Server数据库》
《Oracle利用row_number()over()方式解决插入数据时重复键的问题》
请扫码
给个关注
微卡智享