2012-06-29 50 views
6

我想繪製一個使用python界面的多邊形opencv,cv2。我創建了一個空的圖像,只是一個640x480的numpy數組。我有一張要在圖像上繪製的多邊形列表(四點四邊形),但是,我似乎無法獲得指示cv2四邊形應該在哪裏的合法權限,並且我一直收到此錯誤:opencv2.fillPoly的python接口需要什麼作爲輸入?

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

凡在我預期的rects列表中有含(X,Y)點列表值的「邊界」。該代碼打印:

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

我想,這是一個點的一個多邊形的名單,但顯然該列表具有無效points.checkvector,不管它是什麼。谷歌搜索該錯誤沒有任何用處。

+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,NP。陣列(矩形[ '邊界']),255) 到

cv2.fillConvexPoly(binary_image,np.array(RECT [ '邊界'], '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() 
      ) 

我們知道是一個點的數組的數組,所以你應該這樣

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

更改添加[]將值爲[「邊界」 ]

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

相關問題