2012-12-12 15 views
7

मैं freak_demo.cppexample के बाद ओपनसीवी के नवीनतम संस्करण से काफी नया वर्णनकर्ता FREAK का प्रयास कर रहा हूं। एसयूआरएफ का उपयोग करने के बजाय मैं तेजी से उपयोग करता हूं। मेरे बुनियादी कोड कुछ इस तरह है:ओपनसीवी फ्लेकर बहुत सारे आउटलेटर्स

std::vector<KeyPoint> keypointsA, keypointsB; 
Mat descriptorsA, descriptorsB; 
std::vector<DMatch> matches; 

FREAK extractor; 
BruteForceMatcher<Hamming> matcher; 

FAST(imgA,keypointsA,100); 
FAST(imgB,keypointsB,20); 

extractor.compute(imgA, keypointsA, descriptorsA); 
extractor.compute(imgB, keypointsB, descriptorsB); 

matcher.match(descriptorsA, descriptorsB, matches); 
  • एल्गोरिथ्म मैचों का एक बहुत पाता है, लेकिन बाहरी कारकों के कारण का एक बहुत देखते हैं। क्या मैं सही काम कर रहा हूँ? क्या एल्गोरिदम ट्यून करने का कोई तरीका है?

उत्तर

16

जब कर मिलान वहाँ हमेशा बाहरी कारकों के कारण से बाहर छुटकारा पाने के लिए कुछ शोधन कदम हैं।

क्या मैं आमतौर पर करते मैचों में एक सीमा से अधिक है कि एक दूरी को त्यागकर है उदाहरण के लिए,:

for (int i = 0; i < matches.size(); i++) 
{ 
    if(matches[i].distance > 200) 
    { 
     matches.erase(matches.begin()+i-1); 
    } 
} 

फिर, मैं RANSAC का उपयोग जो homography मॉडल फिट से मेल खाता है देखने के लिए। OpenCV इस के लिए एक समारोह है:

for(int i = 0; i < matches.size(); i++) 
    {    
     trainMatches.push_back(cv::Point2f(keypointsB[ matches[i].trainIdx ].pt.x/500.0f, keypointsB[ matches[i].trainIdx ].pt.y/500.0f)); 
     queryMatches.push_back(cv::Point2f(keypointsA[ matches[i].queryIdx ].pt.x/500.0f, keypointsA[ matches[i].queryIdx ].pt.y/500.0f)); 
    } 

Mat h = cv::findHomography(trainMatches,queryMatches,CV_RANSAC,0.005, status); 

और मैं सिर्फ inliers आकर्षित: जब तक आप इच्छित resutls प्राप्त

for(size_t i = 0; i < queryMatches.size(); i++) 
{ 
    if(status.at<char>(i) != 0) 
    { 
     inliers.push_back(matches[i]); 
    } 
} 

Mat imgMatch; 
drawMatches(imgA, keypointsA, imgB, keypointsB, inliers, imgMatch); 

बस विभिन्न द्वार और दूरी का प्रयास करें।

+0

मैं अपने _ "मैचों में एक सीमा से अधिक दूरी है कि फेंकना" के बारे में उत्सुक था _ उदाहरण, लेकिन जब मैं करने की कोशिश की इसे मेरे कोड में शामिल करें, मुझे _ "वेक्टर इटरेटर + ऑफसेट से ऑफसेट" की त्रुटि मिलती है _ _? – MLMLTL

3

आप अपने स्वयं के चुने हुए जोड़े देकर वर्णनकर्ता को भी प्रशिक्षित कर सकते हैं। और कन्स्ट्रक्टर में पैरामीटर ट्यून करें।

explicit FREAK(bool orientationNormalized = true 
     , bool scaleNormalized = true 
     , float patternScale = 22.0f 
     , int nbOctave = 4 
     , const vector<int>& selectedPairs = vector<int>() 
    ); 

Btw, बेकार की एक अधिक कुशल संस्करण रास्ते पर है :-)

+0

किस पैरामीटर या पैरामीटर से कुशल? मुझे मजबूत फ्लेकी चाहिए, तेज़ नहीं। मुझे एमयू-एसयूआरएफ जैसे मजबूत फीचर डिटेक्टर की भी आवश्यकता है। –

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