2012-04-04 11 views
8

मैं एक प्रोग्राम को लागू करने की कोशिश कर रहा हूं जो दो छवियों को इनपुट करेगा, एक अकेले बॉक्स की एक छवि है और जिसमें दृश्य में बॉक्स शामिल है। असल में, कार्यक्रम इन दो छवियों में कीपॉइंट्स को ढूंढना है और मिलान की गई मुख्य बिंदुओं वाली छवियां दिखाएंगे। अंत में मैं दो इनपुट छवियों की एक संलग्न छवि को उनके मिलान किए गए कीपॉइंट्स के साथ मिलकर देखने की उम्मीद करता हूं। मेरा कोड निम्नानुसार है:ओपनसीवी में सिफ्ट का उपयोग करके दो छवियों से मिलान करने का प्रयास कर रहा है, लेकिन बहुत सारे मैचों

#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 दिनों के लिए काम कर रहा हूं, इसमें कोई सुधार नहीं हुआ है।

यहां एक आउटपुट है जो मुझे अपने कार्यक्रम से मिलता है।

मुझे छवि को हटाना चाहिए था।

मुझे पता है कि मुझे बहुत अधिक मैच नहीं देना चाहिए, क्योंकि मैंने मैटलैब में एक और इम्प्लेमेनेशन के साथ सटीक छवियों का परीक्षण किया है जो काफी अच्छा था।

उत्तर

6

BruteForceMatcher का उपयोग करने के बजाय FlannBasedMatcher का उपयोग करने का प्रयास करें और केवल अच्छे मैचों को रखने के लिए कीपॉइंट्स के बीच अधिकतम और न्यूनतम दूरी की गणना करें। उदाहरण के लिए "Feature Matching with FLANN" देखें।

+0

धन्यवाद। जैसा कि आपने कहा था, समस्या सभी मैचों को चित्रित करने के साथ ही न केवल अच्छे मैचों के साथ थी। अब जब मैं मैचों को क्रमबद्ध कर रहा हूं और न्यूनतम दूरी के साथ 15% का चयन कर रहा हूं। – bahti

+0

मुझे आशा है कि आपने समस्या ठीक कर दी है। – MMH

+0

[नया लिंक] (http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html) –

0

मुझे एसआईएफटी के लिए एक ही समस्या का सामना करना पड़ा। मैंने knn matcher (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 
} 
संबंधित मुद्दे

 संबंधित मुद्दे