OpenCV arcLength 出现 Python 错误

OpenCV with Python error for arcLength

我的代码有问题,找不到合适的解决方案。我正在使用 Python 2.7.10 和 OpenCV 3.0。我读了两张图片,想将其中一张图片(模板)与另一张图片的轮廓相匹配,但出现以下错误:

error: (-215) count >= 0 && (depth == CV_32F || depth == CV_32S) in function cv::arcLength

我的代码如下所示:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 10, 17)
edges = cv2.Canny(gray, 100, 20)

contours,hierarchy, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    ret = cv2.matchShapes(c, compare, 1, 0.0)
    if ret < 0.5:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.02 * peri, True)

灰度图和对比图都是灰度图。错误显然是说我需要我的数组是 float 或 double,但我不知道如何在 python 中转换它,我发现了很多函数工作的例子,代码看起来几乎相同.

此外,在大多数应用程序中,我注意到在大多数示例中,findContours() 函数 returns 2 个值,但如果我不给它 3 个值,我会收到错误消息。

请帮我找出问题所在!

该错误实际上意味着您的图像是 32 位浮点数而不是整数。特别是 8 位无符号整数。我相信,这对应于 OpenCV 理解的灰度图像。您可以有其他类型的基础数字类型,它仍然会在查看器中以灰度模式显示,但请理解您使用的查看器会(安静地)重新缩放以显示它。

我可以推荐你尝试的是:

gray_image = cv2.convertScaleAbs(img)

不确定 return 是怎么回事。

另外,我很抱歉,我误读了您要求的是 cv2 而您要求的是 cv3。我觉得应该差不多吧,给我点时间看看

编辑

OpenCV3 的语法与 berak 在这个问题中的回答略有不同:

opencv 3 has a slightly changed syntax here, the return values differ:

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy

试试这个:

for c in contours[1]:
    ret = cv2.matchShapes(c, compare, 1, 0.0)
    if ret < 0.5:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.02 * peri, True)