2009년 1월 7일 수요일

cholesky 분해를 이용한 카메라 내부 파라미터 계산

책에 있는 내용을 참고해서 직접 작성한 코드입니다.


직교성을 가진 소실점(vanishing point)이 주어졌을 때 cholesky 분해를 이용하여 카메라 내부 파라미터 K를 계산하는 코드입니다.

여기서 가정은 square pixel이라는 것과 초점거리 fx = fy 가 같다는 것입니다.

cholesky 분해를 위해서는 Omega 행렬이 positive definite 해야만 합니다. 소실점의 값이 제대로 계산되어 입력되지 않으면 cholesky 분해에서 positive definite이 아니라는 에러가 나올 것입니다.


function K = sky_K_from_IAC(v1, v2)
% function K = sky_K_from_IAC(v1, v2)
% Input : v1, v2 -> vanishing points
% Output : K -> internal parameters
%
% Reference : Multiple view geometry in computer vision, second edition(p.226)
% Assumption : w11 = w22, w12 = w21 = 0
% w = [w1 0 w2;
% 0 w1 w3;
% w2 w3 w4];
%
% Shin, Ki-Young
% Biomedical Engineering Lab.
% Sungkyunkwan univ.
% Data : 2008/12/4


for i=1:length(v1)
A(i,:) = [ v1(i,1) * v2(i,1) + v1(i,2) * v2(i,2) v1(i,3) * v2(i,1) + v1(i,1) * v2(i,3) v1(i,3) * v2(i,2) + v1(i,2) * v2(i,3) v1(i,3) * v2(i,3)];
end

[U, S, V] = svd(A);
W = V(:,end);

% Omega must be positive definite
Omega = [W(1) 0 W(2);
0 W(1) W(3);
W(2) W(3) W(4)];

tmp_K = inv(chol(Omega));

K = tmp_K / tmp_K(3,3);


---------------------------------------------------------------------------------

주의 : 아직 위 코드가 완벽하게 검증되었다고 할 수는 없습니다.

그리고 혹시 cholesky decomposition을 할 때 positive definite가 아니라고 나오면 그 데이터 세트는 일찌감치 포기하고 다른 데이터 세트를 선택하는 것이 좋다.

댓글 없음:

댓글 쓰기