我正在使用Surf进行地标识别。这就是我想的过程:
1)事先为每个地标保存一个Surf描述符
2)用户拍摄地标(如建筑物)的照片
3)为该图像(照片)计算Surf描述符
4)将该描述符与存储的每个地标描述符进行比较,并选择11个最接近的特征点中具有最低DMatch.distance的一个作为识别的地标
5)我想计算得到的图像和存储的地标图像之间的旋转和比例。
我的理解是,我只能通过关键点获得这个旋转和缩放比例,因为特征描述符只是关键点的唯一简化表示。因此,我必须保存每个地标的关键点和特征描述符。是那么回事吗?
这就是我现在正在做的:
cv::SurfFeatureDetector surf(4000);
..
surf.detect(image1, keypoints1);
surf.detect(image2, keypoints2);
..
cv::SurfDescriptorExtractor surfDesc;
surfDesc.compute(image1, keypoints1, descriptor1);
surfDesc.compute(image2, keypoints2, descriptor2);
..
vector<cv::DMatch> descriptorsMatch;
BruteForceMatcher<cv::L2<float> > brute;
brute.match(desc1, desc2, descriptorsMatch);
//Use only the 11 best matched keypoints;
nth_element( descriptorsMatch.begin(), descriptorsMatch.begin()+10, descriptorsMatch.end() );
descriptorsMatch.erase( descriptorsMatch.begin()+11, descriptorsMatch.end() );
..
for ( .. it = descriptorsMatch.begin(); it != descriptorsMatch.end() .. )
{
distanceAcumulator +=it->distance;
angleAcumulator += abs(keypoints1[it->queryIdx].angle - keypoints2[it->trainIdx].angle) % 180 ;
scaleAcumulator1 +=keypoints1[it->queryIdx].size;
scaleAcumulator2 +=keypoints2[it->trainIdx].size;
}
angleBetweenImages = angleAcumulator/11;
scaleBetweenImages = scaleAcumulator1/scaleAcumulator2;
similarityBetweenImages = distanceAcumulator/11;
.. 发布于 2011-10-08 14:34:57
仅仅比较描述符的比例和它们的旋转是幼稚的,通常是行不通的。你需要的是应用一些几何模型来找到照片之间的关系。在这本书http://www.robots.ox.ac.uk/~vgg/hzbook/中可以看到更多,特别是第二部分:双视图几何。
https://stackoverflow.com/questions/7576421
复制相似问题