2012-09-20 19 views
10

के साथ knnMatch का उपयोग करने में त्रुटि मैं पाइथन + ओपनसीवी का उपयोग करके दो चित्रों से मेल खाना चाहता हूं। मैंने उन दोनों से कीपॉइंट्स और डिस्क्रिप्टर निकालने के लिए एसयूआरएफ का उपयोग किया है। अब, मुझे इन वर्णनकर्ताओं से मेल खाना चाहिए और इस कारण से मैंने फ़्लैन मैचर का उपयोग करने का फैसला किया।ओपनसीवी + पायथन

flann_params = dict(algorithm = FLANN_INDEX_KDTREE,trees = 4)  
matcher = cv2.FlannBasedMatcher(flann_params, {}) 

लेकिन जब मैं वर्णनकर्ता (desc1, desc2) के साथ knnMatch इस्तेमाल करने की कोशिश, openCV एक अपवाद फेंकता है।

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) #2 
cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpp:299: error: (-210) type=6 
in function buildIndex_ 

मैं कैसे knnMatch सही ढंग से इस्तेमाल कर सकते हैं:

raw_matches=matcher.knnMatch(np.asarray(desc1),np.asarray(desc2), 2) 

अपवाद निम्नलिखित है? क्या यह एक बग है?

उत्तर

10

मैं समारोह np.asarray()

raw_matches=matcher.knnMatch(np.asarray(desc1,np.float32),np.asarray(desc2,np.float32), 2) #2 
+0

त्रुटि चली गई लेकिन यह कुछ भी नहीं मिला। –

0

this question का उत्तर देखें।

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4) 
flann = cv2.flann_Index(desc2, flann_params) 

निकटतम पड़ोसियों खोज करें:

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict 
mask = dist[:,0]/dist[:,1] < r_threshold 
idx1 = np.arange(len(desc1)) 
pairs = np.int32(zip(idx1, idx2[:,0])) 

रिटर्न वर्णनकर्ता अपने मापदंडों शब्दकोश का निर्माण

r_threshold = 0.6 
FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing 

:

यहाँ Esteban Angee के जवाब से, प्रासंगिक कोड है मिलान किया गया:

return pairs[mask] 

मैं अभी अपने वर्कस्टेशन पर नहीं हूं, इसलिए मुझे डर है कि मैं नहीं देख सकता कि आपके कोड में क्या गड़बड़ है, लेकिन ऊपर दिए गए प्रश्न में मेरी सभी परेशानी हल हो गईं जब मुझे एक ही समस्या थी। आपको FlannBasedMatcher का उपयोग करने की आवश्यकता नहीं है, मुझे याद है कि मुझे इसके साथ भी समस्याएं थीं।

यदि यह मदद नहीं करता है, तो मैं देखूंगा कि कल मैं अपना समाधान ढूंढ सकता हूं या नहीं।

+0

मैं idx2 = cv2.flann_Index() idx2.build (एनपी का उपयोग कर एक ही गलती लेकिन इस मामले में है के साथ सही डेटा प्रकार का उपयोग कर इस समस्या का समाधान। Asarray (desc2), flann_params) cv2.error: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.4.2/modules/flann/src/miniflann.cpps99 : त्रुटि: (-210) टाइप = 6 फ़ंक्शन buildIndex_ – Sergio

+0

क्या आपने मेरे उत्तर में पोस्ट किए गए कोड को आजमाया है? यह मेरे लिए काम किया। मुझे डर है कि मैं वास्तव में आपकी टिप्पणी नहीं समझता? – casper

+0

हां मैं ओपनसीवी-2.4.2 का उपयोग कर रहा हूं। जब मैंने आपके कोड की कोशिश की cv2.flann_Index (desc2, flann_params) ने कोई मॉड्यूल के बारे में अपवाद फेंक दिया। मैंने पढ़ा है कि आपको निम्न कार्यों को कोड करने की आवश्यकता है: idx2 = cv2.flann_Index() idx2.build (np.asarray (desc2), flann_params) – Sergio

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