OpenCV与arcLength的Python错误

Ola*_*lad 1 python opencv image-processing opencv3.0

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

error: (-215) count >= 0 && (depth == CV_32F || depth == CV_32S) in function cv::arcLength
Run Code Online (Sandbox Code Playgroud)

我的代码如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

灰度图像和比较图像均为灰度图像。该错误显然是在说我需要数组为浮点数或双精度数,但我不知道如何在python中进行转换,并且发现了许多函数正常工作的示例,并且代码似乎几乎相同。

此外,在大多数应用程序中,我注意到在大多数示例中,findContours()函数返回2个值,但如果不给出3则出现错误。

请帮我找到问题!

lje*_*ibo 5

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

我可以建议您尝试的是:

gray_image = cv2.convertScaleAbs(img)
Run Code Online (Sandbox Code Playgroud)

不知道返回的东西是怎么回事。

我也很抱歉,我误读了您要的是cv2,而您要的是cv3。我认为应该足够相似,请给我一些时间进行检查。

编辑

OpenCV3的语法有点不同,例如berak: opencv 3 beta / python中的findContours和drawContours错误

opencv 3的语法略有变化 ,返回值不同:

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) ? image, contours, hierarchy
Run Code Online (Sandbox Code Playgroud)