Как определить контуры, связанные с моими объектами, и найти их геометрический центроид

Для поля «n%» (и заполнения) для того же для margin-top / margin-right / margin-bottom / margin-left, все четыре должны относиться к одному и тому же база. Если верхняя / нижняя область использовала другую базу, чем левая / правая, то маржа «n%» (и отступы) не будет означать одно и то же на всех четырех сторонах.

(Также обратите внимание, что верхнее / нижнее поле по отношению к ширине позволяет использовать странный CSS-хак, который позволяет вам указать поле с неизменным соотношением сторон ... даже если коробка перемасштабирована.)

1
задан NoviceCoder 25 February 2019 в 01:48
поделиться

1 ответ

  1. Вместо того, чтобы выполнять размытие, набор номера, обнаружение неровных краев на моем уже пороговом изображении, я просто выполнил определение контура на своем исходном изображении.

  2. Затем я смог найти приличный контур для контура моего изображения, изменив команду findContour.

    _, контуры, _ = cv2.findContours (серый, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

заменяя cv2.RETR_TREE на cv2.RETR_EXTERNAL I был в состоянии получить только контуры, которые были связаны с контуром объекта, вместо того, чтобы пытаться получить контуры внутри объекта. Переключение на cv2.CHAIN_APPROX_NONE не показало каких-либо заметных улучшений, но оно может обеспечить лучшие контуры для более сложной геометрии.

        for c in cnts:
        # compute the center of the contour
        M = cv2.moments(c)
        cX = int(M["m10"] / M["m00"])
        cY = int(M["m01"] / M["m00"])

        # draw the contour and center of the shape on the image
        cv2.drawContours(empty2, [c], -1, (255, 0, 0), thickness=1)
        perimeter = np.around(cv2.arcLength(c, True), decimals=3)
        area = np.around(cv2.contourArea(c), decimals=3)

        cv2.circle(empty2, (cX, cY), 7, (255, 255, 255), -1)
        cv2.putText(empty2, "center", (cX - 20, cY - 20),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

        cv2.putText(empty2, "P:{}".format(perimeter), (cX - 50, cY - 50),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

        cv2.putText(empty2, "A:{}".format(area), (cX - 100, cY - 100),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

Используя приведенный выше код, я смог обозначить центроид каждого контура, а также информацию о периметре каждого контура и площади.

enter image description here

Однако я не смог выполнить тест, который бы выбрал, какой контур был моим желаемым контуром. У меня есть идея захватить мой объект в более идеальной обстановке и найти его центроид, периметр и связанную с ним область. Таким образом, когда я нахожу новый контур, я могу сравнить его с тем, насколько он близок к моим известным значениям.

Я думаю, что этот метод может работать, чтобы удалить слишком большие или слишком маленькие контуры.

Если кто-нибудь знает о лучшем решении, которое было бы фантастическим!

0
ответ дан NoviceCoder 25 February 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: