cv2.polylines传入嵌套tuple报错,如何生成符合要求的数值tuple
问题原因
cv2.polylines的第二个参数要求传入轮廓集合,也就是外层是一个序列,里面的每个元素才是单个轮廓的点序列。你构造的maxcontour是单个轮廓的点序列,少了外层的集合维度,所以无法被识别。
解决方法
1. 直接用tuple格式(符合你对数值tuple的要求)
给已有的轮廓额外套一层外层tuple即可,注意单元素tuple末尾的逗号不能省略,否则会被识别为普通括号包裹的表达式:
# 构造时多套一层外层括号 maxcontour = ( ( (minx,miny),(maxx,miny),(maxx,maxy),(minx,maxy) ), ) # 直接传参即可 cv2.polylines(img, maxcontour, True, (0,0,255), 5 )
2. 通用numpy数组格式(适配性更高,OpenCV官方更推荐)
将点转为int32类型的numpy数组并调整维度,传入时放到列表里即可:
import numpy as np # 构造符合要求的轮廓数组 maxcontour = np.array([ [minx, miny], [maxx, miny], [maxx, maxy], [minx, maxy] ], dtype=np.int32).reshape((-1, 1, 2)) # 传入时套一层列表 cv2.polylines(img, [maxcontour], True, (0,0,255), 5 )
报错原理说明
你之前传入的4元素tuple会被OpenCV解析为4个独立的单点点序列,每个点只有2个坐标值,不符合轮廓的维度要求,因此抛出pts is not a numerical tuple的错误,和UMat相关的报错是重载匹配失败后的衍生提示,没有实际参考价值。
内容的提问来源于stack exchange,提问作者PA.
相关产品推荐
相关产品推荐

