numpy python中的Opencv折线函数抛出异常

nle07wnf  于 2023-04-06  发布在  Python
关注(0)|答案(8)|浏览(217)

我尝试使用opencv中的polylines函数在图像上绘制任意四边形。
OpenCV错误:在折线文件/tmp/buildd/ros-fuerte-opencv 2 -2.4.2- 1 precise-20130312-1306/modules/core/src/d rawing.cpp第2065行中Assert失败(第页checkVector(2,CV_32S)〉= 0)
我把函数调用成这样,

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

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

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

img只是一个普通的图像,我可以imshow.目前我只是画线之间的这些点自己,但我正在寻找一个更优雅的解决方案.
我应该如何纠正这个错误?

pkbketx9

pkbketx91#

在我的例子中,问题是numpy.array默认创建int64位数。所以我必须显式地将其转换为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绑定中的一个bug,它应该已经验证了dtype

y0u0uwnf

y0u0uwnf2#

这个函数没有足够好的文档记录,错误也不是很有用。在任何情况下,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)

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

yb3bgrhw

yb3bgrhw3#

错误提示你的数组应该是2维的。因此,按照如下方式重新整形数组:

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

那就好办了。
另外,jabaldonedo提供的答案对我来说也很好。

g6ll5ycj

g6ll5ycj4#

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

wfypjpf4

wfypjpf45#

我也遇到了同样的问题,解决方案是创建一个1行,2列和- 1深度的数组,- 1表示未知的维度,因此numpy将为数组分配方便的深度。如果你创建的数组超过1行和2列,它将显示错误。
当您创建的数组不是int 32类型时,也会出现此错误

Vertices = np.array([[36,86] ,[73,73], [87,87]], dtype=np.int32)
wsxa1bj1

wsxa1bj16#

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)

xiozqbni

xiozqbni7#

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)

正式文件提供解释,需要重新塑造

j13ufse2

j13ufse28#

vertices = np.array(pts,dtype=np.int32)适合我

相关问题