2015-03-24 2 views
2

Я хочу получить координаты ключевой точки из совпадений OpenCV SIFT, и я не знаю аннотации структуры данных совпадений. Я пытался это сделать:Получить координаты ключевой точки из совпадений OpenCV SIFT

vector<DMatch> matches; 
matcher.match(descriptors1,descriptors2,matches); 
for(vector<DMatch>::size_type i=0; i<matches.size(); i++) 
{ 
    cout<< key_points1[ matches[i].trainIdx].pt <<"与之匹配特征点坐标"<< key_points2[ matches[i].imgIdx].pt<<endl; 
} 

Но это не работает. Может кто-нибудь мне помочь?

+0

Я пробовал ваш метод, и он отлично работает, как вы храните свои ключевые точки? Еще один код будет полезен, если вы все еще застряли. – user3510227

+0

Не могли бы вы рассказать «не работает»? Какое сообщение об ошибке вы имеете? Или описать разницу между фактическим и ожидаемым выходом. – nils

ответ

2

матч функция класса DescriptorMatcher имеет следующую подпись:

void match(const Mat& queryDescriptors, const Mat& trainDescriptors, 
      vector<DMatch>& matches, const Mat& mask=Mat()) const; 

Я предполагаю, что key_points1 соответствуют descriptors1 и key_points2 к descriptors2.

Первое, что нужно смотреть в будет то, что вы передаете descriptors1 как queryDescriptors, но затем использовать trainIdx как индекс. Вам, вероятно, придется использовать queryIdx.
Следовательно, для key_points2 вам нужно будет использовать trainIdx.

vector<DMatch> matches; 
matcher.match(descriptors1,descriptors2,matches); 
for(vector<DMatch>::size_type i=0; i<matches.size(); i++) 
{ 
    cout<< key_points1[ matches[i].queryIdx].pt // Query is first. 
     <<"与之匹配特征点坐标" 
     << key_points2[ matches[i].trainIdx].pt // Training is second. 
     <<endl; 
} 

Надеюсь, что это поможет!

+0

Спасибо. У меня это есть. Я использую то же самое решение, что и вы сказали – user4705465

Смежные вопросы