2012-11-12 7 views
9

अचार/अनपिकल करता हूं, मैं विंडोज़ पर पायथन 2.7.3 पर opencv 2.4.3 के साथ एक दिलचस्प त्रुटि में चल रहा हूं। DrawContours का उपयोग करने का प्रयास करते समय मुझे "TypeError: contours डेटा प्रकार = 5 समर्थित नहीं है" त्रुटि प्राप्त होती है जब तक कि मैं पहले समोच्चों को अचार/अनपिक नहीं करता।drawContours के साथ डेटा प्रकार त्रुटि जब तक कि मैं पहले

यह काम नहीं करता (मैं हो "लेखन त्रुटि: आकृति डेटा प्रकार = 5 समर्थित नहीं है"):

noBg = cv2.blur(src, (5,5)) 
noBg = cv2.inRange(noBg, np.array([80, 0, 200], np.uint8), np.array([255, 50, 255], np.uint8)) 
noBg = np.invert(noBg) 
contours, hierarchy = cv2.findContours(noBg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
cv2.drawContours(src, contours, -1, (0,255,0), 3) 

लेकिन यह काम करता है:

noBg = cv2.blur(src, (5,5)) 
noBg = cv2.inRange(noBg, np.array([80, 0, 200], np.uint8), np.array([255, 50, 255], np.uint8)) 
noBg = np.invert(noBg) 
contours, hierarchy = cv2.findContours(noBg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 

tmp = cPickle.dumps(contours)  
contours = cPickle.loads(tmp) 

cv2.drawContours(src, contours, -1, (0,255,0), 3) 

किसी और देखा गया है यह व्यवहार या क्या मुझे कुछ याद आ रही है? मैं अजगर/ओपनसीवी के लिए नया हूं ताकि मामला बहुत अच्छा हो।

संपादित करें: बस मेरे मैक पर इसका परीक्षण किया गया, और दोनों मामले ठीक काम करते हैं। शायद सिर्फ एक विंडोज़ समस्या है?

+0

आप की जाँच की है, तो अचार प्रक्रिया वास्तव में अपने आकृति डेटा प्रकार बदल कर समाप्त होता है ? आपको यह चुनने के लिए कुछ और कोड लिखना चाहिए कि कैसे अचार/अनपिकल वास्तव में डेटा को संशोधित करता है। – AJMansfield

+0

यदि मैं प्रिंट का उपयोग करता हूं, तो डेटा पिकलिंग से पहले और बाद में दिखता है। क्या मेरे लिए दो की तुलना करने का कोई बेहतर तरीका है? मैं मानता हूं कि कुछ अलग होना चाहिए। –

+0

@ user1816939 मुझे वास्तव में कोई जानकारी नहीं है कि आप बेहतर तुलना कैसे करेंगे। शायद सभी वस्तुओं के सदस्यों के मूल्य को प्रिंट करके और सिर्फ प्रिंट करके? यद्यपि इसमें उससे अधिक कोड लिखना शामिल होगा ... शायद कुछ प्रकार का डीबगर ऐसा कर सकता है? – AJMansfield

उत्तर

8

यदि आप opencv 2.4.2 में डाउनग्रेड करते हैं तो यह काम करेगा। यह 2.4.3 के साथ एक बग प्रतीत होता है जिसे दो हफ्ते पहले रिलीज़ किया गया था।

+1

यह काम किया। धन्यवाद! क्या यह बग ओपनसीवी को सूचित किया गया है? –

4

मुझे OpenCV 2.4.3 प्राप्त करने के बाद एक ही समस्या का अनुभव हुआ है जब findContours और convexHull से contours का उपयोग करते समय। चूंकि मैं डाउनग्रेड नहीं करना चाहता था, int को अस्थायी रूप से समस्या हल करने के लिए समोच्च सरणी तत्वों कास्टिंग करना।

contours, _ = cv2.findContours(noBg,cv2.RETR_LIST ,cv2.CHAIN_APPROX_SIMPLE,offset = (0,0)) 
hull_contour = cv2.convexHull(contours[0].astype('int')) 
+0

यह ठीक काम करता है! ;) – yakxxx

0

मुझे पॉलिलाइन बनाने के साथ एक ही समस्या थी। यह 32 बिट पूर्णांक की उम्मीद है।

मैं uint32 करने के लिए अंक कास्टिंग किया गया था:

use_points = np.uint32(original_points) 

समस्या यह है कि यह 32 बिट, अहस्ताक्षरित नहीं पूर्णांकों का हस्ताक्षर किए पूर्णांक उम्मीद कर रहा था था। यह कोड में एक subtelty तो यह मुश्किल था, लेकिन उसके बाद इस काम किया:

use_points = np.int32(original_points) 

बस का उपयोग कर np.int32np.uint32 के बजाय

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