В чем разница между контурами и контурами [0], когда 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)

Есть идеи, почему это происходит?


person Manuel Lagunas    schedule 10.01.2017    source источник


Ответы (1)


cv2.drawContours(cnt_dst, contours, 0, (255, 0, 0), 3) или cv2.drawContours(cnt_dst, contours, -1, (255, 0, 0), 3) в этом случае совпадают

-1 указывает opencv рисовать все контуры массива контуров, а 0 указывает ему рисовать первый контур массива контуров.

Поскольку есть только один контур, результат тот же.

Другой вызов cv2.drawContours(cnt_dst, cnt, -1, (255, 0, 0), 3), вероятно, является фиктивным/следует лучше проверить на стороне opencv.

В этом блоге указано :

Теперь вы хотите рисовать только "cnt". Это можно сделать следующим образом:
cv2.drawContours(im,[cnt],0,(255,0,0),-1) Обратите внимание на квадратную скобку вокруг "cnt". Третий аргумент, установленный в 0, означает, что рисуется только этот конкретный контур.

person Jean-François Fabre    schedule 10.01.2017
comment
cv2.drawContours(cnt_dst, [cnt], -1, (255, 0, 0), 3) сделал это. Спасибо! - person Manuel Lagunas; 10.01.2017