Python中OpenCV里`cnts = cnts[0] if len(cnts)==2 else cnts[1]`的作用是什么?
关于OpenCV中
cv2.findContours返回值处理代码的作用解析 这行cnts = cnts[0] if len(cnts) == 2 else cnts[1]代码的核心作用是兼容不同OpenCV版本的返回值差异,确保cnts始终指向提取到的轮廓列表:
- OpenCV的版本差异导致
cv2.findContours的返回值数量不同:- OpenCV 2.x和4.x版本中,该函数返回两个值:
(contours, hierarchy),其中contours是提取到的轮廓列表,hierarchy是轮廓的层级信息; - OpenCV 3.x版本中,该函数返回三个值:
(image, contours, hierarchy),多了一个处理后的图像参数,轮廓列表contours是第二个返回值。
- OpenCV 2.x和4.x版本中,该函数返回两个值:
这行代码通过判断返回值的长度,自动选择对应的轮廓列表:
- 当返回值长度为2时(对应2.x/4.x),取第一个元素
cnts[0],也就是轮廓列表; - 当返回值长度不为2时(对应3.x),取第二个元素
cnts[1],也就是轮廓列表。
为什么注释掉这行代码会报错?
注释掉后,cnts保存的是cv2.findContours返回的完整元组(比如4.x中是(contours, hierarchy))。当你执行sorted(cnts, ...)时,会遍历这个元组里的每一个元素:
- 第一个元素是轮廓列表,传给
cv2.boundingRect没问题; - 第二个元素是层级信息(是一个数组,不是单个轮廓的点集),传给
cv2.boundingRect时,函数无法识别这个参数类型,就会抛出你看到的“array is not a numerical tuple”错误——因为boundingRect需要接收单个轮廓的点数组,而不是层级信息。
内容的提问来源于stack exchange,提问作者Josh F
相关产品推荐
相关产品推荐

