source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/BlueCCal/CalTechCal/apply_distortion.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 1.6 KB
Line 
1function [xd,dxddk] = apply_distortion(x,k)
2
3
4% Complete the distortion vector if you are using the simple distortion model:
5length_k = length(k);
6if length_k <5 ,
7    k = [k ; zeros(5-length_k,1)];
8end;
9
10
11[m,n] = size(x);
12
13% Add distortion:
14
15r2 = x(1,:).^2 + x(2,:).^2;
16
17r4 = r2.^2;
18
19r6 = r2.^3;
20
21
22% Radial distortion:
23
24cdist = 1 + k(1) * r2 + k(2) * r4 + k(5) * r6;
25
26if nargout > 1,
27        dcdistdk = [ r2' r4' zeros(n,2) r6'];
28end;
29
30
31xd1 = x .* (ones(2,1)*cdist);
32
33coeff = (reshape([cdist;cdist],2*n,1)*ones(1,3));
34
35if nargout > 1,
36        dxd1dk = zeros(2*n,5);
37        dxd1dk(1:2:end,:) = (x(1,:)'*ones(1,5)) .* dcdistdk;
38        dxd1dk(2:2:end,:) = (x(2,:)'*ones(1,5)) .* dcdistdk;
39end;
40
41
42% tangential distortion:
43
44a1 = 2.*x(1,:).*x(2,:);
45a2 = r2 + 2*x(1,:).^2;
46a3 = r2 + 2*x(2,:).^2;
47
48delta_x = [k(3)*a1 + k(4)*a2 ;
49   k(3) * a3 + k(4)*a1];
50
51aa = (2*k(3)*x(2,:)+6*k(4)*x(1,:))'*ones(1,3);
52bb = (2*k(3)*x(1,:)+2*k(4)*x(2,:))'*ones(1,3);
53cc = (6*k(3)*x(2,:)+2*k(4)*x(1,:))'*ones(1,3);
54
55if nargout > 1,
56        ddelta_xdk = zeros(2*n,5);
57        ddelta_xdk(1:2:end,3) = a1';
58        ddelta_xdk(1:2:end,4) = a2';
59        ddelta_xdk(2:2:end,3) = a3';
60        ddelta_xdk(2:2:end,4) = a1';
61end;
62
63xd = xd1 + delta_x;
64
65if nargout > 1,
66        dxddk = dxd1dk + ddelta_xdk ;
67    if length_k < 5,
68        dxddk = dxddk(:,1:length_k);
69    end;
70end;
71
72
73return;
74
75% Test of the Jacobians:
76
77n = 10;
78
79lk = 1;
80
81x = 10*randn(2,n);
82k = 0.5*randn(lk,1);
83
84[xd,dxddk] = apply_distortion(x,k);
85
86
87% Test on k: OK!!
88
89dk = 0.001 * norm(k)*randn(lk,1);
90k2 = k + dk;
91
92[x2] = apply_distortion(x,k2);
93
94x_pred = xd + reshape(dxddk * dk,2,n);
95
96
97norm(x2-xd)/norm(x2 - x_pred)
Note: See TracBrowser for help on using the repository browser.