8

ボックスのみの画像とシーンにボックスを含む2つの画像を入力するプログラムを実装しようとしています。基本的に、プログラムはこれら2つの画像からキーポイントを検出し、キーポイントが一致する画像を表示することになっています。つまり、2つの入力画像の追加画像と、それらが接続された一致するキーポイントが表示されることを期待しています。私のコードは次のとおりです。

#include <opencv2\opencv.hpp>
#include <iostream>

int main(int argc, const char* argv[]) {
   cv::Mat input1 = cv::imread("input.jpg", 1); //Load as grayscale
   //cv::cvtColor(input1,input1,CV_BGR2GRAY);
   //second input load as grayscale
   cv::Mat input2 = cv::imread("input2.jpg",1);
   cv::SiftFeatureDetector detector;
   //cv::SiftFeatureDetector
   detector(
      1, 1,
      cv::SIFT::CommonParams::DEFAULT_NOCTAVES,
      cv::SIFT::CommonParams::DEFAULT_NOCTAVE_LAYERS,
      cv::SIFT::CommonParams::DEFAULT_FIRST_OCTAVE,
      cv::SIFT::CommonParams::FIRST_ANGLE );
   std::vector<cv::KeyPoint> keypoints1;
   detector.detect(input1, keypoints1);
   // Add results to image and save.
   cv::Mat output1;
   cv::drawKeypoints(input1, keypoints1, output1);
   cv::imshow("Sift_result1.jpg", output1);
   cv::imwrite("Sift_result1.jpg",output1);
   //keypoints array for input 2
   std::vector<cv::KeyPoint> keypoints2;
   //output array for ouput 2
   cv::Mat output2;
   //Sift extractor of opencv
   cv::SiftDescriptorExtractor extractor;
   cv::Mat descriptors1,descriptors2;
   cv::BruteForceMatcher<cv::L2<float>> matcher;
   cv::vector<cv::DMatch> matches;
   cv::Mat img_matches;
   detector.detect(input2,keypoints2);
   cv::drawKeypoints(input2,keypoints2,output2);
   cv::imshow("Sift_result2.jpg",output2);
   cv::imwrite("Sift_result2.jpg",output2);
   extractor.compute(input1,keypoints1,descriptors1);
   extractor.compute(input2,keypoints2,descriptors2);
   matcher.match(descriptors1,descriptors2,matches);
   //show result
   cv::drawMatches(input1,keypoints1,input2,keypoints2,matches,img_matches);
   cv::imshow("matches",img_matches);
   cv::imwrite("matches.jpg",img_matches);
   cv::waitKey();
   return 0;
}

問題は、予想よりも多くの一致が2つあることです。プログラムをデバッグして、キーポイントベクトルなどの内部を調べましたが、すべてが正常に見えます。少なくとも、キーポイントは方向などで検出されます。

私はOpenCVv2.3を使用しており、使用しているクラスのタイプについてドキュメントを確認し、問題を解決しようとしましたが、それは機能しませんでした。私はこれに3日間取り組んでいますが、あまり改善されませんでした。

これが私のプログラムから得た出力です。

画像を削除する必要があります。

まったく同じ画像をmatlabの別の実装でテストしたので、あまり一致しないはずです。これは非常に優れていました。

4

2 に答える 2

6

BruteForceMatcherを使用するのではなく、FlannBasedMatcherを使用して、キーポイント間の最大距離と最小距離を計算して、適切な一致のみを維持してください。例については、「 FLANNとの機能マッチング」を参照してください。

于 2012-04-05T05:41:09.140 に答える
0

SIFTでも同じ問題に直面しました。knnマッチャー(K = 3)を使用しました。次の手順を繰り返し実行しました

{
Calculated best affine transform with least square method.

Found out the transform for all keypoints in source image.

Checked out MaxError and MinError.

Points with Error near MaxError are removed from the matching list
}
于 2013-05-06T10:37:24.777 に答える