web-dev-qa-db-ja.com

OpenCV-SURF記述子とBruteForceMatcherを使用したオブジェクトマッチング

OpenCVと一致するオブジェクトについて質問があります。私はopencv 2.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;
19
khateeb

問題はブルートフォースマッチャーのみを使用することでした"OpenCV 2 Computer Vision Application Programming Cookbook"で、2つのビューの間で適切な一致のセットを取得する方法を見つけました

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

K-Nearest NeighborとRANSACを使用している

ありがとう

19
khateeb

外れ値を削除する場合RANSAC +ホモグラフィは、2つの平面画像を比較する場合に適した方法です。

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

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

上記の関数は、インライアと見なされるインデックスが1であり、外れ値と見なされるインデックスが0である配列ステータスを返すため、このステータス配列を確認することで、外れ値を削除できます。

9
Jav_Rock

ヘッセ語を変更する必要があります。2500は多すぎます。 50を試してください。大きなヘッセ行列を使用すると、キーポイントが多くなり、不要な結果が生じます。 SURFに関するもう1つの情報は、マーカーをより詳細に、よりリッチにする必要があることです。

4
Ricardo Ribani