第5章 畸 变 通过现实中的相机拍摄的照片会不可避免地产生畸变。畸变由相机、透镜形状和变焦 程度等因素共同决定。 5.图像畸变 1 5.1 径向畸变 1. 由透镜形状引起的畸变称为径向畸变。相机的镜头由多个透镜组成,而透镜的成像原 理涉及弯曲光线,所以经过相机镜头的光线会有不同程度的弯曲,这就会造成图像的失真。 在相机拍摄到图像时,图像越靠近边缘失真越大。 由于透镜往往是中心对称的,在形状上接近于理想的透镜,因此不必考虑透镜的中心位 置,并且畸变以径向畸变为主。径向畸变的特点是:光线在远离透镜中心的地方比靠近中 心的地方更加弯曲。径向畸变分为两大类,即桶形畸变和枕形畸变。 1.桶形畸变和枕形畸变 5.2 桶形畸变的特点是:图像的像素向图像中心发散。以网格图片为例,发生桶形畸变的 网格图片的效果如图5-1所示。 图5-1 发生桶形畸变的网格图片的效果 1 83 枕形畸变的特点是:图像的像素向图像中心聚拢。以网格图片为例,发生枕形畸变的 网格图片的效果如图5-2所示。 图5-2 发生枕形畸变的网格图片的效果 5.1.3 切向畸变 切向畸变的特点是:透镜不完全平行于图像平面,即相机传感器在装配时与镜头间的 角度不准。 5.2 Hugin Hugin是一种易用的跨平台的全景成像工具链,基于Panorama工具编写。Hugin可 以将一组马赛克照片组合成一个完整的身临其境的全景图,以及可以缝合任何一系列重叠 的照片等。 Hugin的功能很多,可以覆盖和处理与拍摄影像相关的大多数前期处理工作。本章侧 重于Hugin的镜头校准功能。 5.2.1 安装Hugin 通过DNF软件源安装Hugin,命令如下: $ sudo dnf install hugin 然后在应用菜单中可以看到安装后的3个选项,如图5-3所示。 图5-3 Hugin在安装后的3个选项 184 其中,HuginCalibrateLens(Hugin镜头校准)就是在校准时需要使用的选项。 5.2 Hugn镜头校准的默认状态 2.i Hugin镜头校准的GUI 的默认状态如图5-4所示。 图5-4 Hugin镜头校准的GUI 的默认状态 Hugin镜头校准选项的默认值如表5-1所示。 表5- 1 Hugin镜头校准选项的默认值 选项默认值选项默认值 边缘检测比例2 最大图像尺寸1600 边缘检测阈值4 最短行长度0.3 此外,单击“优化”按钮即可重置“边缘检测比例”输入框、“边缘检测阈值”输入框、最(“) 大图 像尺寸”输入框和“最短行长度”输入框中的内容,然后这些输入框中的内容将变为默认值。 5.3 Hugn镜头校准的镜头类型 2.i Hugin镜头校准支持的镜头类型包括标准的(直线的)、全景的(圆柱的)、圆形鱼眼、全 185 帧鱼眼、等矩形的、正投影、立体图像、Equisolid及鱼眼Thoby。不同的镜头类型可能会导 致算得的校准参数不同。 5.4 Hugn镜头校准的图片要求 2.i Hugin在校准时需要事先用需要校准的相机或镜头拍摄一张带有直线的照片。一般而 言,拍摄一张现代建筑的照片或以平行线组成的照片即可满足Hugin的校准需求。 5.5 Huin镜头校准的必选参数 2.g 在选择至少一张图片后,Hugin还需要用户选择正确的镜头类型并至少填写焦距和焦 距乘法器,然后单击“优化”按钮即可得到校准参数。 5.6 Hugn镜头校准的可选参数 2.i Hugin默认只校准径向畸变。在勾选“图像偏心”复选框后,Hugin将同时校准径向畸 变和切向畸变。 此外,Hugin默认只校准b参数。在勾选“畸变(a)”复选框后,Hugin将同时校准a参 数;在勾选“桶状(b)”复选框后,Hugin将同时校准b参数;在勾选“畸变(c)”复选框后, Hugin将同时校准c参数。 注意:在摄影技术中,如果只是校准桶形畸变或枕形畸变,则只应该校准b参数。 在AR 技术中目前没有这种要求。 5.7 Huin镜头校准的常见错误 2.g Hugin在校准时将试图自动查找图中的直线。如果Hugin没有找到直线,则在单击 “优化”按钮后弹出错误对话框,如图5-5所示。 如果出现这种和检测行相关的错误,此时则可以 适度修改“边缘检测比例”输入框、“边缘检测阈值”输 入框、“最大图像尺寸”输入框和“最短行长度”输入框 中的内容,然后单击“查找行”按钮,最后单击“优化” 图5-5 在单击“优化”按钮 按钮重新查找直线。在使用直线效果不够标准的图后弹出错误对话框 片校准时往往要重复多次类似的修改参数的操作。 5.8 Hugn镜头校准的预览功能 2.i Hugin在GUI 的右半部分设计了预览区域,允许用户查看原始的图片、边缘检测结果 及已经校正的结果。 预览功能的常见用法如下: 1 86 (1)用户可以核对当前文件名对应的原始的图片是否对应了想要用于校准的图片。如 果用户发现当前文件名对应的图片不是想要用于校准的图片,则可及时单击“移除”按钮并 更换正确的图片。 (2)如果出现和检测行相关的错误,则用户可以通过图片的边缘检测结果调整选项,从 而提高调整参数的成功率。 (3)用户可以查看已经校正的结果,确认参数的有效性。如果用户对已经校正的结果 图5-6 在单击“保存镜头”按钮 后弹出的对话框 不满意,则可以手动微调镜头参数,然后单击“刷新”按钮 并查看新的已经校正的结果。 5.2.9 Hugin保存镜头 此外,Hugin还允许保存镜头。在Hugin成功校准 并得到镜头的优化参数后,可以单击“保存镜头”按钮,弹 出对话框如图5-6所示。 如果选择“保存镜头参数到ini文件”选项并单击“确 定”按钮,则Hugin将打开文件保存器,用户可以先选择 文件夹,然后保存ini文件。保存的ini文件如下: #第5 章/XT-AQ72-linux.ini [Lens] image_width = 4032 image_height = 3024 type = 0 hfov = 70.9788 hfov_link = 0 crop = 4.75 a = 0 a_link = 0 b = 0.0006 b_link = 0 c = 0 c_link = 0 d = 0 d_link = 0 e = 0 e_link = 0 g = 0 g_link = 0 t = 0 t_link = 0 Va = 1 Va_link = 0 Vb = 0 Vb_link = 0 Vc = 0 1 87 Vc_link = 0 Vd = 0 Vd_link = 0 Vx = 0 Vx_link = 0 Vy = 0 Vy_link = 0 Ra = 0 Ra_link = 0 Rb = 0 Rb_link = 0 Rc = 0 Rc_link = 0 Rd = 0 Rd_link = 0 Re = 0 Re_link = 0 [Lens/crop] enabled = 0 autoCenter = 1 left = 0 top = 0 right = 4032 bottom = 3024 [EXIF] CameraMake = Sony CameraModel = XQ-AT72 FocalLength = 5.11 Aperture = 1.7 ISO = 100 CropFactor = 4.75 Distance = 0 如果选择Savelensparameterstolensdatabase选项并单击“确定”按钮,则Hugin将 打开“保存镜头到数据库”对话框,如图5-7所示。 图5-7 “保存镜头到数据库”对话框 1 88 在勾选了至少1个应该保存的参数后,“保存镜头到数据库”对话框将允许单击“确定” 按钮,然后单击“确定”按钮即可将当前的镜头保存到远程数据库,此后理论上其他人也可以 在互联网上搜索到这个新的镜头参数。 注意:实际上,笔者没能在互联网上搜索到自己上传的新的镜头参数。 5.3 kalibr kalibr是一种适用于特定场景的校准工具,可以进行多相机校准、相机-IMU 校准、多 IMU 校准和滚动快门相机校准。 5.3.1 kalibr在Docker之下安装并校准相机 获取kalibr的源码,命令如下: $ git clone https://github.com/ethz-asl/kalibr.git 进入kalibr文件夹,命令如下: $ cd kalibr 使用kalibr的源码编译Docker容器,命令如下: $ docker build -t kalibr -f Dockerfile_ros1_20_04 创建共享文件夹,命令如下: $ mkdir /home/linux/kalibr_share_folder 编写kalibr的启动脚本,代码如下: #第5 章/run_kalibr.sh FOLDER=/home/linux/kalibr_share_folder xhost + docker run -it -e "DISPLAY" -e "QT_X11_NO_MITSHM=1" \ -v "/tmp/.X11-UNIX:/tmp/.X11-UNIX:rw" \ -v "$FOLDER:/data" kalibr 添加run_kalibr.sh文件的可执行权限,命令如下: $ sudo chmod +x run_kalibr.sh 启动kalibr容器,命令如下: $ sudo ./run_kalibr.sh 在kalibr的容器的内部执行校准相机的命令如下: 1 89 #source devel/setup.bash #rosrun kalibr kalibr_calibrate_cameras \ --bag /data/cam_april.bag --target /data/april_6x6.yaml \ --models pinhole-radtan pinhole-radtan \ --topics /cam0/image_raw /cam1/image_raw 5.3.2 kalibr源码安装并校准相机 首先安装kalibr的依赖。 kalibr在编译前需要安装ROS1。详见5.3.3节中的内容。 首先安装kalibr相关的依赖。安装Eigen的头文件,命令如下: $ sudo dnf install eigen3-devel 安装git,命令如下: $ sudo dnf install git 安装wget,命令如下: $ sudo dnf install wget 安装autoconf,命令如下: $ sudo dnf install autoconf 安装automake,命令如下: $ sudo dnf install automake 安装nano,命令如下: $ sudo dnf install nano 安装Boost的头文件,命令如下: $ sudo dnf install boost-devel 安装SuiteSparse,命令如下: $ sudo dnf install suitesparse 安装doxygen,命令如下: $ sudo dnf install doxygen 安装OpenCV 的头文件,命令如下: $ sudo dnf install opencv-devel 安装poco的头文件,命令如下: $ sudo dnf install poco-devel 1 90 安装TBB的头文件,命令如下: $ sudo dnf install tbb-devel 安装BLAS的头文件,命令如下: $ sudo dnf install blas-devel 安装LAPACK的头文件,命令如下: $ sudo dnf install lapack-devel 安装V4L的头文件,命令如下: $ sudo dnf install v4l-utils-devel-tools 初始化catkin工作空间,命令如下: $ cd ~/kalibr_workspace/src 将kalibr的源码复制到catkin工作空间下,命令如下: $ git clone https://github.com/ethz-asl/kalibr.git 编译kalibr,命令如下: $ cd ~/kalibr_workspace/ $ catkin build -DCMAKE_BUILD_TYPE = Release -j4 在catkin工作空间下执行校准相机的命令,命令如下: $ source ~/kalibr_workspace/devel/setup.bash $ rosrun kalibr 5.3.3 kalibr以ROS包的格式收集数据 kalibr提供了bagcreater命令,用于将图像数据和IMU 数据收集到同一个ROS包中, 其中图像数据为一幅或多幅图片,IMU 数据为CSV 文件。 将图像数据和IMU 数据收集到同一个ROS包中的命令如下: $ kalibr_bagcreater --folder dataset-dir/. --output-bag awsome.bag 解压ROS包中的数据的命令如下: $ kalibr_bagextractor - - image- topics /cam0/image_raw /cam1/image_raw - - imutopics /imu0 --output-folder dataset-dir --bag awsome.bag 在收集数据时需要保持校准目标固定,并且将相机-IMU 系统移动到目标前面,以激发 所有IMU 轴。此外,还要确保校准目标的良好和均匀照明,并保持较短的相机快门时间, 以避免过度的运动模糊。kalibr建议用于校准的相机在20Hz且IMU 在200Hz。 5.3.4 kalibr校准多个相机 kalibr的多摄像机校准工具用于估计多摄像机系统的内参和外参,要求相邻摄像机具 1 91 有重叠的视场。 图像数据需要作为ROS包提供,其中包含所有摄像机的图像流。校准流程将遍历所有 图像,并根据信息论测量并选取图像,以获得系统参数的良好估计。 在校准时允许投影和失真模型的任意组合。 kalibr在校准多个相机时必须通过命令传入的参数如下: (1)--bagfilename.bag。此参数代表用于校准的图像数据。 (2)--topicsTOPIC_0...TOPIC_N。此参数代表所有相机的topic的列表,并且列表 的顺序必须和--models参数一一对应。 (3)--modelsMODEL_0...MODEL_N。此参数代表相机模型和/或畸变模型的列表。 (4)--targettarget.yaml。此参数代表输出校准文件的文件名。 使用kalibr校准多个相机的代码如下: kalibr_calibrate_cameras --bag [filename.bag]--topics [TOPIC_0 ... TOPIC_N] --models [MODEL_0 ... MODEL_N]--target [target.yaml] 查看kalibr校准多个相机的用法的代码如下: kalibr_calibrate_cameras --h 5.3.5 kalibr校准带IMU 的相机 相机IMU 校准工具估计相机系统相对于固有校准IMU 的空间和时间参数。图像数 据和IMU 数据需要作为ROS包提供。相机IMU 校准工具使用样条曲线对系统姿态进行 建模并在批处理优化中估计校准参数。 IMU 的固有参数(例如刻度、轴不重合度、非线性度等)需要预先校准,并将其校正应用 于原始测量。将校准参数写入IMU 配置文件中,并采用YAML格式编写,其中包含加速 度计和陀螺仪的噪声密度和偏差的随机扰动。 IMU 配置文件的文件名为camchain.yaml,用于整个相机系统的校准。每个相机的校 准参数如下: (1)camera_model代表相机的投影模型,可选pinhole或omni。 (2)intrinsics代表相机内参向量。如果相机模型是pinhole,则参数值的格式为[fufv pupv];如果相机模型是omni,则参数值的格式为[xifufvpupv];如果相机模型是ds,则 参数值的格式为[xialphafufvpupv];如果相机模型是eucm,则参数值的格式为[alpha betafufvpupv]。详见kalibr支持的相机模型。 (3)distortion_model代表镜头畸变模型,可选radtan或equidistant。 (4)distortion_coeffs代表镜头畸变模型的参数向量。详见kalibr支持的畸变模型。 (5)T_cn_cnm1代表相机外参的变换矩阵,总和批处理过程中的最后一个摄像头有 关。例如,T_cn_cnm1=T_c1_c0变换将点从相机c0的坐标系变换到相机c1的坐标系。 (6)T_cam_imu代表IMU 外参的变换矩阵,用于将点从IMU 坐标系变换到相机的坐