使用校准相机从 4 点成像恢复平面

Posted

技术标签:

【中文标题】使用校准相机从 4 点成像恢复平面【英文标题】:recovery plane from 4 point imaging using calibration camera 【发布时间】:2012-08-26 19:51:41 【问题描述】:

我有一个相机和它的 K 矩阵(校准矩阵),我也有平面图像,我知道 4 个角的真实点和它们对应的像素。如果 z=0(H 是图像和真实平面之间的单应矩阵),我知道如何计算 H 矩阵。 现在我尝试使用旋转矩阵和平移向量来获取平面的实点(3D 点) 我遵循这篇论文:Calibrating an Overhead Video Camera by Raul Rojas 在第 3 - 3.3 节中。 我的代码是:

ImagePointsScreen=[16,8,1;505,55,1;505,248,1;44,301,1;];

screenImage=imread( 'screen.jpg');
RealPointsMirror=[0,0,1;9,0,1;9,6,1;0,6,1]; %Mirror
RealPointsScreen=[0,0,1;47.5,0,1;47.5,20,1;0,20,1];%Screen
imagesc(screenImage);
hold on
for i=1:4
    drawBubble(ImagePointsScreen(i,1),ImagePointsScreen(i,2),1,'g',int2str(i),'r')
end

Points3DScreen=Get3DpointSurface(RealPointsScreen,ImagePointsScreen,'Screen');

figure
hold on
plot3(Points3DScreen(:,1),Points3DScreen(:,2),Points3DScreen(:,3));
for i=1:4
    drawBubble(Points3DScreen(i,1),Points3DScreen(i,2),1,'g',int2str(i),'r')
end



function [ Points3D ] = Get3DpointSurface( RealPoints,ImagePoints,name)
M=zeros(8,9);

for i=1:4

M((i*2)-1,1:3)=-RealPoints(i,:);
M((i*2)-1,7:9)=RealPoints(i,:)*ImagePoints(i,1);
M(i*2,4:6)=-RealPoints(i,:);
M(i*2,7:9)=RealPoints(i,:)*ImagePoints(i,2);   

end

[U S V] = svd(M);
X = V(:,end);
H(1,:)=X(1:3,1)';
H(2,:)=X(4:6,1)';
H(3,:)=X(7:9,1)';
K=[680.561906875074,0,360.536967117290;0,682.250270165388,249.568615725655;0,0,1;];

newRO=pinv(K)*H;
h1=newRO(1:3,1);
h2=newRO(1:3,2);

scaleFactor=(norm(h1)+norm(h2))/2;
newRO=newRO./scaleFactor;
r1=newRO(1:3,1);
r2=newRO(1:3,2);
r3=cross(r1,r2);
r3=r3/norm(r3);

R=[r1,r2,r3];

RInv=pinv(R);
O=-RInv*newRO(1:3,3);
M=K*[R,-R*O];
for i=1:4
   res=pinv(M)* [ImagePoints(i,1),ImagePoints(i,2),1]';
   res=res';
   res=res*(1/res(1,4));
   Points3D(i,:)=res';

end
Points3D(i+1,:)=Points3D(1,:);  %just add the first point to the end of the array for draw square

end

我的结果是:

现在我有两个问题:

1.点1在(0,0,0),这不是真正的位置

2.点倒置

我在做什么?

【问题讨论】:

不是真正的编程问题...也许您可以在SE photography、SE mathematics、SE signal processing 或SE Audio & Video production 上提问。 【参考方案1】:

单应性通常是平面在两个位置/旋转中的变换。 平面的相机坐标中的位置通常称为位姿或外部参数

opencv 有一个solvePnP() 函数,它使用 Ransac 来估计已知平面的位置。

ps。抱歉,他的网站上不知道等效的 matlab 但Bouguet has a matlab 版本的 openCV 3D 函数

【讨论】:

我需要一个matlab解决方案【参考方案2】:

我在论文中找到了答案:Calibrating an Overhead Video Camera by Raul Rojas 在第 3 - 3.3 节中。

开始:H=K^-1*H 给定图像中的四个点及其在世界上的已知坐标, 矩阵 H 可以恢复到一个比例因子 。我们知道第一个 旋转矩阵 R 的两列必须是 变换矩阵。让我们用 h1、h2 和 h3 来表示 矩阵H.由于缩放因子,我们得到了 xr1 = h1 和 xr2 = h2 由于 |r1| = 1,则 x= |h1|/|r1| = |h1| x = |h2|/|r2| = |h2|。我们可以这样 计算因子并从恢复的矩阵 H 中消除它。我们只是设置 H'= H/x 通过这种方式,我们恢复了旋转矩阵 R 的前两列。 可以找到 R 的第三列,记住旋转中的任何列 矩阵是其他两列的叉积(乘以适当的 加号或减号)。尤其 r3 = r1 × r2 因此,我们可以从 H 中恢复旋转矩阵 R。我们也可以恢复 平移向量(摄像机在场坐标中的位置)。只是 请记住 h'3 = -R^t 因此,相机针孔 t 的位置矢量由下式给出 t = -R^-1 h3

【讨论】:

以上是关于使用校准相机从 4 点成像恢复平面的主要内容,如果未能解决你的问题,请参考以下文章

Opencv2.4.9源码分析——Stitching

Opencv2.4.9源码分析——Stitching

相机标定的内参、外参、畸变参数

记录相机成像原理

针孔相机模型及畸变

OpenCV每日函数 相机校准calibrateCamera函数