OpenCV自带了函数detectMultiScale()可以实现对行人的检测,该算法采用的是hog算法,这一节我们学习其内置的HOG+SVM算法的应用。 HOG(Histogram of Oriented Gridients的简写)特征检测算法,最早是由法国研究员Dalal等在CVPR-2005上提出来的,是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度直方图来构成特征。其主要思想是:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓。
Dalal等提出的HOG+SVM算法,在进行行人检测取得了极大地成功后,更多新算法不断涌现,不过大都是以HOG+SVM的思路为主线。
我们编写演示代码,观察实验效果:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( )
{
Mat src_img = imread("test16.jpg");
if (src_img.empty())
{
printf("could not load the image...\n");
return -1;
}
namedWindow("原图", CV_WINDOW_AUTOSIZE);
imshow("原图", src_img);
// HOG-SVM行人检测
HOGDescriptor hog = HOGDescriptor();
hog.setSVMDetector(hog.getDefaultPeopleDetector());
vector<Rect> foundLocations;
hog.detectMultiScale(src_img, foundLocations, 0, Size(8, 8), Size(32, 32), 1.05, 2);
Mat result_img = src_img.clone();
for (auto t = 0; t < foundLocations.size(); ++t)
{
rectangle(result_img, foundLocations[t], Scalar(0, 0, 255), 2, 8, 0);
}
namedWindow("HOG-SVM Detector", CV_WINDOW_AUTOSIZE);
imshow("HOG-SVM Detector", result_img);
waitKey(0);
return 0;
}
运行程序,如下所示: