一.对于HOG特征原理的理解
参考:https://bbs.csdn.net/topics/391911195?page=1
HOG的核心思想是所检测的局部物体外形能够被光强梯度或边缘方向的分布所描述。通过将整幅图像分割成小的连接区域(称为cells),每个cell生成一个方向梯度直方图或者cell中pixel的边缘方向,这些直方图的组合可表示出(所检测目标的目标)描述子。为改善准确率,局部直方图可以通过计算图像中一个较大区域(称为block)的光强作为measure被对比标准化,然后用这个值(measure)归一化这个block中的所有cells.这个归一化过程完成了更好的照射/阴影不变性。
与其他描述子相比,HOG得到的描述子保持了几何和光学转化不变性(除非物体方向改变)。因此HOG描述子尤其适合人的检测。
通俗的讲:
HOG特征提取方法就是将一个image:
灰度化(将图像看做一个x,y,z(灰度)的三维图像)
划分成小cells(22)
计算每个cell中每个pixel的gradient(即orientation)
统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor
再小谈下Hog、SIFT与PCA-SIFT的应用与区别:
Hog没有旋转和尺度不变性,因此计算量小;而SIFT中每个feature需要用128维的向量来描述,因此计算量相对很大。
那么行人检测中怎么应用HOG呢?
对于解决Scale-invariant 的问题:将图片进行不同尺度的缩放,就相当于对模板进行不同尺度scale的缩放。
对于解决Rotation-invariant 的问题:建立不同方向的模版(一般取157的)进行匹配。
总的来说,就是在不同尺度上的图像进行不同方向的模板(15*7)匹配,每个点形成一个8方向的梯度描述。
二.API的介绍
https://www.cnblogs.com/long5683/p/9735903.html
三.HOG的最大作用
Hog+SVM 行人检测
https://blog.csdn.net/andylanzhiyong/article/details/84678447
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("E:\\pictures\\38.jpg");
if (src.empty())
{
cout << "图片读取错误!" << endl;
return -1;
}
HOGDescriptor hog = HOGDescriptor();
hog.setSVMDetector(hog.getDefaultPeopleDetector());
vector<Rect> foundLocations;
hog.detectMultiScale(src, foundLocations, 0, Size(8, 8), Size(32, 32), 1.05, 2);
Mat result = src.clone();
for (size_t t = 0; t < foundLocations.size(); t++)
{
//将找到的行人用矩形框表现出来
rectangle(result, foundLocations[t], Scalar(0, 0, 255), 2, 8, 0);
}
imshow("HOG SVM Detector Demo", result);
waitKey();
return 0;
}
输出图: