ボックスのみの画像とシーンにボックスを含む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の別の実装でテストしたので、あまり一致しないはずです。これは非常に優れていました。