1. #include<opencv2\core\core.hpp>
  2. #include<opencv2\highgui\highgui.hpp>
  3. #include<opencv2\opencv.hpp>
  4. #include<iostream>
  5. #include<fstream>
  6.  
  7. using namespace std;
  8. using namespace cv;
  9.  
  10. #define Max 100
  11.  
  12. class Cell{
  13. private:
  14. int pixel_x; //cell的像素的起始位置行坐标;
  15. int pixel_y; //cell的像素的起始位置纵坐标;
  16. Mat img; //待处理的图像,通常该该图像是经过Gamma校正的灰度图;
  17. double pixel[][]; //我们一般默认cell为8*8的像素大小,但是为了储存周边店的像素,需要多加两个像素储存点的位置;
  18. double gradient_M[][]; //保存梯度的幅值;
  19. double gradient_Angle[][]; //保存像素梯度的方向;
  20. double gradient_h[][];
  21. double gradient_v[][];
  22.  
  23. public:
  24. double bin[]; //将梯度方向分成九个方向,在根据具体像素梯度的方向大小,进行投票;
  25. Cell(Mat src){ //构造函数;
  26. img=src;
  27. }
  28.  
  29. void Set_Cell(int x,int y);
  30. void Get_Pixel(); //为了计算机使用方便,我们把一个cell当中的像素先读下来,用pixel[][]数组储存;
  31. void Gradient_Pixel(); //计算机图像像素的梯度幅值和梯度角度;
  32. void Bin_Selection_Normalization(); //根据每个像素的幅值进行维度的区分和归一化,并且返回bin[]数组;
  33. };
  34.  
  35. void Cell::Set_Cell(int x,int y){
  36. pixel_x=x;
  37. pixel_y=y;
  38. }
  39.  
  40. void Cell::Get_Pixel(){
  41. for(int i=pixel_x-,m=;i<pixel_x+;i++,m++){
  42. uchar *data=img.ptr<uchar>(i);
  43. for(int j=pixel_y-,n=;j<pixel_y+;j++,n++){
  44. pixel[m][n]=data[j];
  45. }
  46. }
  47. // for(int i=0;i<9;i++){
  48. // for(int j=0;j<9;j++){
  49. // cout<<i<<j<<" "<<pixel[i][j]<<"\n";
  50. // }
  51. // }
  52. }
  53.  
  54. void Cell::Gradient_Pixel(){
  55. for(int i=;i<;i++){
  56. for(int j=;j<;j++){
  57. gradient_h[i][j]=pixel[i+][j]-pixel[i-][j];
  58. gradient_v[i][j]=pixel[i][j+]-pixel[i][j-];
  59. gradient_M[i][j]=sqrt(gradient_h[i][j]*gradient_h[i][j]+gradient_v[i][j]*gradient_v[i][j]);
  60. gradient_Angle[i][j]=atan2(gradient_h[i][j],gradient_v[i][j])*;
  61. }
  62. }
  63.  
  64. // for(int i=0;i<9;i++){
  65. // for(int j=0;j<9;j++){
  66. // cout<<i<<j<<" "<<gradient_h[i][j]<<" "<<gradient_v[i][j]<<" "<<gradient_M[i][j]<<" "<<gradient_Angle[i][j]<<"\n";
  67. // }
  68. // }
  69. }
  70.  
  71. void Cell::Bin_Selection_Normalization(){
  72. for(int i=;i<;i++){
  73. bin[i]=;
  74. }
  75.  
  76. for(int i=;i<;i++){
  77. for(int j=;j<;j++){
  78. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  79. bin[]=bin[]+gradient_M[i][j];
  80. }
  81. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  82. bin[]=bin[]+gradient_M[i][j];
  83. }
  84. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  85. bin[]=bin[]+gradient_M[i][j];
  86. }
  87. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  88. bin[]=bin[]+gradient_M[i][j];
  89. }
  90. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  91. bin[]=bin[]+gradient_M[i][j];
  92. }
  93. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  94. bin[]=bin[]+gradient_M[i][j];
  95. }
  96. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  97. bin[]=bin[]+gradient_M[i][j];
  98. }
  99. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<)){
  100. bin[]=bin[]+gradient_M[i][j];
  101. }
  102. if((gradient_Angle[i][j]>=&&gradient_Angle[i][j]<=)||(gradient_Angle[i][j]>=&&gradient_Angle[i][j]<=)){
  103. bin[]=bin[]+gradient_M[i][j];
  104. }
  105. }
  106. }
  107. ////////////////////////////////////
  108. //归一化;
  109. double sum_bin=;
  110. for(int i=;i<;i++){
  111. sum_bin=sum_bin+bin[i];
  112. }
  113. for(int i=;i<;i++){
  114. bin[i]=bin[i]/sum_bin;
  115. if(bin[i]>0.2){
  116. bin[i]=0.2;
  117. }
  118. }
  119. sum_bin=;
  120. for(int i=;i<;i++){
  121. sum_bin=sum_bin+bin[i];
  122. }
  123. for(int i=;i<;i++){
  124. bin[i]=bin[i]/sum_bin;
  125. }
  126. }
  127. //Block类部分****************
  128. class Block{
  129. int block_pixel_x; //block的起始像素点横坐标位置;
  130. int block_pixel_y; //block的起始像素点纵坐标位置;
  131. Mat src; //图像必须是灰度图;
  132. double bins[]; //该类主要是对block进行相关处理,我们默认block为四个cell,即2*2;所以bins为36维;
  133. int k;
  134.  
  135. public:
  136. Block(Mat img){
  137. src=img;
  138. k=;
  139. }
  140.  
  141. void Set_Block(int x,int y);
  142. void Cut_Block(); //本人认为这是整个算法当中比较重要的一部分,即图像切割划分部分;
  143. void Block_into_HistImage();
  144. void output_bins();
  145. };
  146.  
  147. void Block::Set_Block(int x,int y){
  148. block_pixel_x=x;
  149. block_pixel_y=y;
  150. }
  151.  
  152. void Block::Cut_Block(){
  153. k=;
  154. Cell cell(src);
  155. for(int i=block_pixel_x, m=;m<;i=i+,m++){
  156. for(int j=block_pixel_y, n=;n<;j=j+,n++){
  157. cell.Set_Cell(i,j);
  158. cell.Get_Pixel();
  159. cell.Gradient_Pixel();
  160. cell.Bin_Selection_Normalization();
  161. for(int i=;i<;i++){
  162. bins[k++]=cell.bin[i];
  163. }
  164. }
  165. }
  166. }
  167.  
  168. void Block::Block_into_HistImage(){ //该部分算法是将bins生成直方图;
  169. int hight=;
  170. int width=;
  171. IplImage *hist_image=cvCreateImage(Size(,),,);
  172. for(int i=;i<;i++){
  173. cvRectangle(hist_image,CvPoint(i*,hight-),CvPoint((i+)*-,hight-bins[i]*),CV_RGB(,,));
  174. }
  175.  
  176. cvNamedWindow("",);
  177. cvShowImage("",hist_image);
  178. cvWaitKey();
  179. }
  180.  
  181. void Block::output_bins(){
  182. //ofstream out ("1.txt");
  183. for(int i=;i<;i++){
  184. cout<<bins[i]<<"\n";
  185. }
  186. cout<<"*******************************************\n";
  187. }
  188.  
  189. int main(){
  190. Mat img=imread("G:/2.png",); //载入图片;
  191. if(img.empty())
  192. {
  193. return -;
  194. }
  195. Mat gray1;
  196. Mat gray;
  197. cvtColor(img,gray1,COLOR_RGB2GRAY);
  198. resize(gray1,gray,Size(,),,,);
  199. namedWindow("gray",);
  200. imshow("gray",gray);
  201. // cvWaitKey(0);
  202. Block block(gray);
  203. for(int i=,m=;m<;m++,i=i+){
  204. for(int j=,n=;n<;n++,j=j+){
  205. block.Set_Block(i,j);
  206. block.Cut_Block();
  207. //block.Block_into_HistImage();
  208. block.output_bins();
  209. }
  210. }
  211. }

