ElemAnybody
@ElemAnybody

Python. Определение площади фигуры найденной при помощи OpenCV?

Дан документ (допустим, что он распечатан, а не нарисован как у меня тут) 5d8b1e9ee1924510025272.jpeg
Код написан так, что он находит контур границы объекта, но площадь или точки взять я не могу.
Вот итог того, что у меня получилось сделать 5d8b1f247d3f4599751454.png
Мне нужно рассчитать площадь этой фигуры... В голову первым делом пришла формула Пика, но чтоб её надо сделать, надо построить на А4 листе клетку с размером 1см (точность не столь важна, как результат). Далее по формуле S=L+ (B/2) -1 можно будет рассчитать площадь фигуры, где L- это точки внутри фигуры, а B- точки на контуре фигуры.
Так же как я понял можно посчитать как то точки внутри объекта через функцию cv.floodfill, но его я освоить не смог. Кто может мне написать этот код? Я уже без понятия, я только начал изучать OpenCV (3.7), но инструкций таких очень мало, только теорию нахожу, которая никак не относиться к моей задаче

#мой код
import numpy as np
import cv2 as cv
import imutils
import cv2

# параметры цветового фильтра
hsv_min = np.array((0, 54, 5), np.uint8)
hsv_max = np.array((187, 255, 253), np.uint8)
img = cv.imread("C:\\45\\000.jpg")
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV )
# меняем цветовую модель с BGR на HSV
thresh = cv.inRange(hsv, hsv_min, hsv_max )
# применяем цветовой фильтр
# ищем контуры и складируем их в переменную contours
contours, hierarchy = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
#попытка нарисовать хотябы линию на картинке (не работает)
c = max(contours, key = cv.contourArea)
M = cv2.moments(c)
if M["m00"] != 0:
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
    print (cX,cY)
else:
    cX, cY = 0,0
    print (cX,cY)

# отображаем контуры поверх изображения
cv.drawContours(img, contours, -1, (255, 0, 0), 2, cv.LINE_AA, hierarchy, 0)
cv.imshow('contours', img)
cv.drawContours(img, contours, -1, (255, 0, 0), 2, cv.LINE_AA, hierarchy, 2)
# выводим итоговое изображение в окно
cv.imshow('All_con', img)
cv.imshow('thresh', thresh)
cv.waitKey()
cv.destroyAllWindows()
  • Вопрос задан
  • 5036 просмотров
Решения вопроса 2
@o5a
Она уже рассчитана, это M["m00"].
Ответ написан
adugin
@adugin Куратор тега Python
Я так и не понял, в чём ваша проблема. Вот контур обведён зелёным цветом и посчитана площадь:
5d8b77c73b6b1804596858.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
Способов много.
Если полигон векторизован, т.е., известны координаты концов всех его рёбер, то полигон триангулируется в набор треугольников (предварительно он разбивается на набор выпуклых многоугольников) и у каждого считается его площадь.
Если же это растр, то да, надо считать площадь залитой фигуры. Здесь основная проблема в определении начальной точки, которая однозначно будет лежать внутри многоугольника.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы