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