2016-02-02 11 views
5

В настоящее время у меня установлена ​​стереокамера. Я откалибровал обе камеры и имел встроенную матрицу для обеих камер K1 и K2.Неверное вращение и перевод из основной матрицы

K1 = [2297.311,  0,  319.498; 
     0,  2297.313,  239.499; 
     0,    0,  1]; 

K2 = [2297.304,  0,  319.508; 
     0,  2297.301,  239.514; 
     0,    0,  1]; 

Я также определил фундаментальную матрицу F между двумя камерами, использующих findFundamentalMat() из OpenCV. Я проверил ограничение Epipolar, используя пару соответствующих точек x1 и x2 (в пиксельных координатах), и это очень близко к 0.

F = [5.672563368940768e-10, 6.265600996978877e-06, -0.00150188302445251; 
    6.766518121363063e-06, 4.758206104804563e-08, 0.05516598334827842; 
    -0.001627120880791009, -0.05934224611334332, 1]; 

x1 = 133,75  
x2 = 124.661,67.6607 

transpose(x2)*F*x1 = -0.0020 

От F я могу получить Essential Matrix E в E = K2'*F*K1. I разлагаю E с использованием функции SVD MATLAB, чтобы получить 4 возможности вращения и перевода K2 по отношению к K1.

E = transpose(K2)*F*K1; 
svd(E); 

[U,S,V] = svd(E); 

diag_110 = [1 0 0; 0 1 0; 0 0 0]; 
newE = U*diag_110*transpose(V); 
[U,S,V] = svd(newE); //Perform second decompose to get S=diag(1,1,0) 

W = [0 -1 0; 1 0 0; 0 0 1]; 

R1 = U*W*transpose(V); 
R2 = U*transpose(W)*transpose(V); 
t1 = U(:,3); //norm = 1 
t2 = -U(:,3); //norm = 1 

Допустим, что K1 используется в качестве системы координат, для которых мы делаем все измерения. Поэтому центр K1 находится в C1 = (0,0,0). При этом оно должно быть возможным применить правильный поворот R и перевод t таким образом, что C2 = R*(0,0,0)+t (т.е. центр K2 измеряется по отношению к центру K1)

Теперь давайте скажем, что, используя мои соответствующие пары x1 и x2. Если я знаю длину каждого пикселя на обеих моих камерах, и, поскольку я знаю фокусное расстояние от внутренней матрицы, я должен иметь возможность определять два вектора v1 и v2 для обеих камер, которые пересекаются в той же точке, что и показано ниже.

pixel_length = 7.4e-6; //in meters 
focal_length = 17e-3; //in meters 

dx1 = (133-319.5)*pixel_length; //x-distance from principal point of 640*480 image 
dy1 = (75-239.5) *pixel_length; //y-distance from principal point of 640*480 image 
v1 = [dx1 dy1 focal_length] - (0,0,0); //vector found using camera center and corresponding image point on the image plane 

dx2 = (124.661-319.5)*pixel_length; //same idea 
dy2 = (67.6607-239.5)*pixel_length; //same idea 
v2 = R * ([dx2 dy2 focal_length] - (0,0,0)) + t; //apply R and t to measure v2 with respect to K1 frame 

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

C1 + s*v1 = C2 + t*v2 
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t 

С s и t определяется мы можем найти триангулированную точку подключения обратно в уравнение линии. Однако мой процесс не был успешным, поскольку я не могу найти ни одного решения R и t, в котором точка находится перед обеими камерами и где обе камеры направлены вперед.

Есть что-то не так с моим конвейером или процессом мышления? Возможно ли получить каждый отдельный пиксельный луч?

ответ

1

При разложении основной матрицы на R и t вы получаете 4 разных решения. Три из них проецируют очки за одну или обе камеры, и одна из них правильная. Вы должны проверить, какой из них правильный, триангулируя некоторые точки выборки.

Существует функция в System Vision System Toolbox в MATLAB под названием cameraPose, которая сделает это за вас.

0

Не должно быть C1-C2 = transpose([v2 -v1] * transpose([t s]). Это работает.

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

  • Нет связанных вопросов^_^