Я должен соединить близлежащие контуры в изображении на основе расстояния между ними, которое указывает, должны ли контуры быть соединены.
Теперь уже есть вопрос по той же проблеме здесь /programming/8973017/opencv-c-obj-c-connect-nearby-contours, но здесь он объединяет все контуры в один. Это я не хочу. Я не думаю, что для этого есть какая-то функция в opencv, но вы можете предложить алгоритм для этого. Мое приложение выглядит так:
Я обнаруживаю руки, поэтому я использовал алгоритм определения кожи, чтобы определить их, но так как моя кожа не белая и, возможно, из-за условий осветления иногда контуры ломаются в локте. Поэтому я хочу, чтобы соседние контуры были связаны, но не все (потому что обе мои руки будут в контурах). (Под руками я имею в виду от плеча до ладони.)
Более того, я думаю, что с помощью некоторого обнаружения краев я получу границы моих рук и обнаружу, если часть этого участка внутри этой границы обнаружена как кожа, тогда вся область в пределах этой границы будет определена как кожа, но я не уверен, как это сделать часть.
Любая помощь будет оценена. заранее спасибо
Образец изображения:
В этом изображении я хочу соединить точки (8 соединений), которые имеют расстояние менее 40 пикселей, так что я получу левую руку в виде единого контура
Моя цель - получить только контур руки (мне плевать на любой другой регион)
Ответы:
Если вас не беспокоит скорость или точный контур руки, ниже приведено простое решение.
Метод такой: вы берете каждый контур и находите расстояние до других контуров. Если расстояние меньше 50, они рядом, и вы соединяете их вместе. Если нет, они ставятся как разные.
Таким образом, проверка расстояния до каждого контура занимает много времени. Занимает несколько секунд. Так что вы никак не можете сделать это в реальном времени.
Кроме того, чтобы соединить контуры, я поместил их в один набор и нарисовал выпуклый корпус для этого набора. Таким образом, в результате вы получаете выпуклую оболочку руки, а не настоящую руку.
Ниже мой кусок кода в OpenCV-Python. Я не пошел на какую-либо оптимизацию, просто хотел, чтобы она работала, вот и все. Если это решит вашу проблему, перейдите к оптимизации.
Ниже приведены результаты, которые я получил:
источник
Чтобы исправить проблему с подключением, вы можете попробовать закрыть операцию:
Я сомневаюсь, что это даст результаты, которые вы хотите, но вы можете попробовать.
источник
Похоже, вы «чрезмерно сегментируете» свое изображение. Морфологические операции, как предположил bjnoernz, помогли бы. В частности, подход водораздела должен быть ближе к тому, что вы хотите, чем просто проверка расстояния (как в примере с Python выше). См. Http://cmm.ensmp.fr/~beucher/wtshed.html .
источник