Функция OpenCV convexityDefects выдает ошибку из-за самопересечений во входном контуреPython

Программы на Python
Anonymous
Функция OpenCV convexityDefects выдает ошибку из-за самопересечений во входном контуре

Сообщение Anonymous »

Я использую OpenCV-python версии 4.13.0.92 для расчета выпуклых оболочек, окружающих наборы точек. Я хочу использовать функцию convexityDefect, чтобы найти максимальное расстояние между корпусом и контуром, который он окружает. Когда я вызываю функцию convexityDefect, я получаю следующую ошибку:

Код: Выделить всё


cv2.error: OpenCV(4.13.0) /io/opencv/modules/imgproc/src/convhull.cpp:397: error: (-5:Bad argument) The convex hull indices are not monotonous, which can be in the case when the input contour contains self-intersections in function 'convexityDefects'
Это можно воспроизвести с помощью следующего кода. Если закомментированная точка включена, возникает ошибка. Если закомментированная точка не включена или закомментированная точка перемещается на первую позицию в массиве точек, ошибка не выдается. Еще я заметил, что если удалить среднюю строку из трех точек, ошибка все равно возникает, но уже не устраняется перемещением закомментированной точки на первую позицию массива.

Код: Выделить всё

import cv2
import numpy as np

cont = np.array([[364,633],[364,636],#[360,636],
[408,599],[409,599],[355,557],
[351,571],[349,573],[347,573]])

hull = cv2.convexHull(cont, returnPoints=False)
defects = cv2.convexityDefects(cont, hull)
Я понимаю, что это связано с порядком точек на контуре, а не с тем, как его решить.
Дополнительные подробности, если они актуальны:
  • Приведенный список точек представляет собой небольшой воспроизводимый пример — мои фактические наборы точек обычно составляют несколько сотен точек. Я придумал этот пример, удаляя точки из фактического набора, пока не получил пример разумного размера.
  • Мои наборы точек создаются с помощью обнаружения краев для поиска линий, нарисованных на отсканированном листе бумаги, и использования кластеризации для группировки линий, которые находятся ближе всего друг к другу в пространстве. Я объединяю набор контуров для каждого кластера в один контур, используя numpy vstack — контур, вокруг которого я пытаюсь нарисовать выпуклую оболочку. Я подозреваю, что именно поэтому мои контуры представляют собой форму, вызывающую проблемы с функцией convexityDefects. Я могу добавить этот код к вопросу, если это полезно.
Я подозреваю, что лучшим решением может быть лучший способ объединить несколько контуров в один, поскольку мой текущий метод также добавляет линию между концом каждого контура и началом следующего, что может иметь значение в зависимости от расположения отдельных контуров.
Могу ли я что-нибудь сделать, чтобы получить контур и выпуклую оболочку, которые работают с функция convexityDefects?

Вернуться в «Python»