19

OpenCVと一致するオブジェクトについて質問があります。私はopencv2.3に実装されたSURFアルゴリズムを使用して、最初に各画像の特徴を検出し、次にこれらの特徴の記述子を抽出しています。ブルートフォースマッチャーを使用したマッチングの問題、2つの画像が一致したかどうかを判断する方法がわかりません。これは、2つの異なる画像を使用している場合、2つの画像の記述子の間に線があるためです。

私のコードのこれらの出力は、2つの画像(私はそれらと比較します)が類似しているか異なっているかのどちらかであり、結果の画像は2つの画像が一致していることを示しています。

問題は、2つの画像をどのように区別できるかということです。

真のマッチング:

http://store1.up-00.com/Jun11/hxM00286.jpg

誤マッチング!! :

http://store1.up-00.com/Jun11/D5H00286.jpg

私のコード:

Mat image1, outImg1, image2, outImg2;

// vector of keypoints
vector<KeyPoint> keypoints1, keypoints2;

// Read input images
image1 = imread("C://Google-Logo.jpg",0);
image2 = imread("C://Alex_Eng.jpg",0);

SurfFeatureDetector surf(2500);
surf.detect(image1, keypoints1);
surf.detect(image2, keypoints2);
drawKeypoints(image1, keypoints1, outImg1, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(image2, keypoints2, outImg2, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

namedWindow("SURF detector img1");
imshow("SURF detector img1", outImg1);

namedWindow("SURF detector img2");
imshow("SURF detector img2", outImg2);

SurfDescriptorExtractor surfDesc;
Mat descriptors1, descriptors2;
surfDesc.compute(image1, keypoints1, descriptors1);
surfDesc.compute(image2, keypoints2, descriptors2);

BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
matcher.match(descriptors1,descriptors2, matches);

nth_element(matches.begin(), matches.begin()+24, matches.end());
matches.erase(matches.begin()+25, matches.end());

Mat imageMatches;
drawMatches(image1, keypoints1, image2, keypoints2, matches, imageMatches, Scalar(255,255,255));

namedWindow("Matched");
imshow("Matched", imageMatches);

cv::waitKey();
return 0;
4

3 に答える 3

19

問題はブルートフォースマッチャーのみを使用することでした。「OpenCV2コンピュータービジョンアプリケーションプログラミングクックブック」で、2つのビュー間で一連の良好な一致を取得する方法を見つけました。

Ch9:ランダムサンプルコンセンサスを使用した画像のマッチング

彼らはK最近傍法とRANSACを使用しています

ありがとう

于 2011-09-05T13:08:04.757 に答える
9

外れ値を除去するには、2つの平面画像を比較するときにRANSAC+ホモグラフィが適しています。

ホモグラフィは、RANSACが両方の画像のポイントを比較するために使用しようとするモデルであり、ホモグラフィの投影モデル(1つの平面から別の平面への変換)により適した最適なポイントのセットを見つけます。

cv::findHomography(srcPoints,dstPoints, RANSAC, status);

上記の関数は、インライアと見なされるインデックスの場合は1、アウトライアと見なされるインデックスの場合は0の配列ステータスを返すため、このステータス配列をチェックすることで外れ値を削除できます。

于 2012-12-19T16:23:02.910 に答える
4

あなたはあなたのヘシアンを修正する必要があります、2500は多すぎます。50を試してください。大きなヘシアンを使用すると、多くのキーポイントが発生し、不要なものがいくつか発生します。SURFに関するもう1つの情報は、マーカーをより詳細に、よりリッチにする必要があるということです。

于 2013-03-01T00:58:49.253 に答える