I'm trying to draw a polygon using the python interface to opencv, cv2. I've created an empty image, just a 640x480 numpy array. I have a list of polygons (four point quadrilaterals) that I want to draw on the image, however, I can't seem to get the formate right to instruct cv2 where the quadrilaterals should be, and I keep getting this error:
OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/modules/core/src/drawing.cpp, line 2017
My code consists of essentially the following:
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()
where my list of rects in expected has the 'boundary' containing the value of a list of (x,y) points. The code prints:
[[ 91 233] [419 227] [410 324] [ 94 349]]
I figured that this is the list of points for a polygon, but apparently that list has an invalid points.checkvector
, whatever that is. A google search for that error turned up nothing useful.
fillPoly() function of OpenCV is used to draw filled polygons like rectangle, triangle, pentagon over an image. This function takes inputs an image and endpoints of Polygon and color.
Step 1: Import cv2 and numpy. Step 2: Define the endpoints. Step 3: Define the image using zeros. Step 4: Draw the polygon using the fillpoly() function.
import numpy as np import cv2 import matplotlib.pyplot as plt a3 = np.array( [[[10,10],[100,10],[100,100],[10,100]]], dtype=np.int32 ) im = np.zeros([240,320],dtype=np.uint8) cv2.fillPoly( im, a3, 255 ) plt.imshow(im) plt.show()
Check on colab.research.google.com
The AssertionError is telling you that OpenCV wants a signed, 32-bit integer. The array of polygon points should have that particular data type (e.g. points = numpy.array(A,dtype='int32')
). You could also just cast it for the function call (i.e. my_array.astype('int32')
) or as a friend put it once...
" Changing
cv2.fillConvexPoly(binary_image, np.array(rect['boundary']), 255)
to
cv2.fillConvexPoly(binary_image, np.array(rect['boundary'], 'int32'), 255)
"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With