cv2.fillPoly странные результаты

1

Пытаясь растеризовать простой поли, используя cv2.fillPoly я получаю странный результат - сумма нулевых пикселей равна 10201, но она должна быть 100 * 100.

pts = np.array([[0, 0], [100, 0], [100, 100], [0, 100], [0, 0]])
img = np.zeros((256, 256))
vertices = np.array([pts], dtype=np.int32)
mask = cv2.fillPoly(img, vertices, color=255)
print('np.count_nonzero(mask)', np.count_nonzero(mask))

Что не так?

  • 1
    Отклонение от одной ошибки - это должно быть 101 * 101 (что и есть), поскольку у вас есть ребро в столбце 100 и строке 100. Представьте себе в небольшом масштабе ( [[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]] ) это 4 строки, покрывающие 4 пикселя (и заполнять нечего).
  • 1
    @DanMašek DanMašek О, да.
Показать ещё 1 комментарий
Теги:
opencv

1 ответ

1
Лучший ответ

Вы сделали простую ошибку за один раз - она должна быть 101 * 101 (это 10201).

Чтобы проиллюстрировать, почему, уменьшите проблему и запустите свой алгоритм следующего набора точек:

[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]

и проиллюстрировать прогресс в следующей сетке:

Изображение 174551

Вызов cv2.fillPoly с этими вершинами делает (концептуально) следующие 5 вещей:

  • Нарисуйте линию от (0,0) до (2,0)

    Изображение 174551

  • Нарисуйте линию от (2,0) до (2,2)

    Изображение 174551

  • Нарисуйте линию от (2,2) до (0,2)

    Изображение 174551

  • Нарисуйте линию от (0,2) до (0,0)

    Изображение 174551

  • Заполните многоугольник

    Изображение 174551

В результате

Изображение 174551

Как вы можете видеть, имеется 9 пикселей:

  • Используются 3 столбца (от 0 до 2 включительно, что означает (2 - 0) + 1 == 3).
  • Используются 3 строки (от 0 до 2 включительно, что означает (2 - 0) + 1 == 3).

Аналогично, в вашем случае: (100 - 0 + 1) * (100 - 0 + 1) = 101 * 101 = 10201

Ещё вопросы

Сообщество Overcoder
Наверх
Меню