首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用校准相机从4点成像恢复平面

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

Stack Overflow用户
提问于 2012-08-27 03:51:41
回答 2查看 1.3K关注 0票数 1

我有一个相机和它的K矩阵(校准矩阵),我还有平面的图像,我知道4个角的实点和它们对应的像素。我知道如果z=0 (H是图像和实平面之间的单应矩阵),如何计算H矩阵。现在我试着用旋转矩阵和我遵循的平移向量得到平面的实点(3D点),这篇论文:校准架空摄像机,作者劳尔·罗哈斯在第3- 3.3节中。我的代码是:

代码语言:javascript
复制
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.观点颠倒了

我在干嘛呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-02 05:30:16

我在论文中找到了答案:校准架空摄像机,作者劳尔·罗哈斯在第3- 3.3节。

对于开始: H=K^-1*H给定图像中的四个点以及它们在世界上的已知坐标,矩阵H可以被恢复,直到缩放因子。我们知道旋转矩阵R的前两列必须是变换矩阵的前两列。让我们用h1,h2和h3表示矩阵的三列H.Due到缩放因子,然后我们具有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给出

票数 0
EN

Stack Overflow用户

发布于 2012-08-27 07:06:44

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

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

ps。对不起,我不知道等同的matlab,但他的网站上有openCV 3D函数的Bouguet has a matlab版本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12133366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档