Theo Hartley/Zisserman's Multiview Geometery, Thuật toán 12: Phương pháp triangulation tối ưu (p318), tôi nhận được điểm ảnh tương ứng xhat1 và xhat2 (bước 10). Ở bước 11, người ta cần tính toán điểm 3D Xhat. Một phương pháp như vậy là Direct Linear Transform (DLT), được đề cập trong 12.2 (p312) và 4.1 (p88).Triangulation & Direct linear transform
Phương pháp đồng nhất (DLT), p312-313, khẳng định rằng nó tìm thấy một giải pháp là đơn vị vector đặc biệt tương ứng với giá trị đơn lẻ nhỏ nhất của A, do đó,
A = [xhat1(1) * P1(3,:)' - P1(1,:)' ;
xhat1(2) * P1(3,:)' - P1(2,:)' ;
xhat2(1) * P2(3,:)' - P2(1,:)' ;
xhat2(2) * P2(3,:)' - P2(2,:)' ];
[Ua Ea Va] = svd(A);
Xhat = Va(:,end);
plot3(Xhat(1),Xhat(2),Xhat(3), 'r.');
Tuy nhiên, A là một 16x1 ma trận, dẫn đến Va là 1x1.
Tôi đang làm gì sai (và sửa lỗi) khi nhận điểm 3D?
Đối với những dữ liệu của nó mẫu có giá trị:
xhat1 =
1.0e+009 *
4.9973
-0.2024
0.0027
xhat2 =
1.0e+011 *
2.0729
2.6624
0.0098
P1 =
699.6674 0 392.1170 0
0 701.6136 304.0275 0
0 0 1.0000 0
P2 =
1.0e+003 *
-0.7845 0.0508 -0.1592 1.8619
-0.1379 0.7338 0.1649 0.6825
-0.0006 0.0001 0.0008 0.0010
A = <- my computation
1.0e+011 *
-0.0000
0
0.0500
0
0
-0.0000
-0.0020
0
-1.3369
0.2563
1.5634
2.0729
-1.7170
0.3292
2.0079
2.6624
Cập nhật đang làm việc cho phần xi trong thuật toán
% xi
A = [xhat1(1) * P1(3,:) - P1(1,:) ;
xhat1(2) * P1(3,:) - P1(2,:) ;
xhat2(1) * P2(3,:) - P2(1,:) ;
xhat2(2) * P2(3,:) - P2(2,:) ];
A(1,:) = A(1,:)/norm(A(1,:));
A(2,:) = A(2,:)/norm(A(2,:));
A(3,:) = A(3,:)/norm(A(3,:));
A(4,:) = A(4,:)/norm(A(4,:));
[Ua Ea Va] = svd(A);
X = Va(:,end);
X = X/X(4); % 3D Point
Nó có thể là tốt hơn để gửi với hàng hoá dự kiến nhỏ cho xhat1, P1 vv để chúng ta có thể sao chép và dán một ví dụ làm việc và không phải giả định hình thức đầu vào của bạn đang ở. – MatlabDoug