OpenCV - два совершенно разных изображения имеют больше совпадений с использованием BFMatcher

У меня есть изображение нескольких чашекздесь

и изображение кота здесь

Я хочу сравнить эти две картинки в OpenCV с помощью surf и сопоставить их с помощью BFMatcher.

Вот код:

//read the image
cv::Mat image1= cv::imread("C:\\Users\\The\\Desktop\\cub.jpg");
cv::Mat image2= cv::imread("C:\\Users\\The\\Desktop\\cat.jpg");
//detect the key points using surf
cv::SurfFeatureDetector surf(300,4,2,true,false);
   //image 1 key points
vector<cv::KeyPoint> image1Keypoints;
//detect the key points in image 1 using surf
surf.detect(image1,image1Keypoints);
//draw the keypoints of image1
cv::drawKeypoints(image1,image1Keypoints,image1,                                      
  cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);
cv::namedWindow("Original image 1 with keypoints");
cv::imshow("Original image 1 with keypoints",image1);
// image 2 key points
std::vector<cv::KeyPoint> image2keypoints;
//detect the key points in image 1 using surf
 surf.detect(image2,image2keypoints);
 //draw the key points
 cv::drawKeypoints(image2,keypoints1,image2,                                   
      cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);                      
 //the extracted image display
cv::namedWindow("image 2 with keypoints");
cv::imshow("image 2 with keypoints",image2);

Из приведенного выше кода это изображение cups содержит это

и особенности изображения кота: это

cv::SiftDescriptorExtractor sift;
cv::Mat image1Descriptor;
cv::Mat image2Desccriptor;
sift.compute(image1,
             image1Keypoints,
             image1Descriptor);
sift.compute(image2,
             keypoints1,
             image2Desccriptor);
 cv::BFMatcher matcher(cv::NORM_L2,true);
std::vector<cv::DMatch> matches;
matcher.match(image2Desccriptor,image1Descriptor,matches);
cout<<"match=";
//the number of matched features between the two images
cout<<matches.size()<<endl;
cv::Mat imageMatches;   
cv::drawMatches(image2,keypoints1,image1,image1Keypoints,                
   matches,imageMatches,cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);              
cv::namedWindow("matches");
cv::imshow("matches",imageMatches);
cv::waitKey(0);

Что меня действительно смутило, так это совпадающая картинка: matches

Есть около 833 совпадающих функций, но изображения совершенно разные.

Что не так с моим кодом и как я могу уменьшить количество совпадений. Я смог уменьшить количество совпадений, изменив параметры серфинга, но это потому, что он обнаруживает небольшое количество функций. Например, изменив детектор sifFeature на это:

cv::SurfFeatureDetector surf(1000,4,2,true,false);

Мне удалось получить совпадения = 77, но все же это большое количество совпадений, а совпадений меньше, потому что я получал небольшое количество функций по сравнению с приведенными выше числами.


person Yirga    schedule 27.01.2017    source источник
comment
Когда я прокручиваю, я вижу историю.... :-D   -  person P0W    schedule 27.01.2017
comment
Вы сравниваете небольшие фрагменты изображений (32x32 или около того), то есть дескрипторы... Совпадение дескрипторов не означает сравнение изображений. Вы должны сделать некоторые другие шаги после сопоставления.   -  person Miki    schedule 27.01.2017
comment
@POW мой вопрос для двух разных изображений, как возможно иметь такое количество совпадений и как уменьшить количество совпадений?   -  person Yirga    schedule 27.01.2017
comment
@Miki, можете ли вы пояснить, что вы имеете в виду, когда вы должны использовать некоторые другие шаги после сопоставления, я новичок в opencv.   -  person Yirga    schedule 27.01.2017
comment
Например, оцените преобразование по совпадающим ключевым точкам и проверьте количество выбросов. Чем меньше выбросов, тем больше похожих изображений. Или используйте дескрипторы в классификаторе, таком как BoW, SVM или что-то еще.   -  person Miki    schedule 27.01.2017


Ответы (1)


Вы должны проверить этот ответ.

Обычно BruteForce возвращает расстояние между двумя совпадениями. Чем меньше расстояние между двумя функциями, тем они похожи. Применение порога к этим расстояниям поможет вам удалить ложные совпадения.

Однако совпадение признаков само по себе не гарантирует, что объекты на двух изображениях будут одинаковыми. Чтобы выполнить такую ​​проверку, вам нужно немного продвинуться в реализации и (например) геометрически проверить положительные совпадения с помощью гомографии.

person NAmorim    schedule 27.01.2017