|||
从图像中的已知3D平面恢复出物体的旋转和平移矩阵R,T等,是单目视觉的基础问题,它的典型应用是三维重建、工业测量和增强现实等。具体步骤如下:
1.从图像中找到平面的灭点v1,v2。
利用两组互相垂直的不平行于图像平面的空间平行线,求出它们的交点。我们实验中用手工选取空间中的矩形(图中蓝色矩形,上海市外滩某建筑的外立面)。如果用自动的方法,可以用Hough变换估计直线,然后用最小二乘法估计多条直线的交点.
2.求焦距f,旋转矩阵R
根据灭点v1,v2求f:
f = sqrt(-(v1(1)*v2(1)+v1(2)*v2(2)));
然后求R
K = [f,0,0;0,f,0;0,0,1];
Kinv = inv(K);
gx = Kinv*v1';gx=gx./norm(gx);
gy = Kinv*v2';gy=gy./norm(gy);
gz=cross(gx,gy);
R = [gx,gy,gz];
这里有个麻烦,如果 -v1(1)*v2(1)-v1(2)*v2(2)<=0,会导致f无解。原因是3D物体和投影面(图像)的旋转角度很特殊,比如只有绕x轴的旋转或绕z轴旋转(平面内旋转),导致空间平行线在图像中仍然是平行线,这时的灭点在无穷远处,用2D齐次坐标表示为[vx,vy,0],vx,vy是平行线上的任何点,也就是说斜率k=vy/vx。此时要先计算出R,而f和平移矩阵T=[t1,t2,t3]则要用已知点对的映射关系用待定系数法求解。
3.求T=[t1,t2,t3]
设图像坐标(xp0,yp0)是物体的空间原点[0,0,0,1]的2D投影,
xp0*t3 = f*t1;
yp0*t3 = f*t2;
图像坐标(xp1,yp1)是3D坐标[1,0,0,1]的2D点,则有:
xp1=f*(R(1,1)+t1)/(R(3,1)+t3);
yp1=f*(R(2,1)+t2)/(R(3,1)+t3);
如f已知,t3由下式计算得到,前提是(xp0-xp1)~=0:
xp1*R(3,1) = f*R(1,1)+t3*(xp0-xp1);
否则用这个:
yp1*R(3,1) = f*R(2,1)+t3*(yp0-yp1);
这样空间平面和摄像机的位置关系就确定了。
4.根据给定的2D投影点计算这个点在3D平面上的位置
左乘内部参数K的逆矩阵,相当于矩阵前两行除以f:
x3d = Kinv * [xp0,yp0,1]' = [xp0/f,yp0/f,1]'
我们知道2D投影点其实是对应空间中的一条射线,计算出来的3D点是没有z值的。我们的已知平面上的z值为0。
代码如下:
p3d = inv([R(:,1),R(:,2),T])*[xp0/f,yp0/f,1]';
for i=1:3
p3d(i)=p3d(i)/p3d(3);
end
这样我们就得到一个基点,它位于我们选定的3D平面上,这个平面的3D姿态R,T已知,摄像机焦距f已知,我们就可以画出虚拟的3D物体,然后投影到平面上。比如图上红色的圆圈,是平面上的单位圆,中心是和它垂直的单位长度的线段,指向浦东方向。
附件:实验图像和matlab代码 blog.rar
----------------------------------------
5.3更新
用多条平行线估计x和z方向灭点,求得f=736.7,光心位置调整为(480,536),标注结果如下:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-8-17 20:21
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社