现实物体在相机中的成像过程离不开世界坐标系、相机坐标系、图像坐标系以及像素坐标系,只有理解了这些才能对获取的图像进行准确的分析。
成像过程:
四个坐标系如下图所示:
世界坐标系(world coordinate system):
现实世界的三维坐标系,是现实世界的物理模型,单位为m。
相机坐标系(camera coordinate system):
以镜头硬件的光电系统为基础,建立的坐标系,为了从相机的角度描述物体位置而定义,首先建立相机的坐标系,作为沟通现实世界和图像/像素坐标系的中间桥梁,单位为m;世界坐标系到相机坐标系只涉及旋转和平移,所以是刚体变换,不涉及形变。
世界坐标系 —> 相机坐标系
绕Z轴旋转的坐标关系如下:
所以从世界坐标系到相机坐标系的转换关系如下所示:
用齐次坐标表示:
图像坐标系(image coordinate system):
为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标,单位为m;从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。如图所示此时相机坐标到图像坐标的关系表示为:
其中,相机坐标系的Z轴,与图像坐标系的Z轴,同方向。
像素坐标系(pixel coordinate system):
为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是真正从相机内读取到的信息所在的坐标系,单位为个(像素数目);以图像左上角为原点建立以像素为单位的直接坐标系u-v。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。(在OpenCV中u对应x,v对应y)图像坐标到像素坐标如下图所示:
所以,
世界坐标系到像素坐标系的,变换为:
其中:
是相机内参;
是相机外参。
图片来源:
计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
参考大佬:
1、相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析
2、世界坐标系、相机坐标系、图像坐标系、像素坐标系
3、相机内参详解
其中相机的内参和外参可以通过张正友标定获取(戳这里查看张正友标定的资料)。通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的Zc的值。
转换公式:
内参矩阵:
相机内参分别为:
f:焦距,单位毫米
fx:使用像素来描述x轴方向焦距的长度
fy:使用像素来描述y轴方向焦距的长度
u0,v0:主点坐标(相对于成像平面),单位也是像素
γ:为坐标轴倾斜参数,理想情况下为0
内参矩阵是相机自身的属性,通过标定就可以得到这些参数。
外参矩阵:
相机的外参是世界坐标系在相机坐标系下的描述,R是旋转参数是每个轴的旋转矩阵的乘积,T是平移参数。
畸变参数: k1、k2、k3径向畸变系数,p1、p2是切向畸变系数。径向畸变发生在相机坐标系转图像物理坐标系的过程中。而切向畸变是发生在相机制作过程,其是由于感光元平面跟透镜不平行。其如下:
1、径向畸变
:产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲径向畸变主要包含枕形畸变(左图)
和桶形畸变(右图)
两种。下面两幅图是这两种畸变的示意:
现实中真实照片:
2、切向畸变
:产生的原因透镜不完全平行于图像平面,这种现象发生于成像仪被粘贴在摄像机的时候。下面图片来自于《学习opencv》p413:
相机标定:
相机标定是后续计算机视觉工作的前提,其标定的目的是为了确定相机的内参、外参以及畸变参数。标定的方法有:线性标定法、非线性优化标定法、两步标定法。线性标定法:运算速度快但是标定的精度不高,因为相机畸变都是非线性的。非线性优化标定法:标定精度高,但模型复杂。两步标定法有:Tsai的经典两步法和张正友的标定方法。
参考大佬:
1、内参、外参、畸变参数三种参数与相机的标定方法与相机坐标系的理解
2、相机标定的几何数学原理–操作流程–应用管理
这里列举开源的五种标定方案,即百度阿波罗标定方法、but_calibration_camera_velodyne方法、基于ArUco_ros和ArUco_mapping包的方法、Autoware标定工具Calibration Tool Kit、览沃科技标定方法。
综合来看,选用Autoware来进行激光雷达和相机的联合标定。
温馨提醒:记得换源,保证网速的可靠。安装1.10版本,此处环境:Ubuntu16.04+ROS kinetic,Qt5.2.1虽然指明要求 5.2.1以上但是测试中发现Qt4也能正常使用,CUDA安装是可选的没有CUDA也能顺利安装使用,但是要安装CUDA的话记住一定要选择10.0版本,不然会出错。另外经过我的实践,显卡配置一般(显存<8G)的时候在使用autoware的过程中选择CUDA加速节点也会卡死。
Autoware现在有基于ROS1的Autoware.AI和基于ROS2的Autoware.Auto两个大的版本,其中Autoware.AI将在2020年年底停止更新,同时Autoware.Auto将拥有现在.ai有的所有功能(不过他官网上2019年的时间树还没填满,存疑)。本篇博客讲述Autoware.AI的安装,下面直接称autoware。
autoware的安装分为Docker和Source两种,docker安装相对简单,但是为了以后更方便的查看和研究源码,此处选择源码安装。
【注】:ROS和Qt的安装不再赘述,请自行安装。
sudo apt-get update
sudo apt-get install -y python-catkin-pkg python-rosdep ros-$ROS_DISTRO-catkin gksu
sudo apt-get install -y python3-pip python3-colcon-common-extensions python3-setuptools python3-vcstool
pip3 install -U setuptools
mkdir -p autoware.ai/src
建议直接下载源码放在autoware.ai/src
下,操作如下:
网址:https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/tree/1.10.0
除官方提到的内容之外,测试中我们发现运行时无法出现图形化界面,因此可以先安装psutil模块
sudo apt-get install python-pip
pip install --upgrade psutil
AutoWare是基于ROS开发的,因此编译前需要按照ROS的通用要求安装依赖库,即在源码中的ros文件夹下:
// 1. 进入 autoware 的 ros 目录下
cd autoware.ai/src/ros
// 2. rosdep 安装依赖
rosdep update
rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO
// 3. 编译运行
// 在源码的ros文件夹下直接运行脚本进行编译(有可能会遇到拒绝访问的问题,给src中所有文件赋予执行权限:https://blog.csdn.net/weixin_48262500/article/details/120058215)
./catkin_make_release
// 4. 运行脚本
./run
正常的图形化界面如图所示,终端可能出现一些错误信息,但是能出现该界面说明运行正常,测试中虽然报了一些错误信息,但是标定过程一切正常。
参考大佬:
1、自动驾驶之Autoware的安装,此篇文章有不同系统版本的对应安装版本。
2、Ubuntu16.04下Autoware1.10编译安装
3、Ubuntu16.04下Autoware安装与demo测试
4、Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!
5、激光雷达和相机的联合标定
6、autoware 激光-相机联合标定
7、无人驾驶汽车系统入门(二十二)——使用Autoware实践激光雷达与摄像机组合标定
【番外】:
1、自动驾驶(七十八)---------Apollo之标定模块
2、手眼标定之基本原理