opencv 读取图像区域 并 计算HOG

来源:互联网 发布:2017青少年上网数据 编辑:程序博客网 时间:2024/05/17 03:47
利用ROI裁剪图片
http://blog.csdn.net/lejun2011/article/details/7599912

为了提取到一幅图像中感兴趣的区域并裁剪出来作为一幅新图像的方法:

1、利用void cvSetImageROI( IplImage* image, CvRect rect )函数设置感兴趣的区域;

IplImage* src = cvLoadImage(“D:\\test.jpg”,1);

cvSetImageROI(src,cvRect(0,0,0.5*src->width,0.5*src->height));

2、创建一个与感兴趣区域同样大小的新图像;

IplImage* dst = cvCreateImage(cvSize(0.5*src->width,0.5*src->height),src->depth,src->nchannels);

3、利用void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL )函数将设置了感兴趣区域的图像复制到新图像;

cvCopy(src,dst,0);

4、释放感兴趣区域。

cvResetImageROI(src);


HOG学习:
http://blog.csdn.net/raodotcong/article/details/6239431

  最近要做图像特征提取,可能要用下HOG特征,所以研究了下OpenCV的HOG描述子。OpenCV中的HOG特征提取功能使用了HOGDescriptor这个类来进行封装,其中也有现成的行人检测的接口。然而,无论是OpenCV官方说明文档还是各个中英文网站目前都没有这个类的使用说明,所以在这里把研究的部分心得分享一下。

      首先我们进入HOGDescriptor所在的头文件,看看它的构造函数需要哪些参数。 

[cpp] view plaincopyprint?
  1. CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),  
  2.     cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),  
  3.     histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),   
  4.     nlevels(HOGDescriptor::DEFAULT_NLEVELS)  
  5. {}  
[cpp] view plaincopyprint?
  1. CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,  
  2.               Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,  
  3.               int _histogramNormType=HOGDescriptor::L2Hys,  
  4.               double _L2HysThreshold=0.2, bool _gammaCorrection=false,  
  5.               int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)  
  6. : winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),  
  7. nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),  
  8. histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),  
  9. gammaCorrection(_gammaCorrection), nlevels(_nlevels)  
  10. {}  
[cpp] view plaincopyprint?
  1. CV_WRAP HOGDescriptor(const String& filename)  
  2. {  
  3.     load(filename);  
  4. }  
[cpp] view plaincopyprint?
  1. HOGDescriptor(const HOGDescriptor& d)  
  2. {  
  3.     d.copyTo(*this);  
  4. }  

      我们看到HOGDescriptor一共有4个构造函数,前三个有CV_WRAP前缀,表示它们是从DLL里导出的函数,即我们在程序当中可以调用的函数;最后一个没有上述的前缀,所以我们暂时用不到,它其实就是一个拷贝构造函数。

      下面我们就把注意力放在前面的构造函数的参数上面吧,这里有几个重要的参数要研究下:winSize(64,128), blockSize(16,16), blockStride(8,8), cellSize(8,8), nbins(9)。上面这些都是HOGDescriptor的成员变量,括号里的数值是它们的默认值,它们反应了HOG描述子的参数。这里做了几个示意图来表示它们的含义。

      窗口大小 winSize

      块大小 blockSize

      胞元大小 cellSize

      梯度方向数 nbins

      nBins表示在一个胞元(cell)中统计梯度的方向数目,例如nBins=9时,在一个胞元内统计9个方向的梯度直方图,每个方向为180/9=20度。

      HOG描述子维度

      在确定了上述的参数后,我们就可以计算出一个HOG描述子的维度了。OpenCV中的HOG源代码是按照下面的式子计算出描述子的维度的。 

[cpp] view plaincopyprint?
  1. size_t HOGDescriptor::getDescriptorSize() const  
  2. {  
  3.     CV_Assert(blockSize.width % cellSize.width == 0 &&  
  4.         blockSize.height % cellSize.height == 0);  
  5.     CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 &&  
  6.         (winSize.height - blockSize.height) % blockStride.height == 0 );  
  7.     return (size_t)nbins*  
  8.         (blockSize.width/cellSize.width)*  
  9.         (blockSize.height/cellSize.height)*  
  10.         ((winSize.width - blockSize.width)/blockStride.width + 1)*  
  11.         ((winSize.height - blockSize.height)/blockStride.height + 1);  
  12. }  

      参考文献

      OpenCV中的HOG算法来源于Histograms of Oriented Gradients for Human Detection, CVPR 2005。详细的算法可以参考这个文章。


http://blog.sciencenet.cn/blog-702148-762019.html

利用OpenCV提取HOG特征主要有两组参数需要设定,一个是HOG检测滑动窗口内部的参数,另一个是计算HOG特征时滑动窗口的步长


一、HOG检测滑动窗口内部的参数包括:检测window的大小,window内block的大小,block滑动的步长,以及cell的大小。


其中滑动窗口所包含的区域即我们需要提前HOG特征的区域。


HOGDescriptor* hog = newHOGDescriptor(cvSize(64, 48), cvSize(8, 6), cvSize(4, 3), cvSize(4, 3), 9);


cvSize(64,48)表示特征提取滑动窗口的大小,cvSize(8, 6)表示块(block)大小,cvSize(4,3)表示block滑动的步长(block步长设置较小,则相邻的block会有cell的交叠,从而增加特征鲁棒性),cvSize(4, 3)表示胞元(cell)大小,9表示每个胞单元中梯度直方图的数量。


二、提取HOG特征时,参数描述如下:


计算特征向量hog->compute(trainImg,descriptors, Size(64, 48), Size(0, 0))


此处,trainImg代表输入的图片(此处尺寸为640×480),descriptors表示保存特征结果的Vector,Size(64,48)表示windows的步进,第四个为padding,用于填充图片以适应大小。

当padding以默认状态Size(0,0)出现,滑动窗口window来计算图片时,结果不一定为整数。


注意,我们发现这里hog->compute()函数无法指定计算以trainImg图像中某个坐标点为中心的滑动窗口的特征值,为了达到这个目标,我们需要将原图提取的滑动窗口图像放入trainImg中,trainImg的大小和滑动窗口的大小相同,然后设定滑动窗口移动的步长为1(其实此时滑动窗口已经不能移动了,所以设置为多少都行)。这样整个trainImg只能提取一个窗口的HOG特征,这个窗口的大小和trainImg的大小相同。




0 0
原创粉丝点击