通俗来讲,目标检测就是从一副图片中检测特定的物体目标,获得目标的类别信息和位置信息。目标特征提取可以使用Hog算子,判断物体的类别则可以使用SVM实现。
hog(方向梯度直方图)
在一副图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述。其本质为梯度的统计信息,而梯度主要存在于边缘的地方。例如猫和狗因为形状不同,其hog特征也就不同,可以分别表示为dogHog和catHog。
OpenCV中使用HOGDescriptor这个类封装了hog特征提取函数。
HOGDescriptor hog;hog.compute(img, dogHog, Size(8, 8));
svm(支持向量机)
支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。利用svm可以判断一个hog特征是否属于一个类。
svm训练时需要正样本和负样本,训练结果是一个分类器。例如我们收集大量猫的图片,提取每张图中猫的hog特征作为正样本,再收集大量不带有猫的图片,提取他们的hog特征作为负样本。训练将得到一个识别猫的分类器。
/*创建和初始化svm对象*/ Ptr<:svm> svm = ml::SVM::create();svm->setType(ml::SVM::C_SVC);svm->setKernel(ml::SVM::LINEAR);svm->setTermCriteria(TermCriteria(CV_TERMCRIT_ITER, 1000, FLT_EPSILON));//使用SVM学习 svm->train(sampleFeatureMat, ml::ROW_SAMPLE, sampleLabelVec);
案例
下面给出一个识别交通标志的案例
待设别标志
![f5a9451af05c47904c5bf2ccb5e86a7c.png](https://img-blog.csdnimg.cn/img_convert/f5a9451af05c47904c5bf2ccb5e86a7c.png)
识别效果
![971fe39d951ca294eac7d1fd42ff3ee6.png](https://img-blog.csdnimg.cn/img_convert/971fe39d951ca294eac7d1fd42ff3ee6.png)
正样本集链接:https://pan.baidu.com/s/1sTCN6drFSWh8ExGWOibtXw 提取码:ms2p
负样本集链接:https://pan.baidu.com/s/1QvxqIYqc7mhwAd3xbx9uZA 提取码:jyjj
训练分类器
/************************
*
*trainHogSvm 训练分类器
hog:hog对象
posPath:记录正样本图片路径的txt文本文件
![04ad2b1838262a4c043667a04c96f492.png](https://img-blog.csdnimg.cn/img_convert/04ad2b1838262a4c043667a04c96f492.png)
posPath:记录负样本图片路径的txt文本文件
![7b5f7c6ad56bd94274b1d604432cf664.png](https://img-blog.csdnimg.cn/img_convert/7b5f7c6ad56bd94274b1d604432cf664.png)
***********************/
vector trainHogSvm(HOGDescriptor &hog, string posPath, string neg