Возможно ли получить вращение и масштабирование между двумя изображениями только с дескриптором Surf каждого? - PullRequest
1 голос
/ 28 сентября 2011

Я использую 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;
.. 

1 Ответ

2 голосов
/ 08 октября 2011

Простое сравнение масштаба дескрипторов и их ротации наивно и обычно не сработает.Вам нужно применить геометрическую модель, чтобы найти связь между фотографиями.Подробнее в этой книге http://www.robots.ox.ac.uk/~vgg/hzbook/, особенно ЧАСТЬ II: геометрия с двумя видами.

...