28

我正在尝试使用 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]]

我认为这是多边形的点列表,但显然该列表有一个 invalid points.checkvector,不管是什么。谷歌搜索该错误没有任何用处。

4

4 回答 4

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

结果显示

检查colab.research.google.com

于 2015-12-04T09:55:01.783 回答
15

AssertionError 告诉您 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) "

于 2012-06-30T00:38:46.800 回答
7

我在 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['boundary']

于 2012-08-02T02:03:39.623 回答
1

这是一个带有注释点的示例。您可以按顺时针或逆时针顺序指定多边形顶点,只要它们遵循相同的方向。

import numpy as np
import matplotlib.pyplot as plt
import cv2

A = np.array([125,50])
B = np.array([50,50])
C = np.array([50,175])
D = np.array([150,150])

pts = np.array( [ A, B, C, D ] ) # counter-clockwise
#pts = np.array( [ A, D, C, B ] ) # clockwise

print(pts.shape) # (4, 2)

image = np.zeros((200,200), dtype=np.uint8)
image = np.dstack((image, image, image)) # Create three channels.

cv2.fillPoly(image, pts=[pts], color =(0,255,0))

for pt in pts:
    x = pt[0]
    y = pt[1]
    _ = plt.annotate(s='%d, %d' % (x, y), xy=(x, y), color='red', fontsize=20)

print(image.shape) # (200, 200, 3)

plt.imshow(image)
plt.grid(True)
plt.show()

在此处输入图像描述

如果您的顶点重新排列以使它们不遵循相同的方向,会发生什么?

pts = np.array( [ A, B, D, C ] )

你得到这个:

在此处输入图像描述

于 2021-07-07T17:45:10.383 回答