最近接触机器学习相关工作,工作中使用分类和检测算法,提取特征是算法的前提。OpenCV自带了HOG、Haar和LBP描述子。下面将工程中用到的HOG描述子特征提取进行记录整理。
一、OpenCV原函数:
1、特征描述子对应类的构造函数
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)
{}
除了前五个参数都是默认参数,故此我们只关心前五个参数就可以了。
_winSize:图像大小,为了保证每张图像描述子个数相同,一般需要归一化成统一大小。
_blockSize:块大小,每一块提取一次描述子
_blockStride:滑窗移动跨度,提取完当前块移动到下一块的水平竖直距离
_cellSize:每个统计单元大小,每个块切割成若干个单元
_nbins:每个单元的特征值个数
2、计算特征值函数
CV_WRAP virtual void compute(const Mat& img,
CV_OUT vector<float>&descriptors,
Size winStride=Size(), Size padding=Size(),
const vector<Point>& locations=vector<Point>()) const;
同理,该函数只有前两个参数没有默认参数,一般只需要前两个参数便可。
img:输入图像
descriptors:图像对应的特征值结果
二、使用以上两个函数即可完成特征提取。
下面是使用示例:
vector<float>& hogFeature
Mat imggray1;
resize(imggray, imggray1, Size(cnSizeW, cnSizeH),0, 0, CV_INTER_LINEAR);
vector<float> desHogs;
HOGDescriptorhog(imggray1.size(), Size(16, 16), Size(8, 8), Size(8, 8), 9);
hog.compute(imggray1,desHogs);
for (vector<float>::iterator it = desHogs.begin();it != desHogs.end(); it++)
{
hogFeature.push_back(*it);
}
这样就将图像imggray中的HOG特征向量提取出来,存放到hogFeature中。具体如何使用该向量,是检测和分类算法的问题了。
当然可以根据具体需求设计自己的描述子,但是,一般使用算法库自带的描述子提取函数已经足够了。