OpenCv-C++-HOG特征检测算法

HOG主要是用来做行人检测的,HOG方法是基于对稠密网格中归一化的局部方向梯度直方图的计算。此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。在实际操作中,将图像分为小的元胞(cells),在每个元胞内累加计算出一维的梯度方向(或边缘方向)直方图。为了对光照和阴影有更好的不变性,需要对直方图进行对比度归一化,这可以通过将元胞组成更大的块(blocks)并归一化块内的所有元胞来实现。归一化的块描述符就叫作HOG描述子。将检测窗口中的所有块的HOG描述子组合起来就形成了最终的特征向量,然后使用SVM分类器进行行人检测。
参考资料:https://www.cnblogs.com/wyuzl/p/6792216.html

具体步骤参考这篇文章:https://blog.csdn.net/icvpr/article/details/8454527

在OpenCv中,已经有训练好的相关API可以使用:
HOGDescriptor hog = HOGDescriptor():
参数使用及说明参考:https://blog.csdn.net/qq_26898461/article/details/46786285
hog.setSVMDetector();
hog.detectMultiScale():
detectMultiscale函数为多尺度多目标检测。
(1)多尺度:通常搜索目标的模板尺寸大小是固定的,但是不同图片大小不同,所以目标对象的大小也是不定的,所以多尺度即不断缩放图片大小(缩放到与模板匹配),通过模板滑动窗函数搜索匹配;同一副图片可能在不同尺度下都得到匹配值,所以多尺度检测函数detectMultiscale是多尺度合并的结果。
(2)多目标:通过检测符合模板匹配对象,可得到多个目标,均输出到objects向量里面。
参考:https://blog.csdn.net/yanrong1095/article/details/78685390

源码:

#include
#include
#include


using namespace cv;
using namespace std;

Mat src;
int main(int argc, char** argv)
{
	src = imread("D:/test/pepole.png");
	if(!src.data)
	{
		cout << "图片未找到!" << endl;
		return -1;
	}
	imshow("input title",src);
	/*resize(src, src, Size(64, 128));
	
	HOGDescriptor detector = HOGDescriptor(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);
	vectordescriptions;
	vectorpoints;
	detector.compute(src, descriptions, Size(0, 0), Size(0, 0), points);
	cout << "the number of HOG descriptions:" <foundlocations;
	hog.detectMultiScale(src, foundlocations, 0, Size(3, 3), Size(32, 32),1.05,2);
	//根据图片需要随时调整Size()大小
	for (size_t i = 0; i < foundlocations.size(); i++)
	{
		//cout << "foundlocation:" << foundlocations[i] << endl;
		rectangle(resultImg, foundlocations[i], Scalar(0, 0, 255), 2, 8, 0);
	}
	
	imshow("HOG SVM demo", resultImg);
	waitKey(0);
	return 0;


}

运行结果:
在这里插入图片描述

在这里插入图片描述

你可能感兴趣的:(OpenCv-C++学习记录,HOG+SVM,特征检测,行人检测)