什么是Python接口opencv2.fillPoly要输入?(What does the pyth

2019-07-30 04:30发布

我试图用Python接口的OpenCV,CV2绘制多边形。 我创建了一个空的图像,只是640×480 numpy的阵列。 我有我要在图像上绘制多边形(四个四边形)的名单,但是,我似乎无法得到指示CV2其中四边形应该是甲正确的,我不断收到此错误:

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 ,不管它是什么。 谷歌搜索的错误却一无所获有用。

Answer 1:

该Asse田告诉你的OpenCV想要一个签名的32位整数。 的多边形点阵列应具有特定的数据类型(例如points = numpy.array(A,dtype='int32') 你也可以只投它的函数调用(即my_array.astype('int32')或朋友把它一次...

“更改

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

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



Answer 2:

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



Answer 3:

我曾尝试在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)

添加[]将矩形[“边界”]。



文章来源: What does the python interface to opencv2.fillPoly want as input?