2012-06-29 21 views
6

Tôi đang cố vẽ một đa giác bằng giao diện python tới opencv, cv2. Tôi đã tạo ra một hình ảnh trống, chỉ là một mảng numpy 640x480. Tôi có một danh sách các đa giác (bốn điểm tứ giác) mà tôi muốn vẽ trên hình ảnh, tuy nhiên, tôi dường như không thể định dạng đúng hướng dẫn cv2 nơi tứ giác nên và tôi vẫn gặp lỗi này:Giao diện python để opencv2.fillPoly muốn làm đầu vào là gì?

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

mã của tôi bao gồm chủ yếu như sau:

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

nơi danh sách của tôi dễ phân biệt trong dự kiến ​​có 'ranh giới' chứa giá trị của một danh sách (x, y) điểm. Mã in:

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

Tôi nhận thấy đây là danh sách điểm cho đa giác, nhưng dường như danh sách đó có giá trị points.checkvector không hợp lệ, bất kể đó là gì. Tìm kiếm trên google cho lỗi đó không có gì hữu ích.

+0

Tôi đã thử cả hai cv2.fillPoly và cv2.fillConvexPoly đây, và cả hai ném lỗi tương tự ... – DaveA

+0

lưu ý, OpenCV muốn 'uint8' cho hình ảnh. Trong khi tôi xuất hiện để có thể nhận được ngay với 'int8' ở đây, nó gây ra rắc rối cho tôi sau này ... – DaveA

Trả lời

4

AssertionError cho bạn biết rằng OpenCV muốn có số nguyên 32 bit đã ký. Mảng các điểm đa giác phải có loại dữ liệu cụ thể đó (ví dụ: points = numpy.array (A, dtype = 'int32')). Bạn cũng có thể chỉ cast nó cho cuộc gọi chức năng (ví dụ my_array.astype ('int32')) hoặc như một người bạn đặt nó một lần ...

" Thay đổi

cv2.fillConvexPoly (binary_image, np. mảng (rect [ 'ranh giới']), 255) để

cv2.fillConvexPoly (binary_image, np.array (rect [ 'ranh giới'], 'int32'), 255) "

4

tôi có đã thử trong opencv 2.4.2 và python 2.7. Từ C++ giao diện

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

chúng ta biết điểm là mảng của mảng điểm, vì vậy bạn nên thay đổi như thế này

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

thêm [] đến rect [ 'ranh giới' ].

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

Các vấn đề liên quan