在Python中使用OpenCV查找轮廓时,`cnt = cnt [0] if len(cnt)== 2 else cnt [1]`的作用是什么?

eqqqjvef  于 2023-11-22  发布在  Python
关注(0)|答案(1)|浏览(127)

我在Python中使用OpenCV来查找图像的轮廓。我使用下面的代码,这似乎是这个任务的标准代码:

cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=lambda x: cv2.boundingRect(x)[1])

字符串
我很难理解这条线的目的:

cnts = cnts[0] if len(cnts) == 2 else cnts[1]


代码按预期工作,但为什么需要这一行?
如果我注解掉那一行,只运行上面代码的第一行和第三行,像这样:

cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=lambda x: cv2.boundingRect(x)[1])


然后我收到以下错误消息:

error                                     Traceback (most recent call last)
Cell In[56], line 2
      1 #cnts = cnts[0] if len(cnts) == 2 else cnts[1]
----> 2 cnts = sorted(cnts, key=lambda x: cv2.boundingRect(x)[1])

Cell In[56], line 2, in <lambda>(x)
      1 #cnts = cnts[0] if len(cnts) == 2 else cnts[1]
----> 2 cnts = sorted(cnts, key=lambda x: cv2.boundingRect(x)[1])

error: OpenCV(4.8.1) :-1: error: (-5:Bad argument) in function 'boundingRect'
> Overload resolution failed:
>  - array is not a numerical tuple
>  - Expected Ptr<cv::UMat> for argument 'array'

aor9mmx1

aor9mmx11#

这是为了使代码能够与版本3.x cv2im2, contours, hierarchy = cv2.findContours(4.xcontours, hierarchy = cv.findContours( . Doc一起工作。

相关问题