51

我正在尝试使用 opencv 中的折线函数在图像上绘制任意四边形。当我这样做时,我收到以下错误

OpenCV 错误:折线中的断言失败 (p.checkVector(2, CV_32S) >= 0),文件 /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp,第 2065 行

我像这样调用函数,

cv2.polylines(img, points, 1, (255,255,255))

其中 points 为如下所示的 numpy 数组(图像大小为 1280x960):

[[910 641]
 [206 632]
 [696 488]
 [458 485]]

而 img 只是我能够显示的普通图像。目前我自己只是在这些点之间画线,但我正在寻找一个更优雅的解决方案。

我应该如何纠正这个错误?

4

7 回答 7

73

我的问题是默认情况下numpy.array创建了int64-bit 数字。所以我不得不将它显式转换为int32

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
# points.dtype => 'int64'
cv2.polylines(img, np.int32([points]), 1, (255,255,255))

(看起来像 cv2 python 绑定中的错误,它应该已经验证dtype

于 2013-09-15T20:26:10.540 回答
46

这个函数没有足够的文档记录,错误也不是很有用。在任何情况下,都cv2.polylines需要一个点列表,只需将您的行更改为:

import cv2
import numpy as np

img = np.zeros((768, 1024, 3), dtype='uint8')

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
cv2.polylines(img, [points], 1, (255,255,255))

winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey()
cv2.destroyWindow(winname)

上面的示例将打印以下图像(重新缩放):

在此处输入图像描述

于 2013-06-21T18:31:00.693 回答
12

错误说你的数组应该是维度 2。所以重塑数组如下:

points = points.reshape(-1,1,2)

然后它工作正常。

此外,jabaldonedo 提供的答案也适用于我。

于 2013-06-22T07:19:21.787 回答
1

替换cv2.fillPoly( im, np.int32(points))cv2.fillPoly( im, np.int32([points]))。它会起作用的。

于 2019-06-03T11:25:13.007 回答
1

我也遇到了同样的问题解决方案是制作一个包含 1 行、2 列和 - 1 深度的数组, - 1 表示未知维度,因此 numpy 将为数组分配方便的深度。如果您制作超过 1 行和 2 列的数组,则会显示错误。

当您创建的数组不是 int32 类型时,也会出现此错误

Vertices = np.array([[36,86] ,[73,73], [87,87]], dtype=np.int32)
于 2020-04-04T13:52:17.000 回答
1
import cv2
import numpy as np

sz, sh, of = 1000, 500, 100

# Create an Empty image with white background
im = 255 * np.ones(shape=[sz, sz, 3], dtype=np.uint8)

# Draw shapes
im = cv2.polylines(
    img=im,
    pts=[np.int32([
        [of, of], 
        [sh, of + of], 
        [sz - of, of],
        [sz-of-of,sh],
        [sz-of,sz-of],
        [sh,sz-of-of],
        [of,sz-of],
        [of+of,sh]])],
    isClosed=True,
    color=(128, 0, 200),
    thickness=30,
    lineType=cv2.LINE_AA,  # Anti-Aliased
)

cv2.imwrite("polylines.jpg", im)

在此处输入图像描述

于 2021-05-02T05:22:04.340 回答
0
pts = np.array([[40,300],[54,378],[60,420],[30,333]],np.int32) 
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,pts,True,(125,215,145),1)

官方文档提供解释,需要reshape

于 2018-01-11T03:05:26.690 回答