我想使用冲浪在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);
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个匹配的功能,但图像完全不同。
我的代码有什么问题&amp;我怎样才能减少比赛次数。我可以通过更改冲浪参数来减少匹配数量,但这是因为它检测到少量功能。例如,通过将siftFeature检测器更改为:
cv::SurfFeatureDetector surf(1000,4,2,true,false);
我能够获得匹配= 77但仍然是大量的匹配并且匹配减少了,因为与上述数字相比,我获得了少量的功能。
答案 0 :(得分:1)
您应该查看answer。
通常,BruteForce将返回两场比赛之间的距离。两个特征之间的距离越小,它们就越相似。通过在这些距离上应用阈值将帮助您删除误报匹配。
但是,功能匹配本身并不能保证两个图像中的对象相同。要进行这种验证,您需要进一步了解您的实现,并(例如)几何验证与Homography的正匹配。