Python OpenCV рисует контур только на внешней границе

При рисовании контура с использованием OpenCV drawContours границы рисуются по центру контура, я хочу рисовать границу только снаружи контура.

Это изображение (взято из документации SketchUp) объясняет это лучше всего: введите здесь описание изображения

drawContours рисует контур как в первом круге (контур находится посередине нарисованной границы). Мне нужно, чтобы граница была только снаружи контура, как в последнем круге.

У кого-нибудь есть идея о том, как я могу добиться такого поведения?

Спасибо.


person Nimrod Shory    schedule 19.11.2015    source источник
comment
OpenCV не имеет встроенной функции для этого. Если вы не слишком заботитесь о производительности, вы можете: 1) нарисовать заполненный белый контур на mask1, 2) расширить на 1 на mask2, 3) mask3 = mask1 XOR mask2. 4) установите пиксели в вашем изображении нужного вам цвета с помощью mask3.   -  person Miki    schedule 19.11.2015
comment
Будет ли у вас всегда внутренний круг с однородным цветом, и есть ли у вас информация о цвете внутреннего круга в момент рисования контуров?   -  person ZdaR    schedule 19.11.2015


Ответы (2)


используйте код как

  _ret, contours, hierarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
  cv2.drawContours(img,contours , -1, (255,0,0), 1)

здесь cv2.RETR_EXTERNAL дает только внешний обнаруженный контур.

person AdityaIntwala    schedule 19.11.2015
comment
Спасибо за ваш ответ AdityaIntwala, но я говорю о рисовании контуров, а не об обнаружении контуров. - person Nimrod Shory; 19.11.2015
comment
вам нужно найти внешний контур для этого.. как только вы найдете внешний контур, вы можете нарисовать найденный внешний контур, используя функцию drawContours в обычном режиме. - person AdityaIntwala; 20.11.2015

Предполагая, что цвет внутреннего ядра всегда однороден, и вы заранее знаете значение цвета ядра, мы можем просто сделать это так:

#First you draw the contour on both the sides of the border.
contour_id = 0
border_thickness = 10
border_color = (185, 115, 72)
cv2.drawContours(img, contours, contour_id, border_color, border_thickness)

#Now you again draw contour but with thickness = -1 and color = Core color
border_thickness = -1
core_color = (225, 141, 98)
cv2.drawContours(img, contours, contour_id, core_color, border_thickness)
person ZdaR    schedule 20.11.2015