现在的位置: 首页 > 综合 > 正文

OpenCV——HoG特征

2012年10月24日 ⁄ 综合 ⁄ 共 2301字 ⁄ 字号 评论关闭

转自http://hi.baidu.com/icekeydnet/blog/item/4555173d265e9aea3b87ce67.html

hog是一个基于梯度的直方图提取算法,用于人体检测十分有效。在opencv2.2+版本里面已经实现。

封装在HOGDescriptor类里。

hog其实就是对一副图片的指定大小区域进行梯度统计。可以直接调用。opencv把它过于复杂化了,用的时候分什么window,block,cell啥的。。。一大堆东西。

这里有三篇很好的文章介绍一下。

http://blog.csdn.net/raocong2010/archive/2011/03/11/6239431.aspx

这篇文章就是对window,block,cell的解释

http://gz-ricky.blogbus.com/logs/85326280.html

这篇文章是对得到的vector结果数组里的结果个数进行的分析。

http://www.cnblogs.com/Anykong/archive/2011/04/06/anykong_opencv1.html

这篇文章是教你如何在vs2010下安装opencv2.2 非常不错的一篇文章。我原来写sift的时候是用的vc6+opencv1.0。

不过有个地方要注意的是:这篇文章里说的附加依赖项中只让你加上基本的几个。如果你要用hog,必须再加上opencv_objdetect220d.lib

看文件名字就知道是什么。。。

好了背景资料介绍完了,给出个例子,就是我的main函数 放出来做个示范。

  1. int _tmain(int argc, char** argv)  
  2. {  
  3.  Mat trainImg; //需要分析的图片  
  4.  trainImg=imread("1.jpg",1);   //读取图片  
  5.  HOGDescriptor *hog=new HOGDescriptor(cvSize(3,3),cvSize(3,3),cvSize(5,10),cvSize(3,3),9);  //具体意思见参考文章1,2  
  6.  vector<float>descriptors;//结果数组  
  7.  hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算  
  8.  printf("%d\n",descriptors.size()); //打屏一下结果数组的大小,看看是否符合文献2的预估, 发现完全一样,那篇文章很给力  
  9.   
  10.  sift("1.jpg");  //这是我改写的sift...  
  11.  for (int i=0;i<kp.size();i++) {  //这个循环就是我用来提前特征点附近3*3区域的梯度信息统计  
  12.   printf("keypoint %d at %f %f\n",i,kp[i].first,kp[i].second);  
  13.   if (kp[i].first==picw) kp[i].first--;  
  14.   if (kp[i].first==0) kp[i].first=1;  
  15.   if (kp[i].second==pich) kp[i].second--;  
  16.   if (kp[i].second==0) kp[i].second=1;  
  17.   int pos=(kp[i].second-1)*(picw-2)+kp[i].first-1;  
  18.   for (int j=0;j<9;j++) {  
  19.    res[j]+=descriptors[pos*9+j];  
  20.   }  
  21.  }  
  22.  puts("result:");  
  23.  for (int i=0;i<9;i++) printf("%lf ",res[i]); //结果以文字输出。。。  
  24.  puts("");  
  25. IplImage * respic;  //结果以直方图输出,里面有个res.jpg是我画的直方图背景图,没有这个图跑不了程序,把从这以下代码注释掉吧  
  26.  if ((respic = cvLoadImage("res.jpg", 1)) == 0) return -1;   
  27.  double maxx=0;  
  28.  for (int i=0;i<9;i++) if (maxx<res[i]) maxx=res[i];  
  29.  for (int i=0;i<9;i++) cvRectangle(respic, cvPoint(150+51*i,(maxx-res[i])/maxx*(352-77)+77),  
  30.                 cvPoint(201+51*i,351), CV_RGB(0, 0, 0),  
  31.                 1, 8, 0);  
  32.  CvFont font;  
  33.  cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0 );  
  34.  itoa((int)maxx,outs,10);  
  35.  cvPutText(respic,outs,cvPoint(53,83),&font,CV_RGB(0, 0, 0));  
  36.  cvNamedWindow("image1",1);  
  37.  cvShowImage("image1", respic);  
  38.  cvWaitKey(0);    
  39.  cvDestroyWindow("image1");  
  40.   
  41. }  

 

 

 

 

抱歉!评论已关闭.