OpenCV,在图像中,直观显示HOG特征值

HOG特征提取算法的实现过程:
大概过程:
HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);
2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
4)将图像划分成小cells(例如6*6像素/cell);
5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

OpenCV,在图像中,直观显示HOG特征值_第1张图片

hog.winSize = Size(200, 128);
hog.blockSize = Size(48, 48);
hog.blockStride = Size(8, 8);
hog.cellSize = Size(24, 24);

显示结果:

OpenCV,在图像中,直观显示HOG特征值_第2张图片

hog.winSize = Size(200, 128);
hog.blockSize = Size(24, 24);
hog.blockStride = Size(4, 4);
hog.cellSize = Size(12, 12);

OpenCV,在图像中,直观显示HOG特征值_第3张图片

hog.winSize = Size(200, 128);
hog.blockSize = Size(12, 12);
hog.blockStride = Size(2, 2);
hog.cellSize = Size(6, 6);

OpenCV,在图像中,直观显示HOG特征值_第4张图片

#include   
#include   
#include   
#include   
#include 
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

// HOGDescriptor visual_imagealizer
// adapted for arbitrary size of feature sets and training images
Mat get_hogdescriptor_visual_image(Mat& origImg,
	vector& descriptorValues,//hog特征向量
	Size winSize,//图片窗口大小
	Size cellSize,
	int scaleFactor,//缩放背景图像的比例
	double viz_factor)//缩放hog特征的线长比例
{
	Mat visual_image;//最后可视化的图像大小
	resize(origImg, visual_image, Size(origImg.cols*scaleFactor, origImg.rows*scaleFactor));

	int gradientBinSize = 9;
	// dividing 180° into 9 bins, how large (in rad) is one bin?
	float radRangeForOneBin = 3.14 / (float)gradientBinSize; //pi=3.14对应180°

	// prepare data structure: 9 orientation / gradient strenghts for each cell
	int cells_in_x_dir = winSize.width / cellSize.width;//x方向上的cell个数
	int cells_in_y_dir = winSize.height / cellSize.height;//y方向上的cell个数
	int totalnrofcells = cells_in_x_dir * cells_in_y_dir;//cell的总个数
	//注意此处三维数组的定义格式
	//int ***b;
	//int a[2][3][4];
	//int (*b)[3][4] = a;
	//gradientStrengths[cells_in_y_dir][cells_in_x_dir][9]
	float*** gradientStrengths = new float**[cells_in_y_dir];
	int** cellUpdateCounter = new int*[cells_in_y_dir];
	for (int y = 0; y des;
	Mat dst;
	cout << "src_width= " << src.size << " cols= " << src.cols << " rows= " << src.rows << endl;
	resize(src, dst, Size(src.cols / 5, src.rows/5));
	imshow("src", src);
	hog.compute(dst, des);
	Mat d = get_hogdescriptor_visual_image(dst, des, hog.winSize, hog.cellSize, 5, 3.0);
	imshow("dst", d);
	waitKey();

}

你可能感兴趣的:(OpenCV)