Да, это возможно.Как упомянуто @hkchengrex, считайте ваше лицо объектом.Есть много методов.Я бы порекомендовал SIFT Feature Matching методов, описанных по этой ссылке.
Вот примерно необходимые шаги:
- Сделайте снимок человека иизмерьте расстояние вручную.
- Обрежьте это изображение, чтобы оно содержало только человека.
- Извлеките функции изображения (например, в качестве дескриптора просеивания)
- Сделайте второе изображение с тем же человеком, но с неизвестным расстоянием.
- Обнаружение человека с помощью сопоставления просеивания (см. Ссылку выше)
- Вычисление преобразования между этими двумя векторами просеивания
- Применение преобразования к расстоянию, измеренному в 1.
Лучшее начало по предоставленной ссылке и дальнейшим учебникам по SIFT в opencv.Требуемый подход очень прост и сработает только в том случае, если человек на исследуемой картине очень похож на человека на картинке один.Для более продвинутых подходов я бы сослался на научные статьи.Искать «обнаружение человека».
В ответ на комментарии
TL; DR человек с такой же высотой / шириной в реальности, но отображаемый меньше/ больше на изображении можно измерить относительно расстояния.
Изображенный подход работает под капотом следующим образом.Человека (= обрезанное изображение), снятого на шаге 2, можно найти в любом будущем изображении, если он / она выглядит очень похожим.В новом изображении это даст вам прямоугольную область, где находится человек.Поскольку размеры этого прямоугольника теперь меньше / больше, вы можете воспользоваться этими изменениями для вычисления преобразования (которое в основном составляет теорема о перехвате ) и, следовательно, нового расстояния.
Что делаетэто означает для общего подхода измерения ЛЮБОГО человека?
- В случае, если человек имеет ту же ширину / рост, что и человек из шага 2, этот процесс работает безупречно.В случае, если они имеют одинаковую, но не одинаковую высоту / ширину, будут ошибки расчета.Но результаты МОГУТ все еще достаточны для вашего случая использования.(Вы можете определить общего человека, например, 1,8 м роста и XX ширины).Тем не менее, SIFT может быть слишком конкретным здесь.Извините, я просто отсылаю вас в Google , чтобы увидеть, что работает лучше всего.
- Если ваша камера зафиксирована и записанная сцена не слишком сильно меняется, я просто определю плоскость заземления и вручную аннотирую каждый пиксель, проецируемый на эту плоскость, значением глубины.Таким образом, вам нужно только обнаружить произвольного человека, увидеть, где его ступни касаются плоскости земли, и посмотреть значение глубины, заданное для этого пикселя.
- Если в случае использования предъявляются более высокие требования, вам придется измерять глубину в большем количестве.сложная мода.Это можно сделать, используя стереокамеру, датчик глубины или последовательность изображений с помощью структуры из движения .
Таким образом, в OpenCV не существует метода «один может сделать все».Это всегда зависит от варианта использования, среды и комбинации довольно сложных методов.