从两组对应点计算基本矩阵

时间:2014-09-28 15:51:29

标签: matlab image-processing computer-vision matlab-cvst 3d-reconstruction

我正在尝试从两个校准过的相机重建三维图像。其中一个步骤是从两组相应的(同质)点(超过所需的8个)EP_a_orig以及两个相机的3x3计算3x3基本矩阵P_b_orig内部校准矩阵K_aK_b

我们首先用

标准化我们的点数
P_a = inv(K_a) * p_a_orig

P_b = inv(K_b) * p_b_orig

我们也知道约束

P_b' * E * P_a = 0

我到目前为止一直在关注它,但你如何解决最后一个问题,例如找到E矩阵的九个值?我已经阅读了关于这个主题的几个不同的讲义,但是他们都忽略了关键的最后一步。可能因为它被认为是微不足道的数学,但我不记得我上次这样做的时候,我还没有找到解决方案。

2 个答案:

答案 0 :(得分:1)

这个等式在几何算法中实际上很常见,实质上,你试图从等式 AXB = 0 <计算矩阵 X / EM> 即可。为了解决这个问题,你将方程式矢量化,这意味着, enter image description here

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)

你可以做几件事:

  • 可以使用8-point algorithm估算基本矩阵,您可以自己实现。
  • 您可以使用计算机视觉系统工具箱中的estimateFundamentalMatrix功能,然后从基础矩阵中获取基本矩阵。
  • 或者,您可以使用计算机视觉系统工具箱中的estimateCameraParameters功能校准立体摄像系统,该功能将为您计算基本矩阵。