2015-06-03 8 views
7

मुझे ओपनसीवी 3: के साथ कोई समस्या है, मैं एक सुविधा डिटेक्टर, सरलब्लोबडेटेटर का उपयोग करना चाहता हूं, जो उत्परिवर्तन और परिपत्र द्वारा फ़िल्टर का उपयोग करने के बारे में है। लेकिन जब मैं कोड को निष्पादित करने का प्रयास करें, निम्न त्रुटि पता लगाया जाता है:opencv 3, blobdetection, फ़ंक्शन/फीचर को कार्यान्वित नहीं किया गया है() और कॉम्प्यूट

The function/feature is not implemented() in detectAndCompute

तो अनुप्रयोग क्रैश हो जाता।

मैंने बिना किसी प्रासंगिक उत्तर के इंटरनेट में सूचनाओं की खोज की। मुझे लगता है कि ओपनसीवी का तीसरा संस्करण इस बग के लिए ज़िम्मेदार हो सकता है, क्योंकि मुझे पता है कि मैं डिटेक्टर का अच्छा तरीका उपयोग करता हूं (मैंने आधिकारिक ओपनसीवी ट्यूटोरियल की तरह कोशिश की) और मैंने देखा कि SimpleBlobDector को तीसरे संस्करण के लिए संशोधित किया गया है।

ब्रेकप्वाइंट का उपयोग करना, मुझे पता है कि निम्न पंक्ति दुर्घटनाओं:

detector.detect(gray, keypoints);

SimpleBlobDetector बनाया गया है (बनाने के समारोह का उपयोग) और कॉन्फ़िगर, ग्रे छवि रिक्त नहीं है और keypoints वेक्टर की जरूरत नहीं है पहचान से पहले भरने के लिए।

मैं ओपनसीवी 3.0.0 का उपयोग करता हूं, जिसे क्यूटीक्रिएटर के साथ मिनजीडब्ल्यू में संकलित किया गया है। ओपनसीवी उपचार मुख्य धागे से लॉन्च नहीं किया गया है।

क्या किसी और को भी एक ही समस्या है? यदि मैं किसी अन्य वर्ग का उपयोग कर पैच या कोई अन्य समाधान प्राप्त कर सकता हूं तो मैं आभारी रहूंगा। मुझे वास्तव में मेरे ब्लब्स को फ़िल्टर करने के लिए उत्परिवर्तन का उपयोग करने की आवश्यकता है और मुझे मिले अन्य डिटेक्टरों (फ़ीचरडिटेक्टर या ब्रिस्क) कॉन्फ़िगर करने योग्य नहीं हो सकते हैं और केवल मुख्य बिंदु लौटा सकते हैं, जिनमें उत्परिवर्तन की गणना करने के लिए क्षेत्र या पूर्णता पैरामीटर नहीं हैं।

अग्रिम

+0

क्या आप कुछ कोड साझा कर सकते हैं? आपकी छवि कितनी बड़ी है? मेरे लिए यह ओपनसीवी 3.0.0 में काम करता है - आपने कौन सा संस्करण बनाया है? गिथूब या बीटा? – Viatorus

उत्तर

0

धन्यवाद बस (...) का पता लगाने और नहीं detectAndCompute (...) का उपयोग करें। ब्लॉब डिटेक्शन के लिए परिभाषित कोई फीचर डिस्क्रिप्टर नहीं है।

यहाँ देखें: https://stackoverflow.com/a/11079868/1611317

+0

यह मामला नहीं है - ओपी राज्यों के रूप में, दुर्घटना 'detector.detect (...) 'रेखा पर है। –

1

प्रतिक्रिया के लिए धन्यवाद।

मैं पहचान का उपयोग करता हूं (जैसे मैंने अपने पिछले संदेश में कहा था)। मुझे लगता है कि डिटेक्ट फ़ंक्शन शायद detectAndCompute का उपयोग करता है।

वर्णनकर्ता की कमी वास्तव में समस्या हो सकती है, क्योंकि मुझे पहले से ही इम्गु (ओपनसीवी का सी # संस्करण) के साथ समकक्ष समस्या थी जब तक कि मुझे डेवलपर नोट नहीं मिला कि यह तरीका अभी तक सही नहीं किया गया था और वर्णनकर्ता था कारण।

अन्य लोगों के लिए जो एक ही समस्या है, मैंने आखिरकार ब्लॉब डिटेक्टर के बजाय सीवी :: findContours का उपयोग किया। यह किसी भी समस्या के बिना, बेहतर काम करता है। उत्परिवर्तन पहचान को प्रतिस्थापित करने के लिए, आप पूर्णता (आकार क्षेत्र/बाध्यकारी बॉक्स क्षेत्र) का उपयोग करके इसका मूल्यांकन कर सकते हैं। परिपत्र को प्रतिस्थापित करने के लिए, निम्न सूत्र का उपयोग करें:

circle area/bounding box area = PI/4

मुझे उम्मीद है कि यह अन्य लोगों की आशा करेगा।

11

ऐसा लगता है कि यह हल हो गया है, लेकिन शायद यह किसी और की मदद करता है। मुझे भी यही समस्या थी।

cv::SimpleBlobDetector detector; 
detector.create(params); 
detector.detect(img, keypoints); 

यह त्रुटि के साथ समाप्त हो गया: The function/feature is not implemented() in detectAndCompute मैं इस तरह ब्लॉब डिटेक्टर बनाया।

लेकिन जब मैं इसे इस तरह की कोशिश की:

cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 
detector->detect(img, keypoints); 

अब सब कुछ उम्मीद के रूप में काम करता है।

यह वास्तव में अजीब है और अगर कोई जानता है कि ऐसा क्यों काम कर रहा है तो कृपया मुझे बताएं।

11

ऐसा इसलिए है क्योंकि आप ओपनसीवी 3.X का उपयोग कर रहे हैं, जहां (इस लेखन के रूप में) आप सभी उदाहरणों को ऑनलाइन ओपनसीवी 2.X का उपयोग करेंगे। http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_hints_headers

कहते हैं जो आपको उपयोग करने की आवश्यकता:

Ptr<SomeAlgo> algo = makePtr<SomeAlgo>(...); 
Ptr<SomeAlgo> algo = SomeAlgo::create(...); 

बजाय:

SomeAlgo algo(); // bad 

तो

आप के आसपास खुदाई हैं, हालांकि, आप संक्रमण जानकारी प्राप्त होगी इस मामले में, आपको उपयोग करने की आवश्यकता होगी:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(); 

या:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(params); 

यदि आपने पैरामीटर।

+1

आपको 'Ptr 'का उपयोग करने की आवश्यकता है, एक कच्चा सूचक तुरंत" खुद को मार डालेगा " – berak

+0

हूप्स, धन्यवाद - तय। –

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