Итак, как же мы можем определить расстояние от камеры объекта в режиме реального времени с помощью веб-камеры с приличной точностью, не требуя вообще никакого дополнительного оборудования, такого как стереокамера или датчик глубины?*
В этом сообщении в блоге будет рассказано о реализации простого алгоритма, называемого сходством треугольника, для обнаружения объектов мы сохраним его простым, просто используя обнаружение лиц OpenCV.
Демонстрационное видео для оценки расстояния
Кодовая база
Код будет доступен в моем репозитории GitHub. Здесь я объясню важные фрагменты кода. Если вам нужна помощь, просто оставьте комментарий, я буду рад помочь вам 😎
Требования
Требования довольно просты: вам нужны файлы Python, OpenCV и Haar-cascade для Распознавания лиц.
Установив python на свой компьютер, просто откройте терминал и вставьте следующую команду в терминал, и все готово, установка.
pip install opencv-python # on Linux turn pip to pip3
Захват эталонного изображения
Эталонное изображение позволяет нам отобразить реальный мир (плоскость объекта), поскольку мы теряем глубину объекта, когда мы захватываем его в 2D-пространстве (изображение), в противном случае нам нужна специальная камера, которая может захватывать глубину, поскольку мы хотим чтобы использовать нашу веб-камеру, требуется эталонное изображение, вам нужно позаботиться о нескольких вещах, чтобы точность не упала, вы можете использовать мое эталонное изображение, оно не сильно повлияет, но я рекомендую сделать его самостоятельно, чтобы получить больше точности.
Вы должны позаботиться о нескольких вещах при захвате эталонного изображения.
- Разрешение изображения (кадра) должно быть таким же, как в эталонном изображении, которое я сохранил по умолчанию для OpenCV, которое составляет (640, 480)
- Держите камеру прямо, насколько это возможно, при захвате эталонных изображений.
- Измерьте расстояние (KNOWN_DISTANCE) от объектной камеры, запишите его и сделайте снимок, установленный на 76,2 сантиметра.
- Измерьте ширину (KNOWN_WIDTH) объекта, также запишите ее, для меня это 14,3 сантиметра.
Важные переменные
- KNOWN_DISTANCE:это расстояние до объектной камеры 📷 в реальном мире.
- KNOWN_WIDTH: это измеренная ширина объекта в реальном мире.
- face_width_in_frame:это ширина лица на изображении (кадре), которое обеспечивает детектор лиц, измеренная в пикселях.
KNOWN_DISTANCE = 76.2 # centimeter KNOWN_WIDTH = 14.3 # centimeter
Обнаружение объектов (лицо)
Здесь я использую распознавание лиц, оно непримиримо для любого детектора объектов, просто следуйте процедуре,
Обнаружение лица с использованием Opencv python, вот функция, которая просто обнаруживает лицо и возвращает ширину лица в пикселях.
Функция Данные лица принимает только один аргумент — изображение.
def face_data(image): face_width = 0 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray_image, 1.3, 5) for (x, y, h, w) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), WHITE, 1) face_width = w return face_width
Искатель фокусного расстояния
Функция искателя фокусного расстояния опирается на три аргумента:
- Измеренное_расстояние — это расстояние от камеры до объекта при съемке эталонного изображения, Известное_расстояние = 72,2 сантиметра.
- Real_width Это измеренная ширина объекта в реальном мире, здесь я измеряю ширину лица, которая составляет около Known_width =14,3 сантиметра.
- Width_in_rf_image – это ширина объекта на изображении/кадре, которая будет в пикселях.
Эта функция вернет фокусное расстояние, которое используется для определения расстояния, это просто сопоставление.
вот код:
def FocalLength(measured_distance, real_width, width_in_rf_image): focal_length = (width_in_rf_image* measured_distance)/ real_width return focal_length
Расстояние
Эта функция требует трех аргументов,
- Фокусное расстояние в пикселях, возвращаемое функцией Поиск фокусного расстояния.
- Real_width Он измеряет ширину объекта в реальном мире, здесь я измеряю ширину лица, которая составляет около Known_width = 14,3 сантиметра.
- Width_in_rf_image – это ширина объекта на изображении/кадре, которая будет в пикселях.
Функция определения расстояния вернет расстояние в сантиметрах.
вот код:
def Distance_finder(Focal_Length, real_face_width, face_width_in_frame): distance = (real_face_width * Focal_Length)/face_width_in_frame return distance
Вот и все, вот видеоурок, в котором все очень подробно объясняется,
вот более точная версия этого алгоритма, вот GitHub Repository
Есть еще один способ (Маркеры Aruco), чтобы найти расстояние, более удобный и точный, с одной камерой (обычная веб-камера ноутбука), мы рассмотрим их в следующем посте.
Ссылка: