我的代码中存在问题,无法为其找到合适的解决方案。我使用的是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)
灰度和比较图像均为灰度。错误显然是说我需要我的数组是浮点数或双数,但我不知道如何在python中转换它,我发现很多例子,函数工作,代码看起来几乎相同。
此外,在大多数应用程序中,我注意到在大多数示例中,findContours()函数返回2个值,但如果我不给它3,我会收到错误。
请帮我找到问题!
答案 0 :(得分:5)
该错误实际上意味着您的图像是32位浮点数而不是整数。特别是8位无符号整数。我相信,这对应于OpenCV所理解的灰度图像。您可以使用其他类型的基础数字类型,它仍将以灰度模式显示在查看器中,但要了解您使用的查看器将重新调整它(安静地)以显示它。
我建议您尝试的是:
gray_image = cv2.convertScaleAbs(img)
不知道返回的东西是怎么回事。
我也道歉,我误以为你要求cv2并且你要求cv3。我认为它应该足够相似,给我一些时间来检查它。
OpenCV3有一些不同的语法,正如berak在这个问题中所回答的那样: findContours and drawContours errors in opencv 3 beta/python
opencv 3略有changed syntax 这里,返回值不同:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy
答案 1 :(得分:0)
尝试一下:
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)