Tôi đang cố gắng tính toán vị trí máy ảnh mới dựa trên chuyển động của hình ảnh tương ứng. các hình ảnh phù hợp với mô hình máy ảnh pinhole.Chuyển động camera từ hình ảnh tương ứng
Thực ra, tôi không nhận được kết quả hữu ích, vì vậy tôi cố gắng mô tả quy trình của mình và hy vọng rằng ai đó có thể giúp tôi.
Tôi khớp các tính năng của hình ảnh tương ứng với SIFT, khớp chúng với FlannBasedMatcher của OpenCV và tính ma trận cơ bản với hàm findFundamentalMat của OpenCV (phương thức RANSAC).
Sau đó, tôi tính toán ma trận cần thiết bởi máy ảnh ma trận nội tại (K):
Mat E = K.t() * F * K;
tôi phân hủy ma trận cần thiết để luân chuyển và dịch với số ít phân hủy giá trị:
SVD decomp = SVD(E);
Matx33d W(0,-1,0,
1,0,0,
0,0,1);
Matx33d Wt(0,1,0,
-1,0,0,
0,0,1);
R1 = decomp.u * Mat(W) * decomp.vt;
R2 = decomp.u * Mat(Wt) * decomp.vt;
t1 = decomp.u.col(2); //u3
t2 = -decomp.u.col(2); //u3
Sau đó, tôi cố gắng để tìm ra giải pháp đúng bằng cách triangulation. (phần này là từ http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/ vì vậy tôi nghĩ rằng nên làm việc chính xác).
Vị trí mới thì được tính bằng:
new_pos = old_pos + -R.t()*t;
nơi new_pos & old_pos là vectơ (3x1), R ma trận xoay (3x3) và t vector dịch (3x1).
Thật không may là tôi không có kết quả hữu ích, vì vậy có thể ai đó có ý tưởng gì có thể sai.
Dưới đây là một số kết quả (chỉ trong trường hợp ai đó có thể khẳng định rằng bất kỳ trong số họ chắc chắn là sai):
F = [8.093827077399547e-07, 1.102681999632987e-06, -0.0007939604310854831;
1.29246107737264e-06, 1.492629957878578e-06, -0.001211264339006535;
-0.001052930954975217, -0.001278667878010564, 1]
K = [150, 0, 300;
0, 150, 400;
0, 0, 1]
E = [0.01821111092414898, 0.02481034499174221, -0.01651092283654529;
0.02908037424088439, 0.03358417405226801, -0.03397110489649674;
-0.04396975675562629, -0.05262169424538553, 0.04904210357279387]
t = [0.2970648246214448; 0.7352053067682792; 0.6092828956013705]
R = [0.2048034356172475, 0.4709818957303019, -0.858039396912323;
-0.8690270040802598, -0.3158728880490416, -0.3808101689488421;
-0.4503860776474556, 0.8236506374002566, 0.3446041331317597]
Có thêm một lỗi trong tính toán của bạn. 'SVD decomp = SVD (E);' là ok nhưng bạn phải tính toán một 'newE = U * diag (1,1,0) * Vt' và sau đó một lần nữa bạn phải có' SVD decomp2 = SVD (newE) ; '. – who9vy
thú vị. Tôi chưa bao giờ đọc về điều đó. Vì vậy, tôi đã làm tính toán R và t với decomp2? btw: cảm ơn câu trả lời chi tiết của bạn. Tôi phải kiểm tra tất cả mọi thứ và sẽ trả lời càng sớm càng tốt. – 3x14159265
Có, bạn phải tính toán R và t với decomp2. Một mô tả chi tiết được đưa ra ở đây (trang 257-260) http://www.robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf – who9vy