summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/toolbox_basic/fact
diff options
context:
space:
mode:
Diffstat (limited to 'SD-VBS/common/toolbox/toolbox_basic/fact')
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m25
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m25
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/factor.m50
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m52
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m52
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tarbin0 -> 81920 bytes
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/findG.m48
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/findg1.m49
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/findg2.m56
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/hotel.matbin0 -> 56320 bytes
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m22
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/show_S.m17
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/show_t.m10
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m10
-rwxr-xr-xSD-VBS/common/toolbox/toolbox_basic/fact/zt.m6
15 files changed, 422 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m
new file mode 100755
index 0000000..372b4b6
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w.m
@@ -0,0 +1,25 @@
1function W = construct_w(centers,Ds,img_center,indexes,frames)
2%
3% function W = construct_w(centers,Ds,img_center,indexes,frames)
4% optional: frames
5%
6
7
8points = length(indexes);
9if (nargin == 4),
10 frames = 0.5*size(centers,2);
11end
12
13W = zeros(2*frames,points);
14
15center_x = img_center(1);
16center_y = img_center(2);
17
18for j=1:frames,
19 % x is centers(:,2*j-1)
20 % y is centers(:,2*j)
21 % d is Ds(:,2*j-1)
22 W(j,:) = (centers(indexes,2*j-1) -center_x)'./Ds(indexes,2*j-1)';
23 W(j+frames,:) = (centers(indexes,2*j) -center_y)'./Ds(indexes,2*j-1)';
24 % W(j+2*frames,:) = ones(1,points)./Ds(indexes,2*j-1)';
25end \ No newline at end of file
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m
new file mode 100755
index 0000000..b2939b7
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/construct_w2.m
@@ -0,0 +1,25 @@
1function W = construct_w2(centers,Ds,img_center,indexes,frames)
2%
3% function W = construct_w2(centers,Ds,img_center,indexes,frames)
4% optional: frames
5%
6
7
8points = length(indexes);
9if (nargin == 4),
10 frames = 0.5*size(centers,2);
11end
12
13W = zeros(3*frames,points);
14
15center_x = img_center(1);
16center_y = img_center(2);
17
18for j=1:frames,
19 % x is centers(:,2*j-1)
20 % y is centers(:,2*j)
21 % d is Ds(:,2*j-1)
22 W(j,:) = (centers(indexes,2*j-1) -center_x)'./Ds(indexes,2*j-1)';
23 W(j+frames,:) = (centers(indexes,2*j) -center_y)'./Ds(indexes,2*j-1)';
24 W(j+2*frames,:) = ones(1,points)./Ds(indexes,2*j-1)';
25end \ No newline at end of file
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factor.m b/SD-VBS/common/toolbox/toolbox_basic/fact/factor.m
new file mode 100755
index 0000000..635c29a
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factor.m
@@ -0,0 +1,50 @@
1%
2% Usage:
3%
4% [R,t,S] = factor(W)
5%
6% Function to factor a matrix of input data (W) into the camera
7% rotation matrix (R), translation (t), and the shape matrix (S).
8% Three-dimensional version. Failure of normalization results in
9% empty R and S.
10
11function [R,t,S] = factor(W)
12
13pts = size(W,2);
14t = W*ones(pts,1)/pts;
15W = W - t*ones(1,pts);
16
17% Use SVD to factor W.
18 [a,b,c] = svd(W,0);
19
20smallb = b(1:3,1:3); % Since W is rank 3, b has only three meaningful values
21sqrtb = sqrt(smallb);
22Rhat = a(:,1:3) * sqrtb;
23Shat = sqrtb * c(:,1:3)';
24
25G = findG(Rhat);
26
27if size(G,1) == 0,
28R = [];
29S = [];
30else
31 R = Rhat*G;
32 S = inv(G)*Shat;
33
34 % rotation matrix that aligns the reference frame with the first camera
35 F = size(R,1)/2;
36 R1 = R(1,:);
37 R1 = R1/norm(R1);
38 R2 = R(F+1,:);
39 R2 = R2/norm(R2);
40 R3 = cross(R1,R2);
41 R3 = R3/norm(R3);
42 P = [R1; R2; R3];
43 P = P';
44
45 R = R*P;
46 S = inv(P)*S;
47end
48
49
50
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m
new file mode 100755
index 0000000..12ceb95
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test.m
@@ -0,0 +1,52 @@
1%
2% Usage:
3%
4% [R,t,S] = factor(W)
5%
6% Function to factor a matrix of input data (W) into the camera
7% rotation matrix (R), translation (t), and the shape matrix (S).
8% Three-dimensional version. Failure of normalization results in
9% empty R and S.
10
11function [R,t,S,C,b] = factor(W)
12
13pts = size(W,2);
14t = W*ones(pts,1)/pts;
15W = W - t*ones(1,pts);
16
17% Use SVD to factor W.
18 [a,b,c] = svd(W,0);
19
20figure(3);plot(diag(b))
21
22smallb = b(1:3,1:3); % Since W is rank 3, b has only three meaningful values
23sqrtb = sqrt(smallb);
24Rhat = a(:,1:3) * sqrtb;
25Shat = sqrtb * c(:,1:3)';
26
27[G,C] = findg1(Rhat);
28
29if size(G,1) == 0,
30R = [];
31S = [];
32else
33 R = Rhat*G;
34 S = inv(G)*Shat;
35
36 % rotation matrix that aligns the reference frame with the first camera
37 F = size(R,1)/2;
38 R1 = R(1,:);
39 R1 = R1/norm(R1);
40 R2 = R(F+1,:);
41 R2 = R2/norm(R2);
42 R3 = cross(R1,R2);
43 R3 = R3/norm(R3);
44 P = [R1; R2; R3];
45 P = P';
46
47 R = R*P;
48 S = inv(P)*S;
49end
50
51
52
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m
new file mode 100755
index 0000000..3520122
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factor_test2.m
@@ -0,0 +1,52 @@
1%
2% Usage:
3%
4% [R,t,S] = factor(W)
5%
6% Function to factor a matrix of input data (W) into the camera
7% rotation matrix (R), translation (t), and the shape matrix (S).
8% Three-dimensional version. Failure of normalization results in
9% empty R and S.
10
11function [R,t,S,C,b] = factor(W)
12
13pts = size(W,2);
14t = W*ones(pts,1)/pts;
15W = W - t*ones(1,pts);
16
17% Use SVD to factor W.
18 [a,b,c] = svd(W,0);
19
20figure(3);plot(diag(b))
21
22smallb = b(1:3,1:3); % Since W is rank 3, b has only three meaningful values
23sqrtb = sqrt(smallb);
24Rhat = a(:,1:3) * sqrtb;
25Shat = sqrtb * c(:,1:3)';
26
27[G,C] = findg2(Rhat);
28
29if size(G,1) == 0,
30R = [];
31S = [];
32else
33 R = Rhat*G;
34 S = inv(G)*Shat;
35
36 % rotation matrix that aligns the reference frame with the first camera
37 F = size(R,1)/2;
38 R1 = R(1,:);
39 R1 = R1/norm(R1);
40 R2 = R(F+1,:);
41 R2 = R2/norm(R2);
42 R3 = cross(R1,R2);
43 R3 = R3/norm(R3);
44 P = [R1; R2; R3];
45 P = P';
46
47 R = R*P;
48 S = inv(P)*S;
49end
50
51
52
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tar b/SD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tar
new file mode 100755
index 0000000..133cdff
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/factorizaion.tar
Binary files differ
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/findG.m b/SD-VBS/common/toolbox/toolbox_basic/fact/findG.m
new file mode 100755
index 0000000..9a6bd73
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/findG.m
@@ -0,0 +1,48 @@
1function G = find3G(Rhat)
2
3% number of frames
4F = size(Rhat,1)/2;
5
6% Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six
7% element vector containg all six distinct elements of the Matrix C
8
9clear Q
10for f = 1:F,
11 g = f + F;
12 h = g + F;
13 Q(f,:) = zt(Rhat(f,:), Rhat(f,:));
14 Q(g,:) = zt(Rhat(g,:), Rhat(g,:));
15 Q(h,:) = zt(Rhat(f,:), Rhat(g,:));
16end
17
18% Solve for v
19rhs = [ones(2*F,1); zeros(F,1)];
20v = Q \ rhs;
21
22% C is a symmetric 3x3 matrix such that C = G * transpose(G)
23C(1,1) = v(1);
24C(1,2) = v(2);
25C(1,3) = v(3);
26C(2,2) = v(4);
27C(2,3) = v(5);
28C(3,3) = v(6);
29C(2,1) = C(1,2);
30C(3,1) = C(1,3);
31C(3,2) = C(2,3);
32
33e = eig(C);
34disp(e)
35
36if (any(e<= 0)),
37 G = [];
38else
39 G = sqrtm(C);
40end
41
42%neg = 0;
43%if e(1) <= 0, neg = 1; end
44%if e(2) <= 0, neg = 1; end
45%if e(3) <= 0, neg = 1; end
46%if neg == 1, G = [];
47%else G = sqrtm(C);
48%end
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/findg1.m b/SD-VBS/common/toolbox/toolbox_basic/fact/findg1.m
new file mode 100755
index 0000000..f14ecc6
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/findg1.m
@@ -0,0 +1,49 @@
1function [G,C] = find3G(Rhat)
2
3% number of frames
4F = size(Rhat,1)/2;
5
6% Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six
7% element vector containg all six distinct elements of the Matrix C
8
9clear Q
10for f = 1:F,
11 g = f + F;
12 h = g + F;
13 Q(f,:) = zt(Rhat(f,:), Rhat(f,:));
14 Q(g,:) = zt(Rhat(g,:), Rhat(g,:));
15 Q(h,:) = zt(Rhat(f,:), Rhat(g,:));
16end
17
18% Solve for v
19rhs = [ones(2*F,1); zeros(F,1)];
20v = Q \ rhs;
21
22% C is a symmetric 3x3 matrix such that C = G * transpose(G)
23C(1,1) = v(1);
24C(1,2) = v(2);
25C(1,3) = v(3);
26C(2,2) = v(4);
27C(2,3) = v(5);
28C(3,3) = v(6);
29C(2,1) = C(1,2);
30C(3,1) = C(1,3);
31C(3,2) = C(2,3);
32
33e = eig(C);
34disp(e)
35
36if (any(e<= 0)),
37 C = C -2*min(e)*eye(3);
38 G = sqrtm(C);
39else
40 G = sqrtm(C);
41end
42
43%neg = 0;
44%if e(1) <= 0, neg = 1; end
45%if e(2) <= 0, neg = 1; end
46%if e(3) <= 0, neg = 1; end
47%if neg == 1, G = [];
48%else G = sqrtm(C);
49%end
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/findg2.m b/SD-VBS/common/toolbox/toolbox_basic/fact/findg2.m
new file mode 100755
index 0000000..5a84b86
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/findg2.m
@@ -0,0 +1,56 @@
1function [G,C] = find3G(Rhat)
2
3% number of frames
4F = size(Rhat,1)/3;
5
6% Build matrix Q such that Q * v = [1,...,1,0,...,0] where v is a six
7% element vector containg all six distinct elements of the Matrix C
8
9clear Q
10for f = 1:F,
11 g = f + F;
12 h = g + F;
13 j = h + F;
14 k = j + F;
15 l = k + F;
16 Q(f,:) = zt(Rhat(f,:), Rhat(f,:));
17 Q(g,:) = zt(Rhat(g,:), Rhat(g,:));
18 Q(h,:) = zt(Rhat(h,:), Rhat(h,:));
19 Q(j,:) = zt(Rhat(f,:), Rhat(g,:));
20 Q(k,:) = zt(Rhat(f,:), Rhat(h,:));
21 Q(l,:) = zt(Rhat(g,:), Rhat(h,:));
22end
23
24% Solve for v
25rhs = [ones(3*F,1); zeros(3*F,1)];
26v = Q \ rhs;
27
28% C is a symmetric 3x3 matrix such that C = G * transpose(G)
29C(1,1) = v(1);
30C(1,2) = v(2);
31C(1,3) = v(3);
32C(2,2) = v(4);
33C(2,3) = v(5);
34C(3,3) = v(6);
35C(2,1) = C(1,2);
36C(3,1) = C(1,3);
37C(3,2) = C(2,3);
38
39e = eig(C);
40disp(e)
41
42
43if (any(e<= 0)),
44 C = C -2*min(e)*eye(3);
45 G = sqrtm(C);
46else
47 G = sqrtm(C);
48end
49
50%neg = 0;
51%if e(1) <= 0, neg = 1; end
52%if e(2) <= 0, neg = 1; end
53%if e(3) <= 0, neg = 1; end
54%if neg == 1, G = [];
55%else G = sqrtm(C);
56%end
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/hotel.mat b/SD-VBS/common/toolbox/toolbox_basic/fact/hotel.mat
new file mode 100755
index 0000000..61ea6c8
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/hotel.mat
Binary files differ
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m
new file mode 100755
index 0000000..b6edfd5
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_3dpoints.m
@@ -0,0 +1,22 @@
1function show_3dpoints(S)
2
3
4for j=1:size(S,2),
5 x = S(1,j);
6 y = S(2,j);
7 z = S(3,j);
8 plot3(x,y,z,'*');
9 hold on;
10 plot3([x,0],[y,0],[z,0],'r');
11% plot3([x,x],[y,y],[z,0],'r');
12% plot3([x,0],[y,y],[z,z],'r'); plot3([x,x],[y,0],[z,z],'r');
13 text(x,y,z,int2str(j))
14% plot3(x,y,0,'co');
15end
16
17grid on
18xlabel('x');
19ylabel('y');
20zlabel('z');
21
22hold off \ No newline at end of file
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_S.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_S.m
new file mode 100755
index 0000000..5828696
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_S.m
@@ -0,0 +1,17 @@
1function show_S(S,fig)
2
3if (nargin == 1),
4 figure(1);
5else
6 figure(fig);
7end
8
9num_points = size(S,2);
10
11subplot(1,2,1); plot(S(1,:),S(3,:),'cx'); axis('equal');axis('square');hold on
12subplot(1,2,2); plot(S(2,:),S(3,:),'cx'); axis('equal');axis('square');hold on
13
14for j=1:num_points,
15 subplot(1,2,1);text(S(1,j),S(3,j),int2str(j));hold off
16 subplot(1,2,2);text(S(2,j),S(3,j),int2str(j));hold off
17end
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_t.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t.m
new file mode 100755
index 0000000..b475c76
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t.m
@@ -0,0 +1,10 @@
1function show_t(t)
2
3frames = 0.5*length(t);
4
5ts = reshape(t,frames,2);
6
7plot(ts(:,1),ts(:,2));
8hold on
9plot(ts(:,1),ts(:,2),'rx');
10hold off;
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m
new file mode 100755
index 0000000..2766061
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/show_t3.m
@@ -0,0 +1,10 @@
1function show_t(t)
2
3frames = length(t)/3;
4
5ts = reshape(t,frames,3);
6
7plot3(ts(:,1),ts(:,2),ts(:,3));
8hold on
9plot3(ts(:,1),ts(:,2),ts(:,3),'rx');
10hold off;
diff --git a/SD-VBS/common/toolbox/toolbox_basic/fact/zt.m b/SD-VBS/common/toolbox/toolbox_basic/fact/zt.m
new file mode 100755
index 0000000..3f88d21
--- /dev/null
+++ b/SD-VBS/common/toolbox/toolbox_basic/fact/zt.m
@@ -0,0 +1,6 @@
1% the z' operator described in the paper (returns a row vector)
2
3function v = zt(a, b)
4
5v = [ a(1)*b(1), a(1)*b(2)+a(2)*b(1), a(1)*b(3)+a(3)*b(1), ...
6 a(2)*b(2), a(2)*b(3)+a(3)*b(2), a(3)*b(3) ];