Matlab 相机视角控制
视角参数示意图
The line of sight starts at the center of the plot box and points toward the camera.
视线方向
-
定义:从plot box的中心到相机中心的方向向量.
-
角度范围:
- Az方位角: (-180°,180°], 官网没提,可以经过matlab实测确认.
- EI仰角: [-90°,90°],与官网一致.
根据示意图和matlab官网说明,可以看出Az的从[0,-1,0]为起始轴逆时针转动Az角度后再逆时针转动EI角度就可以得到视线方向.
Note: 这里定义的视线方向只适用于plot2和3等matlab传统axes, 实际在matlab近年提供的三维点云处理模块中,视线方向根据Target和camera position来定义, 可以自行验证
在Matlab点云处理中的相机视角控制参数
- View : 使用[Az, EI]来描述, 可用于控制整体的视角,不适合细节控制;
个人建议: 在点云处理中,不建议用View来控制相机的视线方向, 一旦进行更加复杂的视角变换后,matlab计算的View参数其实是有问题的. 可以验证只有在box center和target point重合的时候,计算才是对的. 使用view()函数控制视角之后可以看到,matlab会把box center与target point 重合.
- Projection: 分为正交投影orthographic和透视投影perspective两种投影方式.
个人理解:如果要根据相机轨迹和姿态来重现观测过程, 建议使用perspective会更好看一点; 如果是要绘制相机观测的整个过程, 还是建议orthographic. 这是我画的示意图, 左边是正交投影,中间是透视投影,右边是图片. [红色和绿色为相机,绿色为当前相机]
- CameraPosition: 在世界坐标系中的相机位置[x y z],可以参考最前面的示意图.
- CameraTarget: 在世界坐标系中的目标点位置[x y z],可以参考最前面的示意图.
Note:可以从示意图可以看出,CameraTarget 与 CameraPosition构成的向量为光轴方向. 因此可以通过这个向量来控制相机坐标系的深度轴向,一般为z轴. 值得注意的是, CameraTarget的三维点只需要设置在深度轴的正向方向. 我自己写了个一个光轴转换target位置的代码,仅供参考:
>optical_axis=[0;0;1]; %一般取为z轴,也可以换成其他轴, 相机坐标系
>focal_length=10000; %理论上取(1,∞)的范围都会让target保持在深度轴正向上,但是取10000在matlab上显示更稳定而且好看一点
>target=focal_length*R(:,:,observe_id)'*optical_axis+t(:,observe_id);%利用x=R(X-t)来进行逆转换
- CameraUpVector: 相机朝向上的方向向量[x y z],可以参考最前面的示意图.
Note:
1.相机的姿态要确定需要确定两根轴, 使用CameraTarget可以固定深度轴, 因此还需要CameraUpVector来固定另一个轴, 实际上就是确定相机坐标系的y或者x轴.
2.CameraUpVector的转换可以参考Target的转换代码部分,几乎一样.相机坐标系下一般取[0;-1;1]. 下图是我画的示意图.
- ViewAngle: 相机的FOV, [0,180)的范围
Note: 通过这个参数可以对3D点云进行类似放大缩小的功能, 官网说不会影响透视畸变的程度.
相机视角控制工具
这部分matlab官网写的很好了,蛮详细的,可以直接参考官网说明.
ps:第一次写blog文章,如果大家感兴趣,后面有时间发一些我自己的SLAM和多视图几何的总结
weixin_62747082: 相机拍出来的图片尺寸固定吗,还是可以设置。
艾尔普兰: 博主你好,我这两天也在写BAL转sfm_data的脚本,有问题想要请教一下。 我自己用了几个数据集,BA前的RMSE是60+像素,我查看了DBACC论文的实验部分,几个数据的初始误差都是个位数,请问博主计算的时候初始RMSE是多少? 还有一个问题是关于view和intrinsic的w和h,BAL是没有给出的,我稍微看了openMVG的代码,好像没有影响,但是代码看不全我也没办法完全确定,如果博主了解的话也麻烦回答一下。 谢谢!