opencv 读取图像区域 并 计算HOG
来源:互联网 发布:2017青少年上网数据 编辑:程序博客网 时间:2024/05/17 03:47
为了提取到一幅图像中感兴趣的区域并裁剪出来作为一幅新图像的方法:
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特征,所以研究了下OpenCV的HOG描述子。OpenCV中的HOG特征提取功能使用了HOGDescriptor这个类来进行封装,其中也有现成的行人检测的接口。然而,无论是OpenCV官方说明文档还是各个中英文网站目前都没有这个类的使用说明,所以在这里把研究的部分心得分享一下。
首先我们进入HOGDescriptor所在的头文件,看看它的构造函数需要哪些参数。
- CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
- cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
- histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),
- nlevels(HOGDescriptor::DEFAULT_NLEVELS)
- {}
- CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
- Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
- int _histogramNormType=HOGDescriptor::L2Hys,
- double _L2HysThreshold=0.2, bool _gammaCorrection=false,
- int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)
- : winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),
- nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),
- histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),
- gammaCorrection(_gammaCorrection), nlevels(_nlevels)
- {}
- CV_WRAP HOGDescriptor(const String& filename)
- {
- load(filename);
- }
- HOGDescriptor(const HOGDescriptor& d)
- {
- d.copyTo(*this);
- }
我们看到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源代码是按照下面的式子计算出描述子的维度的。
- size_t HOGDescriptor::getDescriptorSize() const
- {
- CV_Assert(blockSize.width % cellSize.width == 0 &&
- blockSize.height % cellSize.height == 0);
- CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 &&
- (winSize.height - blockSize.height) % blockStride.height == 0 );
- return (size_t)nbins*
- (blockSize.width/cellSize.width)*
- (blockSize.height/cellSize.height)*
- ((winSize.width - blockSize.width)/blockStride.width + 1)*
- ((winSize.height - blockSize.height)/blockStride.height + 1);
- }
参考文献
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的大小相同。
- opencv 读取图像区域 并 计算HOG
- OpenCV 读取文件并转换灰度图像
- opencv读取序列图像并显示
- Python OpenCV 读取并显示图像
- 学习openCV之读取图像和感兴趣区域融合
- 【OpenCV学习】计算两幅图像的重叠区域
- Matlab计算图像HOG特征
- OpenCV实现从图像中选择矩形区域并保存
- 基于MFC的OpenCV图像显示并标定ROI区域
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- OpenCV计算连通区域数目与最大连通区域并标示出
- 【图像】HOG:从理论到Opencv实践
- 采用OPENCV,从一幅图像中提取部分区域,并保存为新图像。
- java:内部类详解
- 帮你深入理解OAuth2.0协议
- java中内存泄露示例
- 施一公:优秀博士如何养成(全文) 清华大学演讲
- Windows下载Android源码
- opencv 读取图像区域 并 计算HOG
- ref 和out
- 实验十一 文件管理
- NYOJ 914 Yougth的最大化
- magento Access denied 由于权限分配失误导致不能进入magento后台的解决办法!
- 输入两个正整数n和m,从数列1,2,3.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来.编程求解
- sql小技巧
- easyui框架按钮的类型
- 做网站前需要考虑的几个问题