2012-11-12 3 views
9

Ich bin in einem interessanten Fehler mit Opencv 2.4.3 auf Python 2.7.3 unter Windows. Beim Versuch, drawContours zu verwenden, erhalte ich einen "TypeError: Konturen Datentyp = 5 wird nicht unterstützt" -Fehler, wenn ich die Konturen zuerst einlege/abnehme.Datentyp Fehler mit DrawContours, es sei denn, ich pickel/unpickle zuerst

Dies funktioniert nicht (ich bekommen "Typeerror: Konturen Datentyp = 5 wird nicht unterstützt"):

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) 

Aber das funktioniert:

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) 

Hat jemand gesehen Dieses Verhalten oder vermisse ich etwas Offensichtliches? Ich bin neu bei Python/Opencv, so dass es sehr wohl der Fall sein kann.

Edit: Ich habe dies nur auf meinem Mac getestet, und beide Fälle funktionieren gut. Vielleicht nur ein Windows-Problem?

+0

Haben Sie eigentlich, wenn der Beize Prozess geprüft endet Ihre Konturen Datentyp zu ändern ? Sie sollten etwas mehr Code schreiben, um zu testen, wie die Daten durch Pickle/Unpickle modifiziert werden. – AJMansfield

+0

Wenn ich drucke, sehen die Daten vor und nach dem Beizen gleich aus. Gibt es einen besseren Weg für mich, die beiden zu vergleichen? Ich stimme zu, dass etwas anders sein muss. –

+0

@ user1816939 Ich habe wirklich keine Ahnung, wie Sie einen besseren Vergleich machen würden. Vielleicht indem man den Wert aller Mitglieder der Objekte durchgeht und nur den Wert ausdruckt? Obwohl das mehr Code schreiben müsste, als es sollte ... Vielleicht kann ein Debugger das machen? – AJMansfield

Antwort

8

Wenn Sie auf opencv 2.4.2 herunterstufen, wird dies funktionieren. Es scheint ein Bug mit 2.4.3 zu sein, der vor zwei Wochen veröffentlicht wurde.

+1

Das hat funktioniert. Vielen Dank! Wurde dieser Fehler bei OpenCV gemeldet? –

4

Ich habe gerade das gleiche Problem nach dem Erlangen von OpenCV 2.4.3 bei der Verwendung von Konturen von findContours und convexHull erfahren. Da ich nicht downgraden wollte, löst das Umwandeln der Contours-Array-Elemente auf int das Problem vorübergehend.

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

es funktioniert gut! ;) – yakxxx

0

Ich hatte ein ähnliches Problem mit dem Zeichnen von Polylinien. Er erwartet 32 ​​Bit Ganzzahlen.

Ich war Gießen um die Punkte zu uint32:

use_points = np.uint32(original_points) 

Das Problem war, dass es unterzeichnet ganze Zahlen von 32 Bit erwartete, nicht ganze Zahlen ohne Vorzeichen. Es war ein subtelty im Code so war es schwer zu finden, aber dann ist dies gearbeitet:

use_points = np.int32(original_points) 

Nur mit np.int32 statt np.uint32

Verwandte Themen