OpenCV — 3D-координаты реального мира из двух перпендикулярных 2D-изображений

Наверное, есть ответы, но я просто не понял, что нашел. Может быть, это языковой барьер. Поэтому я решил наконец спросить. Что мне нужно, это найти 3D-координаты из двух видео, записанных двумя камерами. Установка выглядит так:

введите описание изображения здесь

Я не могу понять, как это сделать. Что у меня есть

  • Координаты пикселей на обеих картинках (относительно 0,0 точки на картинке)
  • Фокусное расстояние
  • расстояние обеих камер от 0,0,0 точки реального мира (Ax и By)
  • размер пикселя
  • Я знаю, что угол между камерами составляет 90 градусов

Что теперь? Документы OpenCV содержат следующую формулу:
введите описание изображения здесь

Я не знаю, что такое s, ни матрица [R | T], внешние параметры. Я не знаю, где находится главный вопрос и как его найти (cx, cy), и я могу только предположить, что установка его в 0 не будет катастрофической. Кроме того, похоже, что он использует только одно из 2D-изображений, а не оба.

я знаю calibrateCamera, solvePnP, а также stereoCalibrate функции, но я не знаю, как их использовать.

Я знаю, насколько это сложно, когда у вас есть камеры как два «глаза», я надеялся, что будет проще в ситуации, когда камеры снимают перпендикулярные изображения. Теперь у меня есть формула для расчета трехмерных координат, но она не совсем точна. Ошибка составляет менее 1 дюйма, но 1 дюйм слишком много.

xa, ya, xb, yb - pixel coordinates from pictures
focalAB - focal length
W = -(Ax*xb*pixelSize - focalB*By)/(xa*pixelSize*xb*pixelSize - focalA*focalB)
X = Ax + W*xa*pixelSize
Y = W*focalA
Z = W*xa*pixelSize

Ошибки:

введите описание изображения здесь

Они предназначены для фокусных расстояний и размера пикселей, предоставленных производителем. 5400um и 1,75um. Тем не менее, ошибки наименьшие для значений 4620um и 1,69um, где самые большие ошибки для оси 3 # X, 2,3 см, ошибки высоты почти исчезают (максимум 0,2 см), а остальные либо 0,1 см или 1-1,5см.

1

Решение

Помимо того, что я хочу рассказать вам о стереозрении, как предложил @YangKui, я могу ответить на некоторые ваши подвопросы.

Уравнение, которое вы цитируете, представляет собой уравнение трехмерной проекции (для одной камеры). Это проективное уравнение геометрии (отсюда 1 в качестве последних координат), и все до некоторого масштаба s,

  • s это масштабный фактор.
  • R Поворот камеры 3х3 относительно выбранной системы координат мира.
  • t перевод координат камеры из мира / выбранной системы координат.
  • cx а также cy являются принципиальными точками на изображении — точкой плоскости изображения в пиксельных единицах, которую пересекает ось Z. Он часто считается центром изображения.
0

Другие решения

Один из подходов, который, как я считаю, обеспечивает интуицию, если не высокую производительность, заключается в построении матрицы камер для обеих камер и последующем использовании нелинейной оптимизации для M сведение к минимуму «ошибки перепроецирования».

Итак, придумайте матрицы камеры: матрица камеры А отобразит центр камеры А в мировых координатах на (0, 0, 0) в координатах камеры А. Часть вращения матрицы камеры А будет отображать (0, 1, 0) в мировых координатах в (0, 0, 1) в координатах камеры.

Теперь вы можете отобразить мировые координаты на координаты изображения A и B, поэтому для любого (x, y, z) у вас есть соответствующий 4-вектор: (x_A, y_A, x_B, y_B). Если вы добавите точку (A_x, B_y, 0), вы получите 4-вектор. Разница между этим 4-вектором и измеренным положением — ваша ошибка перепроецирования. Бросьте это в решатель, и он должен быстро прийти к ответу.

Вы можете попробовать » Множество видов геометрии в компьютерном зрении » Хартли и Циссермана.

0