OpenCV 3.4.0轮廓拟合时arcLength及approxPolyDP报错求助
解决OpenCV 3.4.0中轮廓拟合的arcLength错误
嘿,我来帮你搞定这个OpenCV的报错问题~
首先,你遇到的第一个错误:
cv2.error: /io/opencv/modules/imgproc/src/shapedescr.cpp:237: error: (-215) count >= 0 && (depth == 5 || depth == 4) in function arcLength
这个错误的核心原因很明确:你传入cv2.arcLength()的轮廓cnt不符合要求。具体来说有两种可能:
- 轮廓里的点数量太少(小于3个,甚至是空的),没法计算弧长;
- 轮廓数组的数据类型不对——OpenCV的
arcLength要求轮廓数组的深度是CV_32F或CV_64F(对应Numpy的float32或float64),而你可能传入了int32类型的数组。
针对性解决步骤
先过滤无效轮廓
在处理轮廓之前,先把点数量不足的轮廓直接跳过,比如遍历轮廓时加个判断:for cnt in contours: # 至少需要3个点才能计算弧长和拟合多边形 if len(cnt) < 3: continue # 后续的arcLength和approxPolyDP代码...检查并转换轮廓的数据类型
可以先打印下轮廓的形状和类型,确认问题:print(cnt.shape, cnt.dtype)如果输出的dtype是
int32,就把它转成float32再传入函数:cnt = cnt.astype(np.float32)
关于注释后出现的绘图错误
你注释掉arcLength和approxPolyDP后出现的新错误,大概率是因为后续代码用到了approx这个变量(比如用cv2.drawContours画拟合后的多边形),但你没定义它了;或者是直接用原始轮廓绘图时,原始轮廓本身还是无效的(比如点太少)。
解决这个的话,要么确保绘图用的是经过过滤的有效原始轮廓,要么如果不需要拟合多边形,就直接用cnt来绘图:
cv2.drawContours(img, [cnt], 0, (0,255,0), 2)
完整的示例代码参考
给你一个能跑的完整片段,你可以对照着调整自己的代码:
import cv2 import numpy as np # 读取图像并预处理 img = cv2.imread("your_image_path.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化(根据你的实际需求调整阈值和类型) ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 检测轮廓(用RETR_EXTERNAL只检测最外层轮廓,减少无效轮廓) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: # 过滤点数量不足的轮廓 if len(cnt) < 3: continue # 转换数据类型 cnt_float = cnt.astype(np.float32) # 计算弧长 eps = cv2.arcLength(cnt_float, True) # 多边形拟合 approx = cv2.approxPolyDP(cnt_float, 0.01 * eps, True) # 把拟合结果转回int32(因为绘图函数一般接受int类型的坐标) approx = approx.astype(np.int32) # 绘制拟合后的轮廓 cv2.drawContours(img, [approx], 0, (0, 255, 0), 2) # 显示结果 cv2.imshow("Contour Approximation", img) cv2.waitKey(0) cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者GodIsAnAstronaut
相关产品推荐
相关产品推荐

