Matlab 由两组对应点计算本质矩阵
我正试图从两个校准过的摄像机重建一个3d图像。其中一个步骤是从两组相应(齐次)点(超过8个要求)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矩阵的九个值?关于这个问题,我读了好几篇不同的课堂讲稿,但都忽略了关键的最后一步。可能是因为它被认为是
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
- 或者,您可以使用计算机视觉系统工具箱中的功能校准立体相机系统,该工具箱将为您计算基本矩阵
% 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);