2015-08-04 1 views
2

Рекомпрессионный объект OpenCVImageTo3D() выводит «3-канальное изображение, представляющее трехмерную поверхность». Вы можете получить доступ к этим данным,Значения глубины отображения в opencv's repjectImageTo3D()

Vec3f coordinates = _3dImage.at<Vec3f>(y,x); 
float depth = _3dImage.at<Vec3f>(y,x)[2]; 

ведьма возвращает вектор [X, Y, Z].

В "Learning OpenCV" по Гари Брадски & Адриан Kaehler, это объясняется тем, что глубина рассчитывается путем

Z = F T/(x_left - x_right)

, где е = фокусное расстояние , T = основа для глаз/трансляция между камерами, (x_left - x_right) = несоответствие

Эта точная формула реализована в OpenCV (я проверил исходный код - однако по какой-то причине есть дополнительный отрицательный знак). Вопрос: В каком блоке указаны значения X, Y, Z?

T находится в вашем устройстве (например, мм), x_l - x_r находится в пикселях и [f] =?

Когда вы откалибруете камеру, вы указываете размер шахматной доски в единицах реального мира (например, мм). Следовательно, имеет ли внутренняя матрица единицы реального мира? Или это указано в px? К сожалению, я не могу найти ответ в документации.

ответ

1

Базовое уравнение, которое выполняет реконструкцию глубины:

Z = fB/d, где

  • f фокусное расстояние (в пикселях), вы назвали его в качестве глазного основания/перевода между камерами
  • B (в метрах)
  • d Несоответствие (в пикселях), которое измеряет разницу в положении сетчатки между соответствующими указывает
  • Z расстояние вдоль оси Z камеры

3D-позиции (X,Y,Z) элемента изображения (например, (u,v) в пикселях) может быть задано в метрах, см, мм или любом другом, что вы выбираете, поскольку 3D-координаты (X,Y,Z) находятся в тех же единицах, что и квадратный размер шахматной доски. Например, если вы определяете размер квадрата размером 1 см, то 3D-координаты также будут в см.

т.е .:

Size boardSize(4, 5); // 4x5 chessboard 
float squareSize = 0.025F; // 0.025 meters 
for(int i = 0; i < boardSize.height; i++) 
    for(int j = 0; j < boardSize.width; j++) 
     corners.push_back(Point3f(float(j*squareSize), float(i*squareSize), 0.0F)); 

P.S.:
После Z определяется, X и Y можно вычислить, используя обычные проективные уравнения камеры:

  • X = uZ/f
  • Y = vZ/f
+0

базовой линии (в вашем посте 'b', на мой вопрос 'T') всегда нужно указывать в метрах. Единица определяется только размером шаблона калибровки? Поэтому эта информация должна храниться в значениях 'c_x, c_y' внутренней матрицы. – Jack

+0

Да, он определяется размером шаблона. Таким образом, мера единства 'Z' (т. Е. Мм) обозначает любую единицу измерения, которую выбирают для рисунка шахматной доски. – Kornel

+0

Но эта информация не должна храниться в матрице встроенных функций, поскольку внутренняя среда не зависит от просматриваемой сцены. Эта информация хранится в внешних параметрах, которые обозначают преобразования системы координат из трехмерных координат мира в координаты 3D-камеры. – Kornel

Смежные вопросы