2 つの図が似ているかどうかを自動的に判断しようとしています。ここで 3 つの例を見つけることができます: http://imgur.com/N5SeaQW,IZYszx5,4RxLy4o
最初の画像は2番目と3番目の画像とは異なりますが、2番目と3番目の画像は同じです(同一ではありません。よく見ると、いくつかの小さな違いがあります)
私のコード (ほとんどは OpenCV ドキュメントの機能ホモグラフィの例からのもの) は 2 つの異なる画像を読み取り、それらのキーポイントと記述子を計算し (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() ));