opencv提取hog

转载 2012年03月21日 20:36:22
 

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函数 放出来做个示范。

int _tmain(int argc, char** argv)
{
 Mat trainImg; //需要分析的图片
 trainImg=imread("1.jpg",1);   //读取图片
 HOGDescriptor *hog=new HOGDescriptor(cvSize(3,3),cvSize(3,3),cvSize(5,10),cvSize(3,3),9);  //具体意思见参考文章1,2
 vector<float>descriptors;//结果数组
 hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算
 printf("%d\n",descriptors.size()); //打屏一下结果数组的大小,看看是否符合文献2的预估, 发现完全一样,那篇文章很给力

 sift("1.jpg");  //这是我改写的sift...
 for (int i=0;i<kp.size();i++) {  //这个循环就是我用来提前特征点附近3*3区域的梯度信息统计
  printf("keypoint %d at %f %f\n",i,kp[i].first,kp[i].second);
  if (kp[i].first==picw) kp[i].first--;
  if (kp[i].first==0) kp[i].first=1;
  if (kp[i].second==pich) kp[i].second--;
  if (kp[i].second==0) kp[i].second=1;
  int pos=(kp[i].second-1)*(picw-2)+kp[i].first-1;
  for (int j=0;j<9;j++) {
   res[j]+=descriptors[pos*9+j];
  }
 }
 puts("result:");
 for (int i=0;i<9;i++) printf("%lf ",res[i]); //结果以文字输出。。。
 puts("");
IplImage * respic;  //结果以直方图输出,里面有个res.jpg是我画的直方图背景图,没有这个图跑不了程序,把从这以下代码注释掉吧
 if ((respic = cvLoadImage("res.jpg", 1)) == 0) return -1; 
 double maxx=0;
 for (int i=0;i<9;i++) if (maxx<res[i]) maxx=res[i];
 for (int i=0;i<9;i++) cvRectangle(respic, cvPoint(150+51*i,(maxx-res[i])/maxx*(352-77)+77),
                cvPoint(201+51*i,351), CV_RGB(0, 0, 0),
                1, 8, 0);
 CvFont font;
 cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0 );
 itoa((int)maxx,outs,10);
 cvPutText(respic,outs,cvPoint(53,83),&font,CV_RGB(0, 0, 0));
 cvNamedWindow("image1",1);
 cvShowImage("image1", respic);
 cvWaitKey(0); 
 cvDestroyWindow("image1");

}

那天晚上我还花了很长的时间把基于opencv1.1的sift转到了基于opencv2.2的sift,有几百个错误,改了我一个小时。。。tnnd

把for (i=1;i<=1;i++)这种改为for (int i=1;i<=1;i++)  这是c/c++规范问题

然后对于啥系统函数调用不清的错误,多加点强制转换

对于max函数。。。自己写把 我也不知道他调用的哪里的。。。

把这两个程序串起来不难,也没啥好写的。主要就是hog的调用网上没啥资料。其实hog就是一个基于区间的统计程序,几个区间这个参数就是nbins。

hog主要就是用于人体识别。如果装了opencv2.2 可以在它的sample里面找到

C:\OpenCV2.2\samples\cpp\peopledetect.cpp

现在已经有opencv2.3了 不过我没找到配合vs2010使用的版本,貌似下了一个linux版本的。。。于是就用了2.2

给我项目的那人还蛮满意的,给钱蛮迅速的。。。我还一直不认为他会把尾款补给我。。。

其实工程的难度在于sift。。。主要为大马写毕设,已经对sift有了很多的了解,才能在一晚上把他程序写出来(给我项目那人第二天如果拿不出程序就不能毕业。。。悲剧)如果要sift代码的话 留言吧(我这空间从来没人留言),其实sift代码很多地方都有。


特征提取方法(一):HOG原理及OpenCV实现

方向梯度直方图(Histogram of Oriented Gradient, HOG)于2005年提出,是一种常用的特征提取方法,HOG+SVM在行人检测中有着优异的效果。HOG基本思想: 在一幅...

HOG特征提取代码(opencv处理基本数据,c语言实现基本算法)

#include #include using namespace cv; using namespace std; IplImage *bgrtogrey(IplImage*img) { ...

图像识别--Java中使用openCV提取Hog特征通过SVM训练实现图像识别

图像识别大致可以分为这么几步: 1.对训练图片进行预处理 2.对预处理的图片进行Hog特征提取 3.使用SVM分类器对特征进行分类形成模型 4.根据模型对测试图片进行预测   以下都是通过...
  • M_WBCG
  • M_WBCG
  • 2017年07月13日 22:16
  • 500

OpenCV中HOG特征的提取实现

OpenCV版本2.3.1 hog头文件:opencv\modules\objdetect\include\opencv2\objdetect中的objdetect.hpp hog实现文件:openc...

HOG特征及在opencv中的提取

根据zouxy09的博文进行部分修改 HOG特征

Opencv行人检测代码 自带hog检测

  • 2017年07月27日 17:42
  • 101KB
  • 下载

OpenCV中的HOG+SVM物体分类

这里总结网上自己找到的资料,搞一个简单的框架供大家参考一下。 OpenCV官方的SVM代码在http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tut...

HOG:从理论到OpenCV实践

  • 2016年11月26日 21:04
  • 513KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv提取hog
举报原因:
原因补充:

(最多只允许输入30个字)