opencv findContours, значение contourrea не соответствует

#opencv #contour #area

#opencv #контур #область

Вопрос:

У меня есть тестовое изображение (см. 1-е изображение ниже) и очень простой код для размытия и точного определения границ этого изображения, затем используйте findcontours для получения контуров.

 image = cv2.imread("testimage.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(image, (11,11), 0)
cv2.imshow("Blurred", blurred)
canny = cv2.Canny(blurred, 50, 130)
cv2.imshow("Canny", canny)

(_, conts, _) = cv2.findContours(canny.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
img = image.copy()
for c in conts:
  M = cv2.moments(c)
  cX = int(M["m10"] / M["m00"])
  cY = int(M["m01"] / M["m00"])
  cv2.drawContours(img, [c], -1, (0,255,0), 1)
  cv2.putText(img, "area:" str(cv2.contourArea(c)), (cX-20,cY-20),
          cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

  cv2.imshow("Contours", img)

cv2.waitKey(0)
  

Я помещаю значение каждого контура на изображение. Как вы можете видеть, контуры выглядят похожими, но есть один контур с чрезвычайно низким значением площади (всего 16.0).

Что может быть причиной этого? И как получить согласованные значения среди этих контуров?

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Взгляните на документацию по contourrea : Таким образом, возвращаемая область и количество ненулевых пикселей, если вы рисуете контур с помощью drawContours или fillPoly , могут отличаться. Мы столкнулись с этой проблемой в наших проектах и поэтому написали небольшой метод, который рисует заполненные контуры на пустом изображении и подсчитывает ненулевые пиксели. Громоздкий, но единственно интуитивно понятный способ — с нашей точки зрения — получить правильную область контура.

2. @HansHirse Благодарю вас за вашу немедленную помощь. Вы имеете в виду «рисует заполненные контуры на ЧЕРНОМ изображении»?

3. Да, изображение черного цвета. Я имел в виду пустое изображение, как в пустом изображении.

4. @HansHirse Еще раз спасибо. Я все еще новичок в opencv. Можете ли вы привести мини-пример того, как «заполнить» контур пустого изображения?

5. Пожалуйста, взгляните на документацию drawContours . Или посмотрите на это руководство по Python.