机器视觉 增强现实分享 http://blog.sciencenet.cn/u/wanglin193

博文

实验:从图像恢复透视投影参数

已有 14242 次阅读 2011-4-29 15:53 |个人分类:增强现实|系统分类:科研笔记| 三维重建, 增强现实

从图像中的已知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),标注结果如下:


   



https://wap.sciencenet.cn/blog-465130-438700.html

上一篇:人脸检测之四: 直方图.AdaBoost
下一篇:ASM/AAM手工标定的Matlab脚本
收藏 IP: 58.247.12.*| 热度|

0

发表评论 评论 (8 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-29 17:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部