Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencv2.fillPoly的python接口需要什么作为输入?_Python_Opencv_Drawing - Fatal编程技术网

opencv2.fillPoly的python接口需要什么作为输入?

opencv2.fillPoly的python接口需要什么作为输入?,python,opencv,drawing,Python,Opencv,Drawing,我正在尝试使用python接口来绘制一个多边形到opencv,cv2。我创建了一个空图像,只是一个640x480 numpy阵列。我有一个多边形列表(四点四边形),我想在图像上绘制,但是,我似乎无法获得正确的格式来指示cv2四边形应该在哪里,我一直得到这个错误: OpenCV Error: Assertion failed (points.checkVector(2, CV_32S) >= 0) in fillConvexPoly, file .../OpenCV-2.4.0/module

我正在尝试使用python接口来绘制一个多边形到opencv,cv2。我创建了一个空图像,只是一个640x480 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()
其中,我的预期矩形列表具有包含(x,y)点列表值的“边界”。代码打印:

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

我想这是一个多边形的点列表,但显然该列表有一个无效的
点。checkvector
,不管是什么。google搜索该错误时没有发现任何有用的信息。

断言错误告诉您OpenCV需要一个有符号的32位整数。多边形点数组应具有该特定数据类型(例如,
points=numpy.array(A,dtype='int32')
)。您也可以为函数调用强制转换它(例如,
my_array.astype('int32')
),或者正如一位朋友曾经说过的那样

" 改变

cv2.fillConvexPoly(二进制图像,np.array(rect['boundary')),255)

cv2.fillConvexPoly(二进制图像,np.array(rect['boundary','int32'),255)

我已经在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)
将[]添加到矩形['boundary']

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


检查

我在这里尝试了cv2.fillPoly和cv2.fillConvexPoly,但都抛出了相同的错误…注意,openCV希望图像使用“uint8”。虽然我似乎可以在这里使用“int8”,但它后来给我带来了麻烦……openCV文档对此函数特别恼人:Python中没有关于输入类型的规范,也没有示例。需要注意的是,第二个参数是
numpy
数组的
list
,它是表示多边形顶点的numpy数组。获取
值的提示错误:使用序列设置数组元素。
在创建顶点的numpy数组时(
a3
):这可能是因为多边形的点数不同,这意味着列表的形状numpy无法转换为ndarray(而不是“nd立方体”)。我的解决方案是对每个多边形调用一次fillPoly。另一种方法是,用每个多边形顶点的最后一个顶点填充每个多边形顶点列表,使它们都具有相同的长度。@ThemaMax,必须从左上角逆时针移动这些点?这也是一个很难遵循的示例,它没有显示x和的顺序y@mLstudent33,实际上是a3,如上例所述,应具有时钟方向的坐标。也就是说,[左上、右上、右下、左下的坐标]。