evaluation/UAV-benchmark-MOTD_v1.0/utils/camera/calib_towncentre.m (70 lines of code) (raw):

function Frames=calib_towncenter(Frames,namefile) fid=fopen(namefile); C=textscan(fid,'%s'); c=C{1}; fx=str2double(cell2mat(c(3))); fy=str2double(cell2mat(c(6))); px=str2double(cell2mat(c(9))); py=str2double(cell2mat(c(12))); sk=str2double(cell2mat(c(15))); tx=str2double(cell2mat(c(18))); ty=str2double(cell2mat(c(21))); tz=str2double(cell2mat(c(24))); rx=str2double(cell2mat(c(27))); ry=str2double(cell2mat(c(30))); rz=str2double(cell2mat(c(33))); rw=str2double(cell2mat(c(36))); k1=str2double(cell2mat(c(39))); k2=str2double(cell2mat(c(42))); p1=str2double(cell2mat(c(45))); p2=str2double(cell2mat(c(48))); R=[1-2*ry^2-2*rz^2,2*rx*ry-2*rz*rw,2*rx*rz+2*ry*rw;2*rx*ry+2*rz*rw,1-2*rx^2-2*rz^2,2*ry*rz-2*rx*rw;2*rx*rz-2*ry*rw,2*ry*rz+2*rx*rw,1-2*rx^2-2*ry^2]; R=[R,[tx;ty;tz]]; K=[fx,0,px;0,fy,py;0,0,1]; P=K*R; P(:,3)=[]; R(:,3)=[]; for fr=1:numel(Frames) for p=1:numel(Frames(fr).id) u=double(Frames(fr).ximg(p)); v=double(Frames(fr).yimg(p)); x2=(u-px)/fx; y2=(v-py)/fy; Pu=undistort(k1,k2,p1,p2,[x2;y2]); xu=Pu(1); yu=Pu(2); Pd2=homotrans(inv(R),[Pu;1]); % Pd=homotrans(inv(P),[u;v;1]); Frames(fr).x(p)=Pd2(1); Frames(fr).y(p)=Pd2(2); Frames(fr).z(p)=0; Frames(fr).vx(p)=0; Frames(fr).vy(p)=0; Frames(fr).vz(p)=0; Frames(fr).ximg(p)=round(Frames(fr).ximg(p)); Frames(fr).yimg(p)=round(Frames(fr).yimg(p)); end end end function x=undistort(k1,k2,p1,p2,xd) xd=double(xd); x = xd; % initial guess for kk=1:20, r_2 = sum(x.^2); k_radial = double(1 + k1 * r_2 + k2 * r_2.^2 ); delta_x = double([2*p1*x(1,:).*x(2,:) + p2*(r_2 + 2*x(1,:).^2); p1 * (r_2 + 2*x(2,:).^2)+2*p2*x(1,:).*x(2,:)]); x = (xd - delta_x)./(ones(2,1)*k_radial); end; end function t = homotrans(P,v) [dim,npts] = size(v); if ~all(size(P)==dim) error('Transformation matrix and point dimensions do not match'); end t = P*v; % Transform for r = 1:dim-1 % Now normalise t(r,:) = t(r,:)./t(end,:); end t(end,:) = ones(1,npts); end