我正在尝试使用opencv中的折线函数在图像上绘制任意四边形。当我这样做时,我得到以下错误
OpenCV错误:断言失败(p.checkVector(2,CV_32S)> = 0)in 折线,文件 /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))
其中point为numpy数组,如下所示(图像大小为1280x960):
[[910 641]
[206 632]
[696 488]
[458 485]]
和img只是一个我能够表达的正常形象。目前我只是在这些点之间画线,但我正在寻找更优雅的解决方案。
我该如何更正此错误?
答案 0 :(得分:37)
我的问题是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
)
答案 1 :(得分:27)
此功能记录不充分,错误也不是很有用。在任何情况下,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)
上面的示例将打印以下图像(重新缩放):
答案 2 :(得分:5)
错误说你的数组应该是2维。所以重新整形数组如下:
points = points.reshape(-1,1,2)
然后它工作正常。
此外,jabaldonedo提供的答案对我也很好。
答案 3 :(得分:1)
将cv2.fillPoly( im, np.int32(points))
替换为cv2.fillPoly( im, np.int32([points]))
。它将起作用。
答案 4 :(得分: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)
提供解释的官方文档,需要重塑
答案 5 :(得分:0)
我也遇到了同样的问题 解决方案是制作一个由1行,2列和-1个深度组成的数组,-1表示未知尺寸,因此numpy将为该数组分配方便的深度。如果您将数组设置为多于1行2列,则会显示错误。
当您创建的数组不是int32类型的数组时,也会发生此错误
Vertices = np.array([[36,86] ,[73,73], [87,87]], dtype=np.int32)
答案 6 :(得分:0)
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)