2010-02-16 32 views
8

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 
+0

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

Trả lời

10

Như được đề cập trong cuốn sách (giây 12,2), pi Thàng trong tổng số P. Do đó, bạn không cần phải chuyển đổi P1(k,:) (tức là công thức phù hợp là A = [xhat1(1) * P1(3,:) - P1(1,:) ; ...).

Tôi hy vọng đó chỉ là lỗi đánh máy.

Thêm vào đó, nó được khuyến khích để bình thường hóa mỗi hàng của A với mức L2 của nó, tức là cho tất cả i

A(i,:) = A(i,:)/norm(A(i,:));

Và nếu bạn muốn âm mưu điểm 3D tam giác, bạn phải bình thường hóa Xhat trước âm mưu (vô nghĩa của nó khác), tức là

Xhat = Xhat/Xhat(4);

+0

Jacob, bạn đề cập rằng các hàng của A nên được chuẩn hóa. Chỉ số Frobenius (?) Có khác nhiều so với chuẩn hóa trên p109, bình thường hóa xhat1 và xhat2, thực hiện DLT sau đó khử chuẩn hóa? – yxk

+1

Không, nó khác - nó chỉ được sử dụng để làm cho tính toán SVD sử dụng các biện pháp cosin. Và tôi có nghĩa là chuẩn L2, tức là || A (i, :) ||. – Jacob

+0

Trong trường hợp của tôi, việc chuẩn hóa các hàng A trước khi áp dụng SVD dẫn đến lỗi tái phát không thể đoán trước (được tính bằng cách chiếu điểm tam giác lên máy ảnh và tính khoảng cách giữa các phép chiếu và đầu vào cho tam giác) từ 0,007 đến 22px. Loại bỏ sự bình thường mang phạm vi đến 0,001-0,4px. – neuviemeporte