2016-05-01 5 views
1

я получаю точку изображения в левой камере (pointL) и соответствующую точку изображения в правой камере (pointR) из моя стереокамера с использованием соответствия функций. Две камеры параллельны и имеют одно и то же «высоту». Между ними существует только x-перевод.OpenCV стерео видения 3D координат в 2D проекции камеры плоскость отличается от триангуляции 2D точек в 3D

Я также знаю матрицы проекций для каждой камеры (projL, projR), которые я получил во время калибровки, используя initUndistortRectifyMap.

Для триангулирующего точки, я называю: triangulatePoints(projL, projR, pointL, pointR, pos3D) (documentation), где pos3D является выходной 3D положения объекта.

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

2Dpos = projL * 3dPos

Полученная х-координата правильно , Но y-coodinate составляет около 20 пикселей.

Как это исправить?

Edit: Конечно, мне нужно использовать однородные координаты, для того, чтобы умножить его на матрицу проекции (3х4). По этой причине я установил:

3dPos[0] = x; 
3dPos[1] = y; 
3dPos[2] = z; 
3dPos[3] = 1; 

Это неправильно, чтобы установить 3dPos[3] в 1?

Примечание:

  1. Всех изображения переназначены, я делаю это в своем роде предварительной обработки шага.
  2. Конечно, я всегда использую однородные координаты

ответ

1

Вы, вероятно, выступающие в выпрямленной камеру. Необходимо применить инверсию деформации, чтобы получить точку в исходных (неискаженных) линейных координатах камеры, а затем применить искажение, чтобы попасть в исходное изображение.

+0

Вы знаете, как это сделать в OpenCV? Я попытался найти любое решение; не нашел. – black

+0

Покажите, что вы пробовали. –

+0

Я понимаю, что я должен не допустить, чтобы мой 2pos получил у меня формулу в вопросе, верно? Но на этом сайте (http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html) я не нашел решения, чтобы не допустить определенного момента. Существует только решение применить карту исправления ко всему мат. – black

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