मैं एक प्रोग्राम को लागू करने की कोशिश कर रहा हूं जो दो छवियों को इनपुट करेगा, एक अकेले बॉक्स की एक छवि है और जिसमें दृश्य में बॉक्स शामिल है। असल में, कार्यक्रम इन दो छवियों में कीपॉइंट्स को ढूंढना है और मिलान की गई मुख्य बिंदुओं वाली छवियां दिखाएंगे। अंत में मैं दो इनपुट छवियों की एक संलग्न छवि को उनके मिलान किए गए कीपॉइंट्स के साथ मिलकर देखने की उम्मीद करता हूं। मेरा कोड निम्नानुसार है:ओपनसीवी में सिफ्ट का उपयोग करके दो छवियों से मिलान करने का प्रयास कर रहा है, लेकिन बहुत सारे मैचों
#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;
}
समस्या यह है कि उम्मीद से दो कई मैच हैं। मैंने कार्यक्रम को डीबग करने की कोशिश की और देखा कि कीपॉइंट्स वैक्टर के अंदर क्या है और इसी तरह, सब कुछ ठीक दिखता है, कम से कम मुझे लगता है कि वे हैं, कुंजीपटलों को अभिविन्यास आदि के साथ पता चला है।
मैं ओपनसीवी v2.3 का उपयोग कर रहा हूं और मेरे द्वारा उपयोग किए जा रहे वर्गों के प्रकार के लिए अपने दस्तावेज़ों की जांच की और समस्या को हल करने का प्रयास किया लेकिन यह काम नहीं किया। मैं इस पर 3 दिनों के लिए काम कर रहा हूं, इसमें कोई सुधार नहीं हुआ है।
यहां एक आउटपुट है जो मुझे अपने कार्यक्रम से मिलता है।
मुझे छवि को हटाना चाहिए था।
मुझे पता है कि मुझे बहुत अधिक मैच नहीं देना चाहिए, क्योंकि मैंने मैटलैब में एक और इम्प्लेमेनेशन के साथ सटीक छवियों का परीक्षण किया है जो काफी अच्छा था।
धन्यवाद। जैसा कि आपने कहा था, समस्या सभी मैचों को चित्रित करने के साथ ही न केवल अच्छे मैचों के साथ थी। अब जब मैं मैचों को क्रमबद्ध कर रहा हूं और न्यूनतम दूरी के साथ 15% का चयन कर रहा हूं। – bahti
मुझे आशा है कि आपने समस्या ठीक कर दी है। – MMH
[नया लिंक] (http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html) –