Определить расстояние между камерой и человеком / лицом в python-OpenCV - PullRequest
0 голосов
/ 03 октября 2018

Существует множество обучающих программ о том, как рассчитать расстояние между камерой и объектом.Можно ли рассчитать приблизительное расстояние между обнаруженным человеком и камерой с помощью OpenCV?.

1 Ответ

0 голосов
/ 03 октября 2018

Да, это возможно.Как упомянуто @hkchengrex, считайте ваше лицо объектом.Есть много методов.Я бы порекомендовал SIFT Feature Matching методов, описанных по этой ссылке.

Вот примерно необходимые шаги:

  1. Сделайте снимок человека иизмерьте расстояние вручную.
  2. Обрежьте это изображение, чтобы оно содержало только человека.
  3. Извлеките функции изображения (например, в качестве дескриптора просеивания)
  4. Сделайте второе изображение с тем же человеком, но с неизвестным расстоянием.
  5. Обнаружение человека с помощью сопоставления просеивания (см. Ссылку выше)
  6. Вычисление преобразования между этими двумя векторами просеивания
  7. Применение преобразования к расстоянию, измеренному в 1.

Лучшее начало по предоставленной ссылке и дальнейшим учебникам по SIFT в opencv.Требуемый подход очень прост и сработает только в том случае, если человек на исследуемой картине очень похож на человека на картинке один.Для более продвинутых подходов я бы сослался на научные статьи.Искать «обнаружение человека».

В ответ на комментарии

TL; DR человек с такой же высотой / шириной в реальности, но отображаемый меньше/ больше на изображении можно измерить относительно расстояния.

Изображенный подход работает под капотом следующим образом.Человека (= обрезанное изображение), снятого на шаге 2, можно найти в любом будущем изображении, если он / она выглядит очень похожим.В новом изображении это даст вам прямоугольную область, где находится человек.Поскольку размеры этого прямоугольника теперь меньше / больше, вы можете воспользоваться этими изменениями для вычисления преобразования (которое в основном составляет теорема о перехвате ) и, следовательно, нового расстояния.

Что делаетэто означает для общего подхода измерения ЛЮБОГО человека?

  • В случае, если человек имеет ту же ширину / рост, что и человек из шага 2, этот процесс работает безупречно.В случае, если они имеют одинаковую, но не одинаковую высоту / ширину, будут ошибки расчета.Но результаты МОГУТ все еще достаточны для вашего случая использования.(Вы можете определить общего человека, например, 1,8 м роста и XX ширины).Тем не менее, SIFT может быть слишком конкретным здесь.Извините, я просто отсылаю вас в Google , чтобы увидеть, что работает лучше всего.
  • Если ваша камера зафиксирована и записанная сцена не слишком сильно меняется, я просто определю плоскость заземления и вручную аннотирую каждый пиксель, проецируемый на эту плоскость, значением глубины.Таким образом, вам нужно только обнаружить произвольного человека, увидеть, где его ступни касаются плоскости земли, и посмотреть значение глубины, заданное для этого пикселя.
  • Если в случае использования предъявляются более высокие требования, вам придется измерять глубину в большем количестве.сложная мода.Это можно сделать, используя стереокамеру, датчик глубины или последовательность изображений с помощью структуры из движения .

Таким образом, в OpenCV не существует метода «один может сделать все».Это всегда зависит от варианта использования, среды и комбинации довольно сложных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...