使用cv2.line基于numpy坐标数组绘制连续闭合线段报错求解
报错产生原因
cv2.line 对传入的坐标点参数有明确要求:
- 第二、第三个参数必须是单个坐标点,格式为包含两个整数的Python原生元组,格式为
(x, y) - 不支持直接传入numpy数组、切片得到的多点点集作为点位参数
你的代码存在两个核心问题触发报错:
- 点位传参错误:代码中
line[a:]、line[a+1:]是numpy数组的切片操作,返回的是从对应索引开始到数组末尾的所有点组成的二维数组,既不是单个点,也不是元组类型;哪怕写line[a]取单个点,返回的也是numpy ndarray类型,不符合参数类型要求。 - 索引逻辑错误:循环用
range(5)遍历的时候,当a取到4,a+1=5会超出长度为5的数组索引范围,返回空数组;最后单独写的闭合逻辑也有误,闭合需要连接最后一个点和第一个点,而非整个点集和第二个点。
解决方法
方法1:修正循环写法
遍历点对的时候单独取出每个点的x、y值,转为整数元组再传入cv2.line,注意索引不要越界,最后补上首尾点的连接即可:
n = len(line) # 自动获取点的总数,不用硬编码数值 # 连接相邻点 for i in range(n - 1): pt1 = (int(line[i][0]), int(line[i][1])) pt2 = (int(line[i+1][0]), int(line[i+1][1])) cv2.line(newimg, pt1, pt2, (255, 255, 255), 1) # 连接最后一个点和第一个点,完成闭合 cv2.line( newimg, (int(line[-1][0]), int(line[-1][1])), (int(line[0][0]), int(line[0][1])), (255, 255, 255), 1 )
方法2:使用OpenCV内置多边形绘制函数(推荐)
不需要手动写循环,直接调用cv2.polylines即可绘制连续折线,将isClosed参数设为True会自动完成首尾闭合,代码更简洁不易出错:
# 注意点集需要转为int32类型,且包裹在列表中传入 cv2.polylines( newimg, [line.astype(np.int32)], isClosed=True, color=(255, 255, 255), thickness=1 )
内容的提问来源于stack exchange,提问作者Surya Kertaningrat
相关产品推荐
相关产品推荐

