У меня есть изображение нескольких чашек
Я хочу сравнить эти две картинки в 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);
Что меня действительно смутило, так это совпадающая картинка:
Есть около 833 совпадающих функций, но изображения совершенно разные.
Что не так с моим кодом и как я могу уменьшить количество совпадений. Я смог уменьшить количество совпадений, изменив параметры серфинга, но это потому, что он обнаруживает небольшое количество функций. Например, изменив детектор sifFeature на это:
cv::SurfFeatureDetector surf(1000,4,2,true,false);
Мне удалось получить совпадения = 77, но все же это большое количество совпадений, а совпадений меньше, потому что я получал небольшое количество функций по сравнению с приведенными выше числами.