Одной из основных целей проектирования Robotic Ai Vision (RAiV) является оценка карты глубины. В этом посте, наконец, мы собираемся оценить карту глубины сцены с помощью библиотеки OpenCV python.

Введение в глубину по стереоизображению

Оценка карты глубины - сложный процесс, однако RAiV готов к этому задание из коробки

Пара стереокамер RAiV синхронизирована и откалибрована. Параметры калибровки, которые являются ключевыми для оценки карты глубины, доступны с помощью пользовательского кода на python. Итак, все, что вам нужно сделать, это:

  1. Получить параметры калибровки
  2. Получить пару стереоизображений
  3. Оценить карту глубины

Если вы хотите перейти к оценке глубины с помощью Python, вы можете перейти к главе "Отображение глубины упрощено". В следующей части мы более подробно рассмотрим конструктивные особенности RAiV и теорию, лежащую в основе оценки глубины.

Почему базовая линия 65 мм?

В режиме стереовидения у нас есть две камеры, которые расположены горизонтально друг от друга. Расстояние по горизонтали называется базовой линией. Когда мы снимаем изображения с этих камер, мы получаем одну и ту же сцену с разных точек обзора. На полученных изображениях будет изображена одна и та же сцена с одинаковыми объектами/пространственными особенностями, однако объекты/пространственные особенности будут иметь разные координаты в пикселях по горизонтали. Расстояние в координатах в пикселях между одинаковыми объектами/пространственными особенностями называется неравенством. Если объект находится близко к камере, это расстояние на изображениях будет больше. А если объект находится на некотором расстоянии от камеры, то это расстояние будет меньше. Это соотношение глубины и неравенства формулируется с помощью приведенной ниже формулы:

$$ Z = \frac{B \times f}{d} $$ $$ Z: Глубина\: (мм),\:f: Фокусное расстояние\:Длина\: (мм),\;B: Базовая линия\: (мм),\;d: Неравенство\: (мм) $$
Глубина по формуле неравенства.

В RAiV мы решили имитировать человеческое зрение. Чтобы достичь этого, мы разработали пару стереокамер RAiV с базовой линией в 65 мм, что соответствует средней базовой длине человеческого глаза (или среднему межзрачковому расстоянию).

Что касается приведенной выше формулы, то выбор этой базовой линии имеет прямые последствия. Однако, чтобы сделать этот эффект более наглядным, нам нужна другая формула для преобразования разницы в пиксели:

$$ f_{pixels} = \frac{f_{mm}}{pixelsize} $$ $$ f_{пиксели}: Фокусное расстояние\:Длина\:(пиксели),\;f_{мм}: Фокусное расстояние\:Длина\:(мм),\;размер пикселя: Физический\:Размер\:одного\:Пиксель\: (мм) $$
Формула преобразования фокусного расстояния

Используя приведенные выше формулы, мы можем написать формулу для вычисления разницы (в пикселях) по глубине (в мм):

$$ d_{pixels} = \frac{B \times f_{mm}}{Z \times pixelsize} $$
Отклонение (в пикселях) от формулы глубины (в мм).

Параметрами RAiV по умолчанию являются:

Базовая линия (мм) 65 mm
Фокусное расстояние (мм) 2.8 mm
Размер пикселя (мм) 0.0030 mm (3.0 µm)

RAiV может иметь объективы со следующими фокусными расстояниями: 2,8 мм, 3,6 мм, 4 мм, 6 мм, 8 мм, 12 мм, 16 мм и 25 мм. Пожалуйста, укажите свой выбор объектива при оформлении заказа.

Используя всю вышеприведенную информацию, мы можем составить следующую таблицу глубины (мм) и неравенства (пикселей):

Глубина (мм) Несоответствие (пиксели)
200 303.33
300 202.22
400 151.66
500 121.33
750 80.88
1000 60.64
2000 30.33
3000 20.22
4000 15.16
5000 12.13

Камеры, используемые в RAiV, имеют разрешение 1600x1300 пикселей. Во всех наших примерах кодов для оценки глубины мы масштабируем изображения до разрешения 800x650 пикселей из соображений скорости. Таким образом, конфигурация RAiV с масштабированным разрешением по умолчанию подходит для оценки глубины от 300 мм до 3000 мм.

Отображение глубины упрощено

Подготовьте и загрузите код

RAiV готов к оценке глубины из коробки. Приведенный ниже пример кода:

  • Инициализирует интерфейс конвейера передачи данных
  • Инициализирует оценку глубины стереоизображения
  • Непрерывно в цикле
    • Получает пару стереоизображений из конвейера передачи данных
    • Оценивает карту глубин
    • Отправляет карту глубин на ПК

Вы можете найти этот пример в нашем репозитории на Github со всеми необходимыми модулями. Пожалуйста, скачайте пример кода из репозитория github и загрузите его в RAiV через веб-интерфейс.

import qCU_Net

# For accessing data pipeline
from qCU_Data import qCUData

# For Depth Estimation
from StereoDepthEstimator import StereoDepthEstimator
import depthUtils

# For sending data over TCP
import base64


def main():
    # Create interface
    theQCUData = qCUData()

    # Initialize shared memory
    if not theQCUData.init():
        print("Failed to initialize shared memory")
        return

    # Initialize OpenCV's depth estimation algorithms
    depthScale = 0.5
    depthMinMM = 300
    depthMaxMM = 600
    depthEstimator = StereoDepthEstimator(
        scale_factor=depthScale,
        # The depth values are in milimeters ("mm")
        min_depth=depthMinMM,
        max_depth=depthMaxMM,
    )


    # Enter object detection loop
    try:
        while True:
            # Get Ai data
            ai_data = theQCUData.getDataAi()
            if ai_data:
                if 'error' in ai_data:
                    print(f"Error occurred: {ai_data['error']}")
                else:
                    # NOTE: 1. We are processing AI output images. Stereo camera output can also be processed
                    #       2. Due to the stereo camera setup the output depth map size is 726x585

                    # Process Ai processor output images
                    depthMap = depthUtils.getDepthFromStereo(ai_data, memConfig, depthEstimator)

                    # Get colored depth map
                    coloredDepthMap = depthEstimator.depth_to_colormap(depthMap)
                    coloredDepthMap_b64 = base64.b64encode(coloredDepthMap).decode('utf-8')
                    # Build payload for the transmission
                    payload = {
                        "width": 726,
                        "height": 585,
                        "depth": coloredDepthMap_b64,
                    }
                    qCU_Net.send_data_to_server("192.168.10.2", 12345, payload)
            else:
                # Wait to avoid high CPU utilization
                time.sleep(0.1)
                    
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        print("Cleanup completed")


if __name__ == "__main__":
    main()

Оперативное действие: запуск конвейера данных

Теперь, чтобы запустить конвейер данных, пожалуйста, нажмите кнопку "Snapshot". Как только изображение отображается в веб-интерфейсе, компьютер получает карту глубин и отображает ее.

Оценка глубины с помощью RAiV

Что дальше?

Чтобы начать позиционирование 3D-объекта:

Обнаружение 3D-объектов: Приближение глубины к YOLO на краю

Проверьте наш Python SDK:

RAiV Python SDK

Проверьте наш Репозиторий На Github Для Получения Примеров Кодов:

Наш Репозиторий на Github