【磕岩日记】记一次酣畅淋漓的debug

总之因为种种原因需要写一个简单的渲染函数,将点云投影到“画布”上。

问题出在相机参数

概念辨析:

世界坐标系下的三维坐标([x,y,z])

在图像(举例:[h, w, c])上的位置“坐标”([i,j])

需要进行一系列变换。

最方便的情况下,只需要一个2*3的矩阵,一步变换,2*1 = 2*3 @ 3*1;但这不“物理”,因此引入齐次坐标的概念,利用矩阵乘法中乘0或乘1的“消除”或“保留”性质,把每一步变换都表示为左乘一个变换矩阵,且使得这些矩阵维度匹配

以我最常接触的小孔相机模型为例,将上述过程分解:

1、

世界坐标系下的三维坐标([x,y,z])-> 相机坐标系下的三维坐标([xc, yc, zc])

实际上,可以这样考虑:[xc, yc, zc]在相机系中,相机系在世界系中。只要知道世界系怎样变换成了相机系,就等于知道了世界坐标怎样变换成相机坐标。

从世界系变换到相机系,需要进行平移和旋转。可以这样考虑:从世界系原点出发,平移来到相机系原点(即相机在世界系下的位置三维坐标);然后旋转世界系的三条坐标轴,使之与相机系三条坐标轴对齐。

上述过程可以用一个[R T](维度:4x4)矩阵来表示。其中R是3x3旋转矩阵底部加一行0,T是平移量底部加一个1.世界坐标系的原点记为[0,0,0,1],该点在相机系下的三维坐标记为[xc0,yc0, zc0,1](齐次表达)。则有:[xc0, yc0, zc0, 1].t = [R T] @ [0,0,0,1].t

不难发现[xc0, yc0, zc0,1]其实就等于T.考虑世界系的三条坐标轴,会发现R的第一列、第二列、第三列分别等于世界系三条坐标轴在相机系下的朝向。[R T]称作w2c(世界到相机)矩阵。

然而实际上,相机是人摆的,相机在世界系下的坐标、相机系坐标轴在世界系下的朝向更好获得,且同样拥有类似性质,即:对于c2w(相机到世界矩阵),第一列、第二列、第三列分别等于相机系三条坐标轴在世界系下的朝向,第四列“T”等于相机在世界系下的三维(齐次)坐标。也就是说,如果已知这些条件,或者叫做“相机位姿(pose)”,可以直接写出c2w矩阵。

接下来是概念辨析时间,众所周知大家都很忙,做实验写代码都是怎么方便怎么来,于是我们有了:

从世界系到相机系,需要左乘一个变换矩阵,w2c矩阵,也称“相机外参”。

可是c2w矩阵容易获得,而且和w2c矩阵就是个互逆关系啊!c2w矩阵直接叫“相机外参”吧!

还有一些可视化工具会“自作主张”地进行转换……

所以在实际工作中,如果可视化结果不符合预期,检查一下是不是把w2c和c2w混用了。目前我没有找到很好用的检查方法,都是根据对于相机摆放情况ground truth的了解,做一系列假说演绎,检查相机系坐标轴朝向也一样。当然最好是可以提前知道,数据给的w2c还是c2w,相机系坐标轴是怎么指的……

2、

相机坐标系下的三维坐标([xc, yc, zc])->成像平面下的二维坐标(p,q)

想象一条光轴、一个成像平面、一个透镜、一支蜡烛。再画出两个相似三角形。

数学上,成像过程可以这样表示:[p,q,1].t = K @ [xc/zc, yc/zc, 1].t

物理上,影响成像平面上的“像”长啥样、有多大的因素包括深度z和焦距f。即有p/f = xc/zc,q/f = yc/zc,再考虑到坐标原点的平移,将“数学”和“物理”统一起来,K就像:

[[fx, 0, ux],

[0, fy, uy],

[0,0,1]]

其中fx = f/zc, fy = f/zc,p = f/zc * xc + ux, q = f/zc * yc + uy。(ux, uy)其实就是相机坐标系原点在成像平面下的位置,一般认为位于成像平面中心,即(x_width/2, y_height/2)。最后,还需要再“化模拟为数字”,把mm、cm或者m都一视同仁地变成“个”,有几个像素的“个”,得到[i,j].

一个“包罗万象”的K可以直接实现包含单位转化坐标系平移等等在内的所有变换,直接得到图像,但实际上,我们总会得到各种各样的相机内参数据,比如:

[[1,0,0.5],

[0,1,0.5],

[0,0,1]]

这是什么意思呢?这是一种“归一化”的表示。我的理解是,相当于x方向和y方向上都只有“1个像素”。所以,比如要得到[256,256]的图像,就要对投影后得到的[p,q]再做一次缩放,乘上256。这样才得到最终的[i,j].

归一化表示可以防止物体“溢出”画布边界。(“数学”上相当于fx、fy=画布长宽)

3、

关于“可见性”的疑惑:如果物体很大,焦距很小,岂不是就看不全了吗?怎么判断一个物体能不能被“完全拍到”呢?

可以直接对投影后的坐标进行“裁剪”(比如torch.clamp),超过边界就不画了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值