-
Notifications
You must be signed in to change notification settings - Fork 200
/
Copy pathtest_6_2.m
150 lines (122 loc) · 4.02 KB
/
test_6_2.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
% given two uncalibrated views and three vanishing points
% 1. compute projective reconstruction
% 2. using projective coordinates of the vanishing points compute
% plane at infinity
% 3. compute affine upgrade matrix Ha
% 4. Upgrade projective structure to an affine one Xa = Ha*Xp
% number of points
close all; clear;
% number of points
close all; clear;
FRAMES = 2;
PLOTS = FRAMES + 1;
% cube in the object frame
XW = [0 1 1 0 0 1 1 0 0.2 0.8 0.2 0.8 ;
0 0 1 1 0 0 1 1 1.5 1.5 1.5 1.5;
1 1 1 1 0 0 0 0 0.8 0.8 0.2 0.2 ;
1 1 1 1 1 1 1 1 1 1 1 1];
NPOINTS = size(XW,2);
XC = zeros(4,NPOINTS,FRAMES);
% initial displacement between the world and first camera
Rinit = rot_matrix([1 1 1],pi/8);
Zinit = 5;
Tinit = [ Rinit(1,:) -0.5 ;
Rinit(2,:) -0.5 ;
Rinit(3,:) Zinit;
0 0 0 1];
XC(:,:,1) = Tinit*XW;
% transformation is expressed wrt to the camera frame
ax = [1 1 0];
trans = [-1,0,1];
angle = 15;
rot_axis = ax/norm(ax);
theta = (angle)*pi/180;
% represents rotation between 1st and 2nd frame
R = rot_matrix(rot_axis,theta)
T = [ R(1,:) trans(1);
R(2,:) trans(2);
R(3,:) trans(3);
0 0 0 1 ]
XC(:,:,2) = T*XC(:,:,1);
% intrinsic parameter matrix
A = [600 0 300;
0 600 300;
0 0 1];
% perspective projection
xr1 = project(XC(:,:,1));
xim1 = A*xr1;
xr2 = project(XC(:,:,2));
xim2 = A*xr2;
figure; hold on;
plot3_struct(XC(1,:,1),XC(2,:,1),XC(3,:,1));
plot3(XC(1,:,1),XC(2,:,1), XC(3,:,1),'.');
xlabel('x'); ylabel('y'); zlabel('z');
draw_frame_scaled([diag([1,1,1]), zeros(3,1)],0.5);
draw_frame_scaled(T(1:3,:),0.5); text(0,0,0.2,'1');
view(20,20); grid on; axis equal;
title('Cameras and 3D structure configuration');
figure;
subplot(121); hold on;
plot(xim1(1,:),xim1(2,:),'.');
plot_struct(xim1(1,:),xim1(2,:));
grid on; axis equal; axis([0 600 0 600]);
title('image 1');
subplot(122); hold on;
plot(xim2(1,:),xim2(2,:),'.');
plot_struct(xim2(1,:), xim2(2,:));
grid on; axis equal; axis([0 600 0 600]);
title('image 2');
% affine reconstruction using vanishing points
% 1. compute projective reconstruction
% 2. compute projective coordinates of plane at infinity
% 3. upgrade to affine reconstruction via Ha
% plot in the image coordinate frame
subplot(121); hold on;
% compute and plot vanishing points
x1 = xim1(1:2,:); % remove third homog. coordinate
vp1(:,1) = vanishing_point([x1(:,1), x1(:,5)], [x1(:,2), x1(:,6)]);
vp1(:,2) = vanishing_point([x1(:,1), x1(:,2)], [x1(:,5), x1(:,6)]);
vp1(:,3) = vanishing_point([x1(:,2), x1(:,3)], [x1(:,6), x1(:,7)]);
x2 = xim2(1:2,:);
subplot(122);
vp2(:,1) = vanishing_point([x2(:,1), x2(:,5)], [x2(:,2), x2(:,6)]);
vp2(:,2) = vanishing_point([x2(:,1), x2(:,2)], [x2(:,5), x2(:,6)]);
vp2(:,3) = vanishing_point([x2(:,2), x2(:,3)], [x2(:,6), x2(:,7)]);
drawnow;
% estimate fundametal matrix
F = dfundamental(xim1, xim2);
% epipole computation
[U, S, V] = svd(F');
ep = V(:,3)/V(3,3)
% fundamental matrix canonical decomposition and computation of
% projections matrices with respect to 1st and 2nd frame
M = skew(ep)'*F;
P1 = [diag([1 1 1]) zeros(3,1)];
P2 = [M ep];
% compute projective structure
[XP,lambda] = compute3DStructure(xim1, xim2, M, ep);
% compute projective coordinates of the three vanishing points
for i=1:3
[VP,lambda] = compute3DStructure(vp1(:,i), vp2(:,i), P2(1: 3,1:3), ...
P2(:,4));
VXP(:,i) = VP(:,:,1);
pause
end
% compute the plane at infinity
A = [VXP(1:3,1)';
VXP(1:3,2)';
VXP(1:3,3)'];
% this is the plane at infinity
v = inv(A)*[-1 -1 -1]'
% this is the projective transformation for updating projective
% structure to an affine one
Ha = [diag([1,1,1]), zeros(3,1);
v' , 1];
for i = 1:NPOINTS
XA(:,i,1) = Ha*XP(:,i,1);
XA(:,i,1) = XA(:,i,1)/XA(4,i,1);
end
figure;
plot3_struct(XA(1,:,1),XA(2,:,1),XA(3,:,1));
view(200,20); grid on; axis on; box on;
title('affine reconstruction');