OpenCV - 两个完全不同的图像使用BFMatcher进行更多匹配

时间:2017-01-27 10:03:10

标签: c++ opencv image-processing computer-vision surf

我有一些杯子的图片here

和猫的照片here

我想使用冲浪在OpenCV中比较这两张图片,并使用 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 图像功能this

cat 图片功能:this

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个匹配的功能,但图像完全不同。

我的代码有什么问题&amp;我怎样才能减少比赛次数。我可以通过更改冲浪参数来减少匹配数量,但这是因为它检测到少量功能。例如,通过将siftFeature检测器更改为:

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

我能够获得匹配= 77但仍然是大量的匹配并且匹配减少了,因为与上述数字相比,我获得了少量的功能。

1 个答案:

答案 0 :(得分:1)

您应该查看answer

通常,BruteForce将返回两场比赛之间的距离。两个特征之间的距离越小,它们就越相似。通过在这些距离上应用阈值将帮助您删除误报匹配。

但是,功能匹配本身并不能保证两个图像中的对象相同。要进行这种验证,您需要进一步了解您的实现,并(例如)几何验证与Homography的正匹配。