Was bedeutet das python-interface zur opencv2.fillPoly wollen als input?
Ich versuche zum zeichnen eines Polygons mit der python-Schnittstelle zu opencv, cv2. Ich habe ein leeres Bild, nur eine 640 x 480-numpy array. Ich habe eine Liste von Polygonen (vier-Punkt-Quadraten), die ich zeichnen möchte, auf das Bild, aber ich kann nicht scheinen, um die formate richtig zu beauftragen, cv2, wo die Quadraten sein sollte, und ich bekomme immer diese Fehlermeldung:
OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/modules/core/src/drawing.cpp, line 2017
Mein code besteht im wesentlichen aus den folgenden:
binary_image = np.zeros(image.shape,dtype='int8')
for rect in expected:
print(np.array(rect['boundary']))
cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255)
fig = pyplot.figure(figsize=(16, 14))
ax = fig.add_subplot(111)
ax.imshow(binary_image)
pyplot.show()
wo meine Liste von rects in erwartet, hat die "Grenze" mit dem Wert, der eine Liste von (x,y) Punkte. Der code druckt:
[[ 91 233]
[419 227]
[410 324]
[ 94 349]]
Ich dachte mir, dass dies ist die Liste der Punkte für ein polygon, aber offenbar, die Liste hat einen ungültigen points.checkvector
, was auch immer das ist. Eine google-Suche nach dem Fehler erwies sich nichts nützlich.
- Ich habe versucht, sowohl die cv2.fillPoly und cv2.fillConvexPoly hier, und beide werfen die gleichen Fehler...
- beachten Sie, openCV will 'uint8' für Bilder. Während ich schien in der Lage sein, um Weg mit 'int8' hier, es verursacht mir Probleme später...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den AssertionError sagt Ihnen, dass OpenCV will eine signierte 32-bit-Ganzzahl. Das array der polygon-Punkte haben sollte, die bestimmten Datentyp (z.B.
points = numpy.array(A,dtype='int32')
). Man könnte auch einfach wirken, für die Funktion call (d.h.my_array.astype('int32')
) oder wie ein Freund drückte es einmal..."
Ändern
cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255)
zu
cv2.fillConvexPoly(binary_image, np.array(rect['boundary'], 'int32'), 255)
"
ValueError: setting an array element with a sequence.
bei der Erstellung der numpy-array von vertices (a3
in dieser Antwort): dies könnte aufgrund der Tatsache, dass Ihre Polygone haben nicht die gleiche Anzahl von Punkten, das heißt, die Liste hat eine Form, die numpy kann nicht konvertieren in ein ndarray (nicht ein "nd-cube"). Meine Lösung ist, um mit einem Anruf zu fillPoly pro polygon. Eine alternative könnte sein, die Polsterung jedes polygon vertices Liste mit Ihren letzten Eckpunkt, so dass Sie alle die gleiche Länge haben.Habe ich versucht in opencv 2.4.2 und python 2.7.
Aus der c++ - Schnittstelle
kennen wir die - Punkte ist das array von array von Punkten, so sollten Sie ändern, wie dies
fügen Sie [ ], um die rect['Grenze'].