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区域-方向梯度直方图的主要内容,如果未能解决你的问题,请参考以下文章