2012-06-29 2 views
6

Я пытаюсь нарисовать многоугольник, используя интерфейс python для opencv, cv2. Я создал пустое изображение, всего лишь массив размером 640x480. У меня есть список полигонов (четырехточечные четырехугольники), которые я хочу нарисовать на изображении, однако я не могу заставить formate правильно указывать cv2, где должны располагаться четырехугольники, и я продолжаю получать эту ошибку:В чем заключается интерфейс python для opencv2.fillPoly?

OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/modules/core/src/drawing.cpp, line 2017 

моего код состоит из по существу следующего:

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() 

где мой список прямоугольников в ожидаемом имеет «границу», содержащее значение списка (х, у) точек. Кодовые печатает:

[[ 91 233] 
[419 227] 
[410 324] 
[ 94 349]] 

Я понял, что это список точек для многоугольника, но, по-видимому, что список имеет недопустимое points.checkvector, что бы это. Поиск Google для этой ошибки не принес ничего полезного.

+0

Я попытался как cv2.fillPoly и cv2.fillConvexPoly здесь, и оба бросают ту же ошибку ... – DaveA

+0

примечание, OpenCV хочет '' Uint8 для изображений. В то время как я, казалось, смог уйти с 'int8' здесь, это вызвало у меня проблемы позже ... – DaveA

ответ

4

AssertionError сообщает вам, что OpenCV хочет иметь 32-битное целое. Массив точек многоугольника должен иметь тот конкретный тип данных (например, points = numpy.array (A, dtype = 'int32')). Вы также можете просто бросить его для вызова функции (т.е. my_array.astype ('int32')) или как друг выразился однажды ...

" Изменение

cv2.fillConvexPoly (binary_image, нп. массив (прямоугольник [ 'граница']), 255) к

cv2.fillConvexPoly (binary_image, np.array (прямоугольник [ 'граница'], 'int32'), 255) "

4

у меня есть в opencv 2.4.2 и python 2.7. С C++ интерфейс

void fillPoly(Mat& img, 
       const Point** pts, 
       const int* npts, 
       int ncontours, 
       const Scalar& color, 
       int lineType=8, 
       int shift=0, 
       Point offset=Point() 
      ) 

мы знаем PTS это массив из массивов точек, так что вы должны изменить как этот

cv2.fillConvexPoly(binary_image, np.array([rect['boundary']], 'int32'), 255) 

добавить [] к Rect [ 'границы' ].

6
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() 

result display

Смежные вопросы