基于ARM的广角相机畸变校正系统设计
2022-02-28赵子国闵祥涛
赵子国,闵祥涛
中国电波传播研究所,山东 青岛 266107
0 引言
相机光学系统在设计、加工及装配过程中,由于加工误差及工艺水平的影响,使得成像系统不能在整视场满足针孔成像模型,进而导致原始图像发生扭曲、变形,不能真实客观地反映3D物理世界的空间位置信息[1]。特别对于90°至120°左右的广角相机,畸变更加严重。目前,国内外学者已经对广角相机的图像畸变校正做了大量的研究工作,探索出了如张正友标定法等效果较好的校正方法,但国内的相关研究主要是对预采集完成的图像在PC端软件进行畸变校正,缺少对广角相机进行实时校正的研究。在一些需现场更换镜头的场景,传统基于PC端软件的校正难以满足实时性需求。本文设计了一种基于ARM的广角相机畸变校正系统,将相机畸变校正算法在ARM中实现,无需借助PC机即可完成,提升了校正系统的实时性。
1 系统原理
1.1 畸变校正原理
本文使用棋盘格标定板,采用数字图像处理方法进行相机畸变校正。首先通过角点匹配建立畸变图像与标定板的映射变换矩阵。然后根据映射变换矩阵计算出相机内外参,将其作为后续优化的初始值。其次,加入相机畸变模型,完善变换矩阵,通过非线性优化方法得出相机内参及畸变系数的最优值。最后,利用相机内参及畸变系数的最优值对畸变图像进行畸变校正。
1.1.1 映射变换矩阵
(1)坐标系建立。像素坐标系:以数字图像左上角为坐标原点,以像素为单位建立的直角坐标系,如图1(a)中O0-UV坐标系。图像物理坐标系:原点定义在相机光轴与图像平面的交点,采用实际物理长度单位,如图1(a)中O1-XY坐标系。相机坐标系:以相机光心O为原点,Xc、Yc分别平行于x轴和y轴,Zc与光轴重合,建立O-XcYcZc坐标系。光心到图像平面的距离为相机焦距f。世界坐标系:在物理三维环境中,建立世界坐标系Ow-XwYwZw。
图1 坐标系示意图
(2)变换关系。假设空间中一点P在世界坐标系的坐标为Pw=(xw,yw,zw),在图像物理坐标系的坐标为P1=(x,y),在像素坐标系下坐标为P0=(u,v)。(u0,v0)为图像物理坐标系原点O1在像素坐标系下的坐标,dx、dy分别为x轴和y轴的像元尺寸大小。
假设相机为针孔相机模型[2],且选择定义物理平面,使得Zw=0,则有:
1.1.2 H矩阵求内外参
则有:
则两个约束可以写成:
如果对棋盘格平面采集n个图像,通过角点匹配并计算得到n个单应性矩阵H,代入上述方程组,则可以得到2n个方程。求解这个方程组,即可得到矩阵B。
1.1.3 相机畸变模型
相机畸变主要可分为径向畸变和切向畸变两类[4]。
径向畸变是沿着相机镜头透镜半径方向分布的畸变,产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲,径向畸变主要包括桶形畸变和枕形畸变两种。相机光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如广角镜头,可以增加使用第三项k3来进行描述。
切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。
综合考虑相机的径向畸变和切向畸变,可得到相机畸变校正模型为:
1.2 畸变校正算法流程
根据1.1中所述畸变校正原理,可按照以下步骤进行校正。
(1)准备棋盘格标定板,打开广角相机并从多角度拍摄标定板,获取10~20张含完整标定板的图像。
(2)检测图像中的特征角点,建立每张图像与实际物理棋盘格标定板的映射关系,求解单应性矩阵H。
(3)利用公式(1)构建方程组,估算相机内参和外参,并作为后续优化的初始值。
(4)加入相机畸变模型,建立优化模型进行优化:
式中mij表示世界坐标系下的点Pj在第i张图像上的投影点,表示通过内外参及畸变系数计算出的投影点坐标。
上述方程为非线性方程组,通过LM方法进行迭代求解,进而得到相机内参、外参及畸变系数的最优解。
(5)根据计算得到的相机内参、畸变系数的最优解,代入变换模型得到校正后的图像。
2 系统实现
本部分将从平台构建、软件设计两个方面进行叙述。
2.1 平台构建
2.1.1 硬件平台
硬件平台选择以ARM-Cortex-A7为内核的I.MX6ULL芯片作为核心处理芯片,外围搭配接口处理电路、存储电路等构成数据处理板,数据处理板连接摄像头模组、LCD显示器等,完成相机图像数据采集及处理。数据处理板硬件资源:CPU主频800MHz;内存256MB;FLASH容量256MB;拥有LCD、USB、摄像头及TF卡等接口。
广角相机参数:图像传感器的像元尺寸为1.4μm,300万像素;镜头的焦距为1.5mm,DFOV为102°。
2.1.2 Linux软件平台
本文相机畸变校正算法基于Linux-Opencv实现,首先需在ARM平台上移植嵌入式Linux系统,再将Opencv库移植到嵌入式Linux系统中,最后根据1.2中所述算法流程编写代码实现对广角相机的畸变校正。
(1)嵌入式Linux移植。一个完整的嵌入式Linux系统包含bootloader、Linux内核以及根文件系统组成。嵌入式Linux系统移植过程如下。
①bootloader移植:本文使用的bootloader为uboot,以NXP官方发布的uboot为基础,通过添加处理板默认配置文件、头文件、板级文件夹,修改硬件驱动等步骤使uboot适配数据处理板,再编译下载uboot至ARM中。
②Linux内核移植:本文选择Linux-4.1.15版本,以Linux源码为基础,使用imx_v7_mfg_defconfig配置文件配置Linux内核,修改设备驱动,再对Linux内核进行编译生成zImage镜像文件以及设备树文件,最后下载至ARM中。
③根文件系统移植:本文使用BusyBox构建根文件系统,通过修改Makefile文件、配置BusyBox等步骤生成rootfs目录文件,再添加lib库,创建dev、proc等文件夹,修改rcS、fstab、inittab等文件,最后下载至ARM中。
(2)OpenCV库移植。OpenCV是一个跨平台的计算机视觉处理开源软件库,可在包括Windows、Linux等不同系统平台上使用。
本文选择opencv-3.4.1版本,移植过程如下:①将获取到的opencv-3.4.1源码在Linux环境下解压;②通过cmake-gui图形化工具根据需求选择需要的库进行配置,并生成Makefile等文件;③使用make指令进行编译,安装至创建的install目录下后,再拷贝至根文件系统/usr/lib下。
至此,基于ARM平台的Linux系统及其图像处理库构建完毕。
2.2 软件设计
软件实现主要包括相机图像采集、校正算法实现两部分。
2.2.1 相机图像采集
本文采用Linux内核中视频类设备驱动框架V4L2编写相机驱动实现图像采集,该驱动框架提供了一套统一的接口规范,每一个videoX设备文件代表一个视频类设备。应用程序通过对videoX设备文件进行I/O操作来使用该类设备[5]。
编写应用程序实现相机图像采集时,应遵循V4L2设备驱动框架规范,其编程流程如下。
(1)使用open函数打开相机设备文件。
(2)查询相机的属性、功能。
(3)设置相机参数,如使用ioctl(fd,VIDIOC_S_FMT,&fmt)设置帧格式。
(4)申请帧缓冲,再进行内存映射。
(5)开启帧缓冲入队,而后通过调用ioctl(fd,VIDIOC_STREAMON,&type)进行图像采集。
(6)帧缓冲出队,并从帧缓冲中获取数据、进行处理。
(7)处理完后,再次将帧缓冲入队,往复。
(8)停止相机采集,取消内存映射,关闭设备。
通过上述相机图像采集应用程序从多角度采集15张含完整标定板的图像,并存入FLASH中供后续校正算法使用。
2.2.2 畸变校正
系统相机畸变校正软件基于OpenCV库实现,其编程流程如下。
(1)读取FLASH中保存的15张图片,对每张图片提取特征角点,如果检测到的所有角点排布方式与棋盘格标定板角点的排布方式相同,则认定该幅照片有效并生成图像特征点位置数组,否则直接丢弃并继续处理下一张图片。可使用cornerSubPix函数作进一步优化计算,使角点的位置精度达到亚像素级别。
(2)根据棋盘格标定板特征角点的排列位置关系建立物理特征点位置数组,利用FindHomography函数求解图像特征点位置数组与物理特征点位置数组的映射关系,得到单应性矩阵H。
(3)由H矩阵,利用Solve函数、FindExtrinsic CameraParams2函数分别得到相机内参、外参,并作为优化初始值。
(4)在相机映射变换矩阵基础上加入相机畸变模型,构建优化模型,运用LM方法使所有视图的重投影误差之和最小,取最小点处相机内参、外参及畸变系数的值作为最优值。
(5)根据计算得到的相机内参、畸变系数的最优值,可通过getOptimalNewCameraMatrix函数获得新内参值以去除畸变校正后图像四周黑色区域,再利用undistort函数得到校正后的图像。
3 效果
系统上电并等待Linux系统启动后,运行相机驱动程序完成对棋盘格标定板多视角采集,图像采集数量为15张。采集的图像如图2(a)所示。
图2 相机采集图像
运行系统相机畸变校正软件,读取采集到的15张图片,经过计算得到相机内参及畸变系数。再选取待校正图片,如图2(b),点击校正,即可得到校正完成后的图片,如图2(c)。可见,系统对畸变图像有较好的校正效果。
4 结语
本文设计了一种基于ARM平台的广角相机畸变校正系统,摆脱了传统基于PC端进行校正的方法,将广角相机校正算法在嵌入式ARM平台得到了实现,使系统实时性得到了提升,取得了较好的校正效果,具有一定的实际工程应用价值。后续将对算法进行优化,使实时性得到进一步提升。