当 len(contours)=1 时,contours 和 contours[0] 有什么区别?

What is the difference between contours and contours[0] when len(contours)=1?

我想找到图像的轮廓,然后绘制它的凸包。我正在做的是加载图像,对它进行阈值处理,找到它的轮廓,然后绘制凸包。

gray = cv2.imread(test_paths[i], 0)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]

检测到的轮廓数等于1。 当我尝试绘制轮廓时出现问题,如果我这样做

cv2.drawContours(cnt_dst, cnt, -1, (255, 0, 0), 3)
plt.imshow(cnt_dst)

如果我将代码更改为以下内容:

cv2.drawContours(cnt_dst, contours, 0, (255, 0, 0), 3)
plt.imshow(cnt_dst)

轮廓不同:

请注意,我得到了与此相同(不错)的结果:

cv2.drawContours(cnt_dst, contours, -1, (255, 0, 0), 3)

知道为什么会这样吗?

cv2.drawContours(cnt_dst, contours, 0, (255, 0, 0), 3)cv2.drawContours(cnt_dst, contours, -1, (255, 0, 0), 3) 在这种情况下是相同的

-1 告诉 opencv 绘制 all contours 数组的轮廓,0 告诉它绘制 contours 数组的第一个轮廓。

因为只有一个等高线,结果是一样的

另一个调用 cv2.drawContours(cnt_dst, cnt, -1, (255, 0, 0), 3) 可能是伪造的/应该在 opencv 端进行更好的检查。

this blog中表示:

Now you want to draw "cnt" only. It can be done as follows:
cv2.drawContours(im,[cnt],0,(255,0,0),-1) Note the square bracket around "cnt". Third argument set to 0, means only that particular contour is drawn.