我正在尝试从两个校准过的相机重建三维图像。其中一个步骤是从两组相应的(同质)点(超过所需的8个)E
和P_a_orig
以及两个相机的3x3计算3x3基本矩阵P_b_orig
内部校准矩阵K_a
和K_b
。
我们首先用
标准化我们的点数P_a = inv(K_a) * p_a_orig
和
P_b = inv(K_b) * p_b_orig
我们也知道约束
P_b' * E * P_a = 0
我到目前为止一直在关注它,但你如何解决最后一个问题,例如找到E
矩阵的九个值?我已经阅读了关于这个主题的几个不同的讲义,但是他们都忽略了关键的最后一步。可能因为它被认为是微不足道的数学,但我不记得我上次这样做的时候,我还没有找到解决方案。
答案 0 :(得分:1)
这个等式在几何算法中实际上很常见,实质上,你试图从等式 AXB = 0 <计算矩阵 X / EM> 即可。为了解决这个问题,你将方程式矢量化,这意味着,
vec()表示矩阵的矢量化形式,即,简单地将矩阵的颜色堆叠在另一个上以产生单个颜色矢量。如果你不知道可怕的符号的含义,它叫做Kronecker产品,你可以从here读取它,它很容易,相信我: - )
现在,假设我将 B ^ T 的Kronecker产品和 A 所获得的矩阵称为<强> C 即可。 然后, vec(X) 是矩阵 C 的空向量,获取它的方法是执行 C ^ TC 的<{3}} (C转置乘以C)并取矩阵的最后一个 V 即可。最后一个颜色只是你的 vec(X) 。将X重构为3乘3矩阵。这是你必不可少的矩阵。
如果你发现这个数学太令人生畏的代码,只需使用Y.Ma et.al的以下代码:
% p are homogenius coordinates of the first image of size 3 by n
% q are homogenius coordinates of the second image of size 3 by n
function [E] = essentialDiscrete(p,q)
n = size(p);
NPOINTS = n(2);
% set up matrix A such that A*[v1,v2,v3,s1,s2,s3,s4,s5,s6]' = 0
A = zeros(NPOINTS, 9);
if NPOINTS < 9
error('Too few mesurements')
return;
end
for i = 1:NPOINTS
A(i,:) = kron(p(:,i),q(:,i))';
end
r = rank(A);
if r < 8
warning('Measurement matrix rank defficient')
T0 = 0; R = [];
end;
[U,S,V] = svd(A);
% pick the eigenvector corresponding to the smallest eigenvalue
e = V(:,9);
e = (round(1.0e+10*e))*(1.0e-10);
% essential matrix
E = reshape(e, 3, 3);
答案 1 :(得分:0)
你可以做几件事:
estimateFundamentalMatrix
功能,然后从基础矩阵中获取基本矩阵。