我试图自动确定两个数字是否相似。你可以在这里找到三个例子:http: //imgur.com/N5SeaQW,IZYszx5,4RxLy4o
第一张图和第二张图和第三张图不一样,但是第二张图和第三张图是一样的(不完全相同,仔细看会有一些细微差别)
我的代码(大部分来自 OpenCV 文档中的特征单应性示例)读取两个不同的图像,计算它们的关键点和描述符(使用 SIFT,但我也尝试过 SURF 和 ORB),使用 FlannBasedMatcher 匹配它们并计算单应性矩阵。从可选的状态向量中,我计算内点与关键点总数的比率,以计算“距离”。
但是,计算出的距离并没有做出正确的区分:
d(img1, img2) = 0.296296
d(img1, img3) = 0.407407
d(img2, img3) = 0.362069
所以我无法断定图像 1 与图像 2 不同,图像 1 与图像 2 不同,图像 2 等于图像 3。
是否有更好的方法或指标来确定哪些图像相似?
Mat img_object = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
Mat img_scene = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );
//-- Step 1: Detect keypoints using SIFT
Ptr<FeatureDetector > detector;
detector = new SiftFeatureDetector();
std::vector<KeyPoint> keypoints_object, keypoints_scene;
detector->detect( img_object, keypoints_object );
detector->detect( img_scene, keypoints_scene );
//-- Step 2: Calculate descriptors (feature vectors)
Ptr<DescriptorExtractor > extractor;
extractor = new SiftDescriptorExtractor;
Mat descriptors_object, descriptors_scene;
extractor->compute( img_object, keypoints_object, descriptors_object );
extractor->compute( img_scene, keypoints_scene, descriptors_scene );
//-- Step 3: Matching descriptor vectors using FLANN matcher
FlannBasedMatcher matcher;
std::vector< DMatch > matches;
matcher.match( descriptors_object, descriptors_scene, matches );
//-- Step 4: Compute homography matrix and status vector
std::vector<Point2f> obj;
std::vector<Point2f> scene;
for( int i = 0; i<matches.size(); i++){
obj.push_back( keypoints_object[ matches[i].queryIdx ].pt );
scene.push_back( keypoints_scene[ matches[i].trainIdx ].pt );
}
std::vector<uchar> status;
Mat H = findHomography( obj, scene, status, CV_RANSAC, 3 );
//-- Step 5: Compute inliers/status.size
int inliers = 0;
for(int i = 0; i<status.size(); i++){
inliers += status[i];
}
printf("Percentage of inliers: %f \n",( (float) inliers)/( (float) status.size() ));