От стерео к глубине: Создание вашей первой карты глубины с помощью OpenCV
Одной из основных целей проектирования Robotic Ai Vision (RAiV) является оценка карты глубины. В этом посте, наконец, мы собираемся оценить карту глубины сцены с помощью библиотеки OpenCV python.
Введение в глубину по стереоизображению
Оценка карты глубины - сложный процесс, однако RAiV готов к этому задание из коробки
Пара стереокамер RAiV синхронизирована и откалибрована. Параметры калибровки, которые являются ключевыми для оценки карты глубины, доступны с помощью пользовательского кода на python. Итак, все, что вам нужно сделать, это:
- Получить параметры калибровки
- Получить пару стереоизображений
- Оценить карту глубины
Если вы хотите перейти к оценке глубины с помощью Python, вы можете перейти к главе "Отображение глубины упрощено". В следующей части мы более подробно рассмотрим конструктивные особенности RAiV и теорию, лежащую в основе оценки глубины.
Почему базовая линия 65 мм?
В режиме стереовидения у нас есть две камеры, которые расположены горизонтально друг от друга. Расстояние по горизонтали называется базовой линией. Когда мы снимаем изображения с этих камер, мы получаем одну и ту же сцену с разных точек обзора. На полученных изображениях будет изображена одна и та же сцена с одинаковыми объектами/пространственными особенностями, однако объекты/пространственные особенности будут иметь разные координаты в пикселях по горизонтали. Расстояние в координатах в пикселях между одинаковыми объектами/пространственными особенностями называется неравенством. Если объект находится близко к камере, это расстояние на изображениях будет больше. А если объект находится на некотором расстоянии от камеры, то это расстояние будет меньше. Это соотношение глубины и неравенства формулируется с помощью приведенной ниже формулы:
В RAiV мы решили имитировать человеческое зрение. Чтобы достичь этого, мы разработали пару стереокамер RAiV с базовой линией в 65 мм, что соответствует средней базовой длине человеческого глаза (или среднему межзрачковому расстоянию).
Что касается приведенной выше формулы, то выбор этой базовой линии имеет прямые последствия. Однако, чтобы сделать этот эффект более наглядным, нам нужна другая формула для преобразования разницы в пиксели:
Используя приведенные выше формулы, мы можем написать формулу для вычисления разницы (в пикселях) по глубине (в мм):
Параметрами 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". Как только изображение отображается в веб-интерфейсе, компьютер получает карту глубин и отображает ее.
Что дальше?
Чтобы начать позиционирование 3D-объекта:
Обнаружение 3D-объектов: Приближение глубины к YOLO на краюПроверьте наш Python SDK:
RAiV Python SDKПроверьте наш Репозиторий На Github Для Получения Примеров Кодов:
Наш Репозиторий на Github