Когда люди видят маркеры, предлагающие форму формы, они сразу же воспринимают саму форму, как в https://en.wikipedia.org/wiki/Illusory_contours. Я пытаюсь сделать нечто подобное в OpenCV, чтобы обнаружить форму руки вглубина изображения с очень сильным шумом.В этом вопросе предположим, что определение цвета кожи не работает (на самом деле это лучшее, чего я достиг за последнее время, но оно не является устойчивым при изменении условий освещения, теней или цветов кожи. Также используются различные формы бумаги (плоские и цветные)на столе, сбивающие с толку основанные на цвете подходы. Вот почему я пытаюсь использовать вместо этого камеру глубины).
Вот пример изображения живого материала, который уже предварительно обработан для лучшей контрастности и судален градиент фона:
Я хочу выделить точную форму руки от остальной части изображения.Для человеческого глаза это тривиальная вещь.Итак, вот несколько попыток, которые я предпринял:
Вот результат с примененным обнаружением кромки.Проблема здесь в том, что черная фигура внутри руки больше, чем фактическая рука, что приводит к превышению размера обнаруженной руки.Кроме того, линии не связаны, и я не могу определить контуры.
Обновление: Комбинирование Canny и морфологического замыкания (эллипс 4x4 px) делает возможным обнаружение контура с помощью следующихрезультат.По-прежнему слишком шумно.
Обновление 2: Результат может быть слегка улучшенрисуя этот контур в пустой маске, сохраните его в буфере и повторно определите еще один контур при объединении трех буферизованных изображений.Линия, объединяющая буферизованные изображения, имеет вид hand_img = np.array(np.minimum(255, np.multiply.reduce(self.buf)), np.uint8)
, который затем снова трансформируется (закрывается) и, наконец, обнаруживается контур.Результаты немного менее ужасны, чем на картинке выше, но вместо этого запаздывают.
В качестве альтернативы я попытался использовать существующий CNN (https://github.com/victordibia/handtracking) для определения приблизительного положения центра руки (этошаг работает), а затем затопить оттуда. Для обнаружения контуров результат помещается в фильтр OTSU, а затем получается самый большой контур, что приводит к следующему рисунку (игнорируются черные прямоугольники слева). Проблема заключается в том, что некоторые изшум также затоплен, и результаты посредственны:
Наконец, я попробовал средства для удаления фона, такие как MOG2 или GMG. Они смущены огромным количеством быстро движущихсяШум. Также они обрезают кончики пальцев (что крайне важно для этого проекта). Наконец, они не видят достаточно деталей в руке (8 бит плюс дальнейшее уменьшение цвета с помощью equalizeHist
дают очень плохое разрешение в оттенках серого) для надежного обнаружениямаленькие движения.
Смешно, как просто человеку увидеть экзct Точная форма руки на первом изображении и насколько невероятно трудно для компьютера нарисовать форму.
Какой метод рекомендовался бы для точной сегментации руки?