Итак, как же мы можем определить расстояние от камеры объекта в режиме реального времени с помощью веб-камеры с приличной точностью, не требуя вообще никакого дополнительного оборудования, такого как стереокамера или датчик глубины?*

В этом сообщении в блоге будет рассказано о реализации простого алгоритма, называемого сходством треугольника, для обнаружения объектов мы сохраним его простым, просто используя обнаружение лиц 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

Искатель фокусного расстояния

Функция искателя фокусного расстояния опирается на три аргумента:

  1. Измеренное_расстояние — это расстояние от камеры до объекта при съемке эталонного изображения, Известное_расстояние = 72,2 сантиметра.
  2. Real_width Это измеренная ширина объекта в реальном мире, здесь я измеряю ширину лица, которая составляет около Known_width =14,3 сантиметра.
  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

Расстояние

Эта функция требует трех аргументов,

  1. Фокусное расстояние в пикселях, возвращаемое функцией Поиск фокусного расстояния.
  2. Real_width Он измеряет ширину объекта в реальном мире, здесь я измеряю ширину лица, которая составляет около Known_width = 14,3 сантиметра.
  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), чтобы найти расстояние, более удобный и точный, с одной камерой (обычная веб-камера ноутбука), мы рассмотрим их в следующем посте.

Ссылка: