HOG特征显示C++ OpenCV代码

来源:互联网 发布:清除电脑垃圾的软件 编辑:程序博客网 时间:2024/05/16 16:23

参考:http://download.csdn.net/detail/u011285477/9472067

#include <opencv2/opencv.hpp>  #include <cstdio>  #include <cstdlib>  #include <Windows.h>  #include "opencvtest.h"using namespace std;using namespace cv;// HOGDescriptor visual_imagealizer// adapted for arbitrary size of feature sets and training imagesMat get_hogdescriptor_visual_image(Mat& origImg,vector<float>& 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 cellint 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<cells_in_y_dir; y++){gradientStrengths[y] = new float*[cells_in_x_dir];cellUpdateCounter[y] = new int[cells_in_x_dir];for (int x = 0; x<cells_in_x_dir; x++){gradientStrengths[y][x] = new float[gradientBinSize];cellUpdateCounter[y][x] = 0;for (int bin = 0; bin<gradientBinSize; bin++)gradientStrengths[y][x][bin] = 0.0;//把每个cell的9个bin对应的梯度强度都初始化为0}}// nr of blocks = nr of cells - 1// since there is a new block on each cell (overlapping blocks!) but the last one//相当于blockstride = (8,8)int blocks_in_x_dir = cells_in_x_dir - 1;int blocks_in_y_dir = cells_in_y_dir - 1;// compute gradient strengths per cellint descriptorDataIdx = 0;int cellx = 0;int celly = 0;for (int blockx = 0; blockx<blocks_in_x_dir; blockx++){for (int blocky = 0; blocky<blocks_in_y_dir; blocky++){// 4 cells per block ...for (int cellNr = 0; cellNr<4; cellNr++){// compute corresponding cell nrint cellx = blockx;int celly = blocky;if (cellNr == 1) celly++;if (cellNr == 2) cellx++;if (cellNr == 3){cellx++;celly++;}for (int bin = 0; bin<gradientBinSize; bin++){float gradientStrength = descriptorValues[descriptorDataIdx];descriptorDataIdx++;gradientStrengths[celly][cellx][bin] += gradientStrength;//因为C是按行存储} // for (all bins)// note: overlapping blocks lead to multiple updates of this sum!// we therefore keep track how often a cell was updated,// to compute average gradient strengthscellUpdateCounter[celly][cellx]++;//由于block之间有重叠,所以要记录哪些cell被多次计算了} // for (all cells)} // for (all block x pos)} // for (all block y pos)// compute average gradient strengthsfor (int celly = 0; celly<cells_in_y_dir; celly++){for (int cellx = 0; cellx<cells_in_x_dir; cellx++){float NrUpdatesForThisCell = (float)cellUpdateCounter[celly][cellx];// compute average gradient strenghts for each gradient bin directionfor (int bin = 0; bin<gradientBinSize; bin++){gradientStrengths[celly][cellx][bin] /= NrUpdatesForThisCell;}}}cout << "winSize = " << winSize << endl;cout << "cellSize = " << cellSize << endl;cout << "blockSize = " << cellSize * 2 << endl;cout << "blockNum = " << blocks_in_x_dir << "×" << blocks_in_y_dir << endl;cout << "descriptorDataIdx = " << descriptorDataIdx << endl;// draw cellsfor (int celly = 0; celly<cells_in_y_dir; celly++){for (int cellx = 0; cellx<cells_in_x_dir; cellx++){int drawX = cellx * cellSize.width;int drawY = celly * cellSize.height;int mx = drawX + cellSize.width / 2;int my = drawY + cellSize.height / 2;rectangle(visual_image,Point(drawX*scaleFactor, drawY*scaleFactor),Point((drawX + cellSize.width)*scaleFactor,(drawY + cellSize.height)*scaleFactor),CV_RGB(0, 0, 0),//cell框线的颜色1);// draw in each cell all 9 gradient strengthsfor (int bin = 0; bin<gradientBinSize; bin++){float currentGradStrength = gradientStrengths[celly][cellx][bin];// no line to draw?if (currentGradStrength == 0)continue;float currRad = bin * radRangeForOneBin + radRangeForOneBin / 2;//取每个bin里的中间值,如10°,30°,...,170°.float dirVecX = cos(currRad);float dirVecY = sin(currRad);float maxVecLen = cellSize.width / 2;float scale = viz_factor; // just a visual_imagealization scale,// to see the lines better// compute line coordinatesfloat x1 = mx - dirVecX * currentGradStrength * maxVecLen * scale;float y1 = my - dirVecY * currentGradStrength * maxVecLen * scale;float x2 = mx + dirVecX * currentGradStrength * maxVecLen * scale;float y2 = my + dirVecY * currentGradStrength * maxVecLen * scale;// draw gradient visual_imagealizationline(visual_image,Point(x1*scaleFactor, y1*scaleFactor),Point(x2*scaleFactor, y2*scaleFactor),CV_RGB(255, 255, 255),//HOG可视化的cell的颜色1);} // for (all bins)} // for (cellx)} // for (celly)// don't forget to free memory allocated by helper data structures!for (int y = 0; y<cells_in_y_dir; y++){for (int x = 0; x<cells_in_x_dir; x++){delete[] gradientStrengths[y][x];}delete[] gradientStrengths[y];delete[] cellUpdateCounter[y];}delete[] gradientStrengths;delete[] cellUpdateCounter;return visual_image;//返回最终的HOG可视化图像}int main(){HOGDescriptor hog;//使用的是默认的hog参数/*HOGDescriptor(Size win_size=Size(64, 128), Size block_size=Size(16, 16), Size block_stride=Size(8, 8),Size cell_size=Size(8, 8), int nbins=9, double win_sigma=DEFAULT_WIN_SIGMA(DEFAULT_WIN_SIGMA=-1),double threshold_L2hys=0.2, bool gamma_correction=true, int nlevels=DEFAULT_NLEVELS)Parameters:win_size – Detection window size. Align to block size and block stride.block_size – Block size in pixels. Align to cell size. Only (16,16) is supported for now.block_stride – Block stride. It must be a multiple of cell size.cell_size – Cell size. Only (8, 8) is supported for now.nbins – Number of bins. Only 9 bins per cell are supported for now.win_sigma – Gaussian smoothing window parameter.threshold_L2hys – L2-Hys normalization method shrinkage.gamma_correction – Flag to specify whether the gamma correction preprocessing is required or not.nlevels – Maximum number of detection window increases.*///对于128*80的图片,blockstride = 8,15*9的block,2*2*9*15*9 = 4860Mat src = imread("E:\\C++WorkPlace\\myHOGvisualize\\myHOGvisualize\\img.jpg");//注意这里边的双斜杠!!!!!!!!!!int src_width = src.cols;int src_height = src.rows;int width = src_width;int height = src_height;hog.winSize = Size(width, height);vector<float> des;//HOG特征向量Mat dst;resize(src, dst, Size(width, height));//规范图像尺寸imshow("src", src);hog.compute(dst,des);//计算hog特征Mat background = Mat::zeros(Size(width,height),CV_8UC1);//设置黑色背景图,因为要用白色绘制hog特征Mat d = get_hogdescriptor_visual_image(background,des,hog.winSize,hog.cellSize,3,2.5);imshow("dst",d);imwrite("hogvisualize.jpg",d);waitKey();return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 wps表格密码忘了怎么办 word文档变成虚的怎么办 wps论文中表格跨页怎么办 word文档复制过来有边框怎么办 wps表格跨页断开怎么办 锅的铆钉老是松怎么办 文胸不知道怎么染色了怎么办 未后的信息我该怎么办? 做leep手术后大出血怎么办 眼线笔出不了水怎么办 手机字体变成空心字怎么办 平安树树枝黑了怎么办 柳树被虫钻洞了怎么办 柳树叶子上有虫子怎么办 小金鱼翻肚皮了怎么办 秋天树叶没了小鸟怎么办 去国外旅游不会英语怎么办 橡皮树长了2米高怎么办 榕树盆景长的高怎么办? 2岁宝宝看书弯腰低头怎么办 excel表格打开很慢怎么办 3d模型有红线框怎么办 电视页面加载时错误怎么办 投屏显示加载视频错误怎么办 word遇到问题需要关闭怎么办 画眼线看不出来怎么办 14岁眼皮很松怎么办啊 ps存不了psd格式怎么办 花草上有白色物怎么办 ps抠出来有白边头发怎么办 脸上结痂掉了有红印怎么办 海棠花瓣干枯怎么办茎变软 微信上的图片打不开怎么办 口红吊兰老掉叶子怎么办 翠叶竹芋叶子卷怎么办 牙有龋齿垫底以后酸怎么办 事业单位辞职请示30天不批怎么办 孕早期吃了油菜怎么办 实体店买到翻新苹果手机怎么办 太阳花叶子蔫了怎么办 刚摘下来的多肉怎么办