2016-02-02 16 views
5

Tôi hiện đang có thiết lập camera âm thanh nổi. Tôi đã hiệu chuẩn cả hai máy ảnh và có ma trận nội tại cho cả hai máy ảnh K1K2.Xoay và dịch từ Ma trận cơ bản không chính xác

K1 = [2297.311,  0,  319.498; 
     0,  2297.313,  239.499; 
     0,    0,  1]; 

K2 = [2297.304,  0,  319.508; 
     0,  2297.301,  239.514; 
     0,    0,  1]; 

Tôi cũng đã xác định ma trận cơ bản F giữa hai máy ảnh sử dụng findFundamentalMat() từ OpenCV. Tôi đã thử nghiệm ràng buộc Epipolar bằng cách sử dụng một cặp điểm tương ứng x1x2 (theo tọa độ pixel) và nó rất gần với 0.

F = [5.672563368940768e-10, 6.265600996978877e-06, -0.00150188302445251; 
    6.766518121363063e-06, 4.758206104804563e-08, 0.05516598334827842; 
    -0.001627120880791009, -0.05934224611334332, 1]; 

x1 = 133,75  
x2 = 124.661,67.6607 

transpose(x2)*F*x1 = -0.0020 

Từ F tôi có thể để có được những Matrix Essential E như E = K2'*F*K1. Tôi phân tách E bằng cách sử dụng hàm SVD MATLAB để có được 4 khả năng xoay và dịch của K2 đối với K1.

E = transpose(K2)*F*K1; 
svd(E); 

[U,S,V] = svd(E); 

diag_110 = [1 0 0; 0 1 0; 0 0 0]; 
newE = U*diag_110*transpose(V); 
[U,S,V] = svd(newE); //Perform second decompose to get S=diag(1,1,0) 

W = [0 -1 0; 1 0 0; 0 0 1]; 

R1 = U*W*transpose(V); 
R2 = U*transpose(W)*transpose(V); 
t1 = U(:,3); //norm = 1 
t2 = -U(:,3); //norm = 1 

Giả sử K1 được sử dụng làm khung tọa độ mà chúng tôi thực hiện tất cả các phép đo. Do đó, trung tâm của K1 là tại C1 = (0,0,0). Với điều này chúng ta có thể áp dụng đúng xoay R và dịch tC2 = R*(0,0,0)+t (ví dụ: trung tâm của K2 được đo đối với các trung tâm của K1 với)

Bây giờ chúng ta hãy nói rằng việc sử dụng cặp tương ứng của tôi x1x2. Nếu tôi biết độ dài của mỗi pixel trong cả hai máy ảnh của tôi và vì tôi biết độ dài tiêu cự từ ma trận nội tại, tôi có thể xác định hai vectơ v1v2 cho cả hai máy ảnh giao nhau tại cùng một điểm như bên dưới.

pixel_length = 7.4e-6; //in meters 
focal_length = 17e-3; //in meters 

dx1 = (133-319.5)*pixel_length; //x-distance from principal point of 640*480 image 
dy1 = (75-239.5) *pixel_length; //y-distance from principal point of 640*480 image 
v1 = [dx1 dy1 focal_length] - (0,0,0); //vector found using camera center and corresponding image point on the image plane 

dx2 = (124.661-319.5)*pixel_length; //same idea 
dy2 = (67.6607-239.5)*pixel_length; //same idea 
v2 = R * ([dx2 dy2 focal_length] - (0,0,0)) + t; //apply R and t to measure v2 with respect to K1 frame 

Với vector này và biết phương trình đường ở dạng tham số, sau đó chúng tôi có thể đánh đồng hai dòng để kiểm tra chéo và giải quyết hai vô hướng lượng s và t thông qua chức năng chia tay trái trong MATLAB để giải quyết cho hệ thống của phương trình.

C1 + s*v1 = C2 + t*v2 
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t 

Với st xác định chúng ta có thể tìm thấy những điểm tam giác bằng cách cắm lại vào phương trình dòng. Tuy nhiên, quá trình của tôi đã không thành công vì tôi không thể tìm thấy giải pháp Rt trong đó điểm nằm ở phía trước cả hai máy ảnh và cả hai máy ảnh đều được hướng về phía trước.

Có vấn đề gì với quy trình suy nghĩ hoặc đường ống của tôi không? Có thể nào có được từng tia pixel riêng lẻ không?

Trả lời

1

Khi bạn phân hủy ma trận thiết yếu thành Rt bạn nhận được 4 giải pháp khác nhau. Ba người trong số họ chiếu các điểm sau một hoặc cả hai máy ảnh và một trong số đó là chính xác. Bạn phải kiểm tra cái nào là chính xác bằng cách triangulating một số điểm mẫu.

Có một chức năng trong Hộp công cụ hệ thống tầm nhìn máy tính trong MATLAB được gọi là cameraPose, sẽ làm điều đó cho bạn.

0

Nếu không phải là C1-C2 = transpose([v2 -v1] * transpose([t s]). Những công việc này.

Các vấn đề liên quan