Matlab 由两组对应点计算本质矩阵

Matlab 由两组对应点计算本质矩阵,matlab,image-processing,computer-vision,matlab-cvst,3d-reconstruction,Matlab,Image Processing,Computer Vision,Matlab Cvst,3d Reconstruction,我正试图从两个校准过的摄像机重建一个3d图像。其中一个步骤是从两组相应(齐次)点(超过8个要求)P_a_orig和P_b_orig以及两个摄像机的3x3内部校准矩阵K_a计算3x3基本矩阵E 首先,我们用 P_a = inv(K_a) * p_a_orig 及 我们也知道约束条件 P_b' * E * P_a = 0 到目前为止,我一直在关注这一点,但实际上如何解决最后一个问题,例如,找到e矩阵的九个值?关于这个问题,我读了好几篇不同的课堂讲稿,但都忽略了关键的最后一步。可能是因为它被认为是

我正试图从两个校准过的摄像机重建一个3d图像。其中一个步骤是从两组相应(齐次)点(超过8个要求)
P_a_orig
P_b_orig
以及两个摄像机的3x3内部校准矩阵
K_a
计算3x3基本矩阵
E

首先,我们用

P_a = inv(K_a) * p_a_orig

我们也知道约束条件

P_b' * E * P_a = 0

到目前为止,我一直在关注这一点,但实际上如何解决最后一个问题,例如,找到
e
矩阵的九个值?关于这个问题,我读了好几篇不同的课堂讲稿,但都忽略了关键的最后一步。可能是因为它被认为是一个琐碎的数学问题,但我不记得上次是什么时候做的,我还没有找到解决方案。

你可以做几件事:

  • 基本矩阵可以使用估计,您可以自己实现
  • 您可以使用计算机视觉系统工具箱中的
    estimateFundamentalMatrix
    函数,然后从基本矩阵中获取基本矩阵
  • 或者,您可以使用计算机视觉系统工具箱中的功能校准立体相机系统,该工具箱将为您计算基本矩阵

这个方程实际上在几何算法中非常常见,基本上,您试图从方程AXB=0计算矩阵X。要解决这个问题,你需要对方程进行矢量化,这意味着,

vec()表示矩阵的向量化形式,即简单地将矩阵的列一个一个地堆叠在另一个上以生成单个列向量。如果你不知道这个看起来吓人的符号的含义,它叫做Kronecker产品,你可以从中阅读,很简单,相信我:-)

现在,假设我将由B^TA的Kronecker乘积得到的矩阵称为C。 然后,vec(X)是矩阵C的零向量,获得零向量的方法是执行C^TC(C转置乘以C)并取矩阵V的最后一列。最后一列只不过是你的vec(X)。将X的形状改为3乘3矩阵。这是你的基本矩阵

如果您觉得这个数学太难编写代码,只需使用Y.Ma等人的以下代码即可:

%  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);
%p是大小为3×n的第一幅图像的同调坐标
%q是大小为3×n的第二幅图像的同调坐标
函数[E]=本质混凝土(p,q)
n=尺寸(p);
NPOINTS=n(2);
%设置矩阵A,使A*[v1、v2、v3、s1、s2、s3、s4、s5、s6]'=0
A=零(n点,9);
如果NPOINTS<9
错误(“测量太少”)
返回;
结束
对于i=1:NPOINTS
A(i,:)=kron(p(:,i),q(:,i));
结束
r=等级(A);
如果r<8
警告(“度量矩阵秩缺陷”)
T0=0;R=[];
结束;
[U,S,V]=svd(A);
%选取与最小特征值对应的特征向量
e=V(:,9);
e=(四舍五入(1.0e+10*e))*(1.0e-10);
%本质矩阵
E=重塑(E,3,3);

您确定可以简单地从基本矩阵中获得基本矩阵吗?我相信这是不可能的,如果不知道摄像机的内在参数。。。
%  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);