1. 前言
在OpenCV中使用SIFT特征提取算子进行特征提取是跟简单的事情了,通过调用API也就下面几行代码的事情
cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keypoint;
detector.detect(image, keypoint); //image是需要进行特征提取的图像
std::cout << "\ndetected SIFT feature point size: " << keypoint.size() << "\n";
//获得每个特征点的128维特征向量
cv::SiftDescriptorExtractor extractor;
cv::Mat des1; //descriptor
extractor.compute(image, keypoint, des1);
但是在进行诸如匹配的时候由于提取出来的SIFT特征样本的数目是不同的,这就需要进行映射抽取,这就讲到了今天说到的BOW特征,抽取到BOW特征之后可以简单得进行欧式距离的比较,或是放入后面的分类器进行训练。
2. 实现原理
BOW模型的处理过程:
1. SIFT特征提取。SIFT 特征提取是求出图像的关键点信息,包括角度,大小以及强度。关键点,也就是能够代表图像关键信息的部分,这也是Bag of words中单词的组成。一个图像通常有很多的关键点。
2. 聚类。我们将每幅图像中的关键点信息添加到词袋中,并定义聚类中心的数量N。然后将词袋中的关键点通过Kmeans算法聚类到N个类中。同时得到这N个类的中心点组成N*128的dictionary,每个中心都可以代表这个类。
3. 求图像的直方图。将图像的关键点信息重新放到词包中,根据落在每个类中关键点的数量来得到图像的直方图,大小为1*N。将每幅图像进行处理,得到图像在BOW模型下的特征。
4. 图像匹配。将测试图像进行相同的处理,同样也得到1*N的特征。根据测试图像与训练图像特