cv2.contourArea не получил нужную область

«1.png имеет только один контур»

img = cv2.imread('1.png')

retval,dst = cv2.threshold(img,120,255,cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(dst,cv2.RETR_EXTERANL,cv2.CHAIN_APPROX_SIMPLE)

print cv2.contourArea(contours[0],False) 

Изображение имеет только один контур, тогда контуры представляют собой список. Когда я меняю contours[0] на contours[3] или другие числа, площадь все равно остается. У меня нет идей по поводу вопроса, только один контур.

Почему появляется так много значений? Это проблема найденного треша? Нужна ваша помощь?


person user2128748    schedule 06.03.2013    source источник


Ответы (1)


Проблема в том, что то, что OpenCV считает контуром, является лишь частью того, что вы считаете контуром. Другими словами, OpenCV разбивает ваш контур на части. Возможно, вы могли бы получить полную площадь, добавив площади отдельных контуров, но этот метод ненадежен.

Вы можете попробовать морфологию изображения. Используя это, вы можете «вырастить» контуры, чтобы они больше перекрывались, что означало бы, что вероятность того, что OpenCV распознает их как один контур, будет больше.

Однако этот метод приведет к потере точности. Поэтому, если вам нужна точная площадь, вам придется полагаться на другие методы. Для сложной геометрии это непростая задача.

Еще одно «быстрое и грязное» решение, которое я использовал, состоит в том, чтобы создать новый одноканальный мат (Mat::zeros), нарисовать контуры, заполненные значением цвета 255 (drawContours), и суммировать содержимое (в c++ это cv::sum и для вас, я думаю, это cv2.sum), затем разделите результат на 255. Это даст вам площадь в пикселях и будет более надежным, чем суммирование площадей отдельных контуров, поскольку будет учитываться перекрытие между их.

person Steve Westbrook    schedule 06.03.2013