Я использую Surf для распознавания ориентиров.Это процесс, который я подумал:
1) сохранить перед рукой один дескриптор Surf для каждого ориентира
2) Пользователь делает фотографию ориентира (например, здания)
3) Для этого изображения вычисляется дескриптор Surf (фотография)
4) Этот дескриптор сравнивается с каждым сохраненным дескриптором ориентира, и выбирается тот, у которого наименьшее расстояние DMatch.distance между 11 ближайшими характерными точками выбирается какориентир распознан
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;
..