cell区域-方向梯度直方图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cell区域-方向梯度直方图相关的知识,希望对你有一定的参考价值。

 1 //hog_test方向梯度直方图
 2 cv::Mat hog_feature(cv::Mat img)
 3 {
 4     //std::vector<float> v_hog(12,0.0);   //hog特征向量
 5     cv::Mat v_hog(cv::Size(12,1),CV_32FC1,cv::Scalar(0));//必须初始化,否则结果出乎意料
 6     cv::Mat v_hog_normalize;
 7     float x_gradient, y_gradient;
 8     float hog_amplitude, hog_angle;
 9     int dex;
10     for (int i = 1; i < img.rows-1;i++)
11         for (int j = 1; j < img.cols-1; j++)
12         {
13             x_gradient = img.at<uchar>(i, j + 1) - img.at<uchar>(i, j - 1);
14             y_gradient = img.at<uchar>(i + 1, j) - img.at<uchar>(i - 1, j);
15             hog_amplitude = sqrt(x_gradient*x_gradient + y_gradient*y_gradient);
16             if (x_gradient == 0.0)
17                 v_hog.at<float>(0,0) += hog_amplitude;
18             else
19             {
20                 //hog_angle = cvFastArctan(y_gradient, x_gradient)*CV_PI/180;
21                 hog_angle = atan2(y_gradient,x_gradient);
22                 //printf("%lf\n", hog_angle);
23                 dex = cvFloor( hog_angle*11/(CV_PI*2) + 5.5);//建立(-pi,pi)到(0,11)的映射
24                 
25                 v_hog.at<float>(0,dex) += hog_amplitude;
26             }
27         }
28     //向量归一化
29     normalize(v_hog, v_hog_normalize, 1.0, 0.0, cv::NORM_MINMAX);
30     return v_hog_normalize;
31 }
32 int main()
33 {
34     cv::Mat image = cv::imread("chuang.jpg");
35     cv::Mat gray_image;
36     cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
37     cv::Mat vec = hog_feature(gray_image);
38     std::cout << vec << std::endl;
39 
40     system("pause");
41     return 0;
42 }

问题:1.从for循环可以看出,边界像素没有计算

          2.v_hog在声明时必须初始化,比如Scalar(0),否则结果不正确,这是C语言基础

          3.水平方向梯度为0时,将幅值加入v_hog向量的首部,不知是否正确

          4.访问像素采用.at()的方式,是否有更高效的方式?

平台:visual studio 2013 / opencv3.0

以上是关于cell区域-方向梯度直方图的主要内容,如果未能解决你的问题,请参考以下文章

hog

HOG特征人体检测

HOG特征人体检测

hog特征原理详解及matlab代码学习笔记

图像特征的提取

HOG特征过程解释(转)