Python中的Opencv折线函数抛出异常

Ash*_*hok 31 python opencv numpy points

我正在尝试使用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))
Run Code Online (Sandbox Code Playgroud)

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

[[910 641]
 [206 632]
 [696 488]
 [458 485]]
Run Code Online (Sandbox Code Playgroud)

而img只是一个我能够表达的正常形象.目前我只是在这些点之间画线,但我正在寻找更优雅的解决方案.

我该如何纠正这个错误?

Van*_*uan 46

我的问题是默认情况下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))
Run Code Online (Sandbox Code Playgroud)

(看起来像cv2 python绑定中的一个bug,它应该已经验证dtype)

  • 你也可以使用`np.array(...,dtype = np.int32)`. (9认同)
  • 这样做的原因不是因为类型转换,而是因为您将点转换为点数组。第二个 c++ arg 是数组的输入数组 (6认同)
  • 其实我说得太早了。类型也很重要。折线内有一个 checkVector(2, CV_32S) 检查,如果您不传入 32 位 int,该检查就会失败。 (2认同)

jab*_*edo 31

此功能不够详细记录,错误也不是很有用.在任何情况下,都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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

  • `[points]`也为我解决了,我的`points`已经在`int32`中了. (3认同)
  • 你给出的示例程序给了我同样的错误.`OpenCV错误:折线中的断言失败(p.checkVector(2,CV_32S)> = 0),文件/tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/ drawing.cpp,line 2065`也许这是我的版本的问题!! (2认同)

Abi*_*n K 5

该错误表明您的数组应为2维。因此,请按如下所示重新调整数组的形状:

points = points.reshape(-1,1,2)
Run Code Online (Sandbox Code Playgroud)

然后工作正常。

另外,jabaldonedo提供的答案对我也很好。