Opencv学习之路——自己编写的HOG算法的更多相关文章

  1. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  2. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

  3. OpenCV 学习之路(2) -- 操作像素

    本节内容: 访问像素值 用指针扫描图像 用迭代器扫描图像 编写高效的图像扫描循环 扫描图像并访问相邻像素 实现简单的图像运算 图像重映射 访问像素值 准备工作: 创建一个简单函数,用它在图像中加入椒盐 ...

  4. OpenCV 学习之路(1)

    OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #i ...

  5. opencv学习之路(41)、人脸识别

    一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...

  6. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

  7. opencv学习之路(39)、PCA

    一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...

  8. opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量

    本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...

  9. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

随机推荐

  1. 我所未知的 typeof 现象

    一.一些基本使用测试 从上述可以看出: 1.判断一个 变量 是不是对象类型,不能只用 typeof 运算符: 2.它的返回值一直是一个字符串: 3.尽管 typeof null === 'object ...

  2. 【转】Android 关闭多个视图Intent.FLAG_ACTIVITY_CLEAR_TOP用法

    如果已经启动了四个Activity:A,B,C和D.在D Activity里,我们要跳到B Activity,同时希望C finish掉, 可以在startActivity(intent)里的inte ...

  3. tab不显示为空格

  4. 91. Ext中获取combobox中的valueField和displayField的值

    转自:https://blog.csdn.net/jcy472578/article/details/42113119Ext.getCmp("schemaVersion").val ...

  5. 基于Linux的v4l2视频架构驱动编写(转载)

    转自:http://www.linuxidc.com/Linux/2011-03/33022.htm 其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自 ...

  6. [Swift通天遁地]七、数据与安全-(9)文件的压缩和解压

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. [Swift通天遁地]七、数据与安全-(15)使用单元测试进行代码的性能分析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. Mobile

    模块===包   传统开发:整个网页我们写了一个js文件,所有的特效都写在里面了. 缺点:耦合度太高,代码关联性太强,不便于后期维护,会造成全局污染. 发生的请求次数过多,依赖模糊,难于维护. 以上都 ...

  9. HttpFileCollection 类使用

    public ActionResult GetForm()        {            HttpRequest request = System.Web.HttpContext.Curre ...

  10. asp.net core 2.0 Json结果的格式

    asp.net core 2.0 默认返回的结果格式是Json, 并使用json.net对结果默认做了camel case的转化(大概可理解为首字母小写). 这一点与老.net web api 不一样 ...