2009년 1월 7일 수요일

Direct linear transfomation (DLT)

매트랩 함수로 DLT를 이용해서 카메라 보정하는 함수를 만들었다.

카메라에 찍은 u,v 좌표와 3차원 좌표를 알고있는 통제점의 좌표(x,y,z)가 입력으로 들어간다.

소스코드는 아래와 같다. 통제점의 개수에 상관없이 카메라 보정을 할 수 있다.

카메라 행렬 P는 3x4 행렬이기 때문에 총 12개의 파라미터가 있다. 12번째 파라미터를 1로 고정하고

계산하는 inhomogeneous 방법이 있고 아래의 코드처럼 12번째 파라미터를 1로 고정하지 않고 그냥

변수로 고려하는 homogeneous 방법이 있다. homogeneous 방법으로 12개 파라미터의 값을

구하기 위하여 SVD를 이용하였다.

function [L] = sky_homoDLT_2d_to_3d(u, v, x, y, z)
%function [L] = sky_homoDLT_2d_to_3d(u, v, x, y, z)
%
%L : Direct linear transformation parameter
%u : u coordinate of camera plane
%v : v coordinate of camera plane
%x, y, z : Marker data of Object plane
%u, v, x, y, z must be matrix
%
%--------------------------------------------
%Data : 2008.06.19
%Made by : Ki-Young, Shin (Ph.D course)
%University : Sungkyunkwan University

if length(u) == length(x)
%-----------------------------------------------------
%DLT Parameter를 계산하기 위한 행렬
for i=1:length(u)
X(2*i-1,:) = [x(i) y(i) z(i) 1 0 0 0 0 -u(i)*x(i) -u(i)*y(i) -u(i)*z(i) -u(i)];
X(2*i,:) = [0 0 0 0 x(i) y(i) z(i) 1 -v(i)*x(i) -v(i)*y(i) -v(i)*z(i) -v(i)];
end
%-----------------------------------------------------
%DLT Parameter 계산 using Least squares solutions of mxn (m>n)
[U, S, V] = svd(X);
L = V(:,end);
else
fprintf('Matrix size must be equal')
end

댓글 없음:

댓글 쓰기