APP下载

无人化起重机视觉识别关键技术研究与实现

2022-03-29周奇才赵科渊

起重运输机械 2022年4期
关键词:双目畸变标定

周奇才 姜 宽 赵科渊

同济大学机械与能源工程学院 上海 201804

0 引言

近年来人工智能视觉识别技术发展迅速,在起重机领域发挥出极大助力作用。段锐等[1]融合计算机视觉技术和建筑信息模型,实现在起重机运行过程中实时监控,对倾翻、碰撞、坠落等安全事故进行危险预警。周前飞等[2]借助无人机巡检,采集起重机复杂钢结构表面图像,进行起重机健康状态的结构检测。通过图像处理进行特征提取识别方式,有着非接触、远程可视化的优点。黄宏安等[3]使用YOLOv3、Faster-RCNN和SSD等主流算法实现对塔吊的裂缝进行识别。熊肖磊等[4]基于YOLOv3目标检测算法识别吊钩,根据图像中吊钩离开平衡位置的位移和图像坐标变换能够计算出吊钩摆动角度。双目相机拥有更大的视野,并可以产生有限感知范围的深度信息,适合满足定位、测距、路径规划等相关需求。漆静等[5]在研究实时图像处理、恶劣天气条件下预处理、集装箱颜色自动识别等方面后,提出了双目机器视觉用于集装箱吊具定位系统的理论分析和实验研究。张锐[6]通过双目视觉对塔式起重机吊钩进行识别,获取深度信息,得出坐标系下具体位置。刘涛等[7]针对塔式起重机群交叉作业过程中存在的安全问题,运用双目视觉测量技术来实现塔式起重机主动避撞。

Matlab的相机标定工具有2种[8]。早期的Camera Calibration Toolbox将参数设置、加载图片、角点提取、相机参数计算和优化、重投影误差分析、数据保存和导出等标定功能集成在GUI程序中,其操作多为工作区命令行方式,较为操作繁琐。后期的Camera Calibreator集成在Matlab的APP中,标定后直接提供重投影误差、3D视图的展示、相机参数、误差等数据的标准格式导出将操作大大简化。OpenCV是一款免费的计算机视觉和机器学习库,可运行在各种操作系统上,由C语言编写并包含Matlab等软件接口,实现了关于图像处理和计算机视觉的通用算法,扩展性良好。如张峰峰[9]等提出基于OpenCV利用差分遗传算法优化BP神经网络来进行双目相机标定的方法,简化了标定的流程,降低了计算的复杂度,亦提高了标定的精度。李莉[10]基于OpenCV解决了张正友标定中当镜头与图像平面夹角过小或标定图像次数过少时精度较差的问题。

1 基本概念

1.1 相机模型

如图1所示,相机模型分为小孔成像模型和双目相机模型。假设P(XC,YC,ZC)为空间中一点,则Pl和Pr分别是点P在左右相机投影平面上的投影,根据射线OlPl和射线OrPr的交点,可确定点P的位置,从而得到深度信息。在实际中,摄像机不会严格地前向平行对准,还存在旋转关系,故左右目相机可通过旋转矩阵R和平移向量T相互联系起来。

图1 小孔成像模型和双目相机模型

基于小孔成像原理,由于安装误差导致芯片的中心通常不在光轴上,且成像装置的单个像素是矩形但不是正方形,需要引入2个新的参数Cx、Cv来对投影屏幕坐标中心可能的偏移(对光轴而言)进行建模。这样假设点P坐标为(X,Y,Z),根据式(1)投射到成像装置上某个像素位置(xscreen,yscreen)

用透镜使光线弯曲,让足够多的光线聚集在投影点上,使得图像生成更加迅速,但也会引入因透镜形状或加工工艺造成的径向畸变,导致离透镜中心越远光线越弯曲,越靠近透镜边缘越严重。在实际应用中畸变很小,用r=0附近的泰勒级数展开前几项描述,成像装置上某点径向位置可根据式(2)进行调整。切向畸变由整个相机的组装过程造成,由透镜和CMOS(或CCD)的安装误差导致透镜不与成像平面平行而产生的,可用2个额外参数得到,即

假设图像物理坐标系xOy坐标原点O在图像像素坐标系x1O1y1下坐标为(cx,cy),像素在各坐标轴上所占据的物理尺寸分别为dx、dy(mm/px),则图像中任意像素点在2坐标系的转换关系为

齐次坐标形式为

假设空间中存在一点P,在双目相机坐标系Oc-XcYcZc下坐标为(Xc,Yc,Zc),图像物理坐标为(x,y),由小孔成像模型可以得到

化为齐次坐标形式

将式(7)代入式(5)式得

式中:K为相机内参数矩阵,fx=f/dx,fy=f/dy为有效焦距,为相机焦距与水平和垂直方向上像素大小的比值。

1.2 张正友标定法原理

相机内外参数标定方法有经典标定法、自动标定法以及主动视觉标定法[11]。目前使用最多的是经典标定法中的张氏相机标定法,它解决了经典标定法中标定物制作精度要求高的问题,比自标定法的精度更高,模板制作容易,成本低、使用方便、鲁棒性好、准确率高,用户可快速、方便、准确地得到相机的各内外参数和畸变参数。Matlab视觉处理库和Open CV开源视觉库都是基于张正友标定原理求解相机参数。张正友标定法流程如图2所示。

图2 张正友标定法流程

2 标定实现

2.1 实验准备

2.1.1 标定板选择

为了保证标定结果的精度,可采用高精度加工工艺,热膨胀系数较低,不易变形,尺寸合适的标定板。标定板大小要求大于全视野的1/3,小于全视野。根据透光、反光等因素可选择氧化铝加玻璃基板、菲林PET加玻璃基板,亚克力基板等标定板。考虑到制作成本以及运输储存成本,更直接的方法是自己制作,用打印机打印出黑白棋盘格并固定到现有平整的基板上实现。

在实际中,使用不对称的奇偶维数的棋盘格通常更为方便,因为只有1个对称轴,所以棋盘方向可以唯一确定。拍摄一系列照片,最少2张,10~20张为宜,不同的图片进行标定时得到的结果会有差异,重投影误差很小,则表明标定结果足够使用。照片可实时从相机中获取,也可利用已有的图片来标定。

本文选用图3所示9行×12列的黑白标定棋盘格,每个格子尺寸大小为30×30 mm。采用质量较好的打印设备和纸张,粘贴在平整的刚性平木板上。实际使用中,会省略最外层格子。

图3 黑白棋盘格

2.1.2 相机参数

双目相机有较高的分辨率和帧率可以提升检测精度,但控制器对数据处理的相应时间也会增加。本次实验选用ZED双目相机,利用CUDA进行计算,缓解CPU计算能力。ZED双目相机部分参数如表1所示,实际测量中可以根据环境条件和精度要求选择合适的分辨率与帧率,通过USB3.0接口与控制器相连并进行数据获取和处理,单目相机标定可以看作是双目相机标定的简化。

表1 ZED双目相机技术规格

2.2 双目相机标定

双目标定的内容包含获取相机的内部参数和外部参数,外部参数包括旋转矩阵和平移向量;

利用双目相机完成立体成像具体包括使用数学方法消除径向和切向透镜畸变,输出去畸变图像;调整摄像机之间的角度和距离,输出整帧行对齐的图像,即2个图像平面共面,2个成像仪上的对应图像行实际上相对于彼此共线。

本次实验中,由于双目相机获得的是如图4所示的左右相连图像,可以利用OpenCV或其他裁剪工具把图像简单的分割成左右2幅图像。最终获得如图5所示的图像集。

图4 双目相机获取图像

图5 左目图像集和右目图像集

3.2.1 OpenCV实现

1)确定好标定所用标定棋盘格宽度、高度、棋盘格宽度和所需照片数量等数据并修改相关参数。

2)利用imread()从文档中或利用cv::Capture从相机中分别获取左右相机含棋盘格的一系列图像对。

3)根据提前输入角点数,使用 findChessboardCorner()函数检测角点,也使用 find4QuadCornerSubpix()函数对角点进行亚像素精确化。利用drawChessboardCorners()将角点显示。

4)通过stereocalibrateCamera()函数进行标定,标定给出2个相机的相机矩阵、畸变矢量、产生旋转矩阵、平移向量、本征矩阵、基本矩阵,并将参数写入xml文档。

5)利用projectPoints()函数计算重投影误差。利用undistortPoints()对原始点去畸变处理,computeCorrespondEpilines()计算极线,计算点和线的点击,之后通过极线几何约束计算误差。

6)如果已经完成标定,使用Bouguer方法cv::stereoRectify计算标定映射;如果未完成标定,则使用Hartley方法cv:;stereoRectifyUncalibrated()计算标定映射,最后利用remap()校正相机图像。图6是经过立体校正左右图像对。

图6 经过立体校正左右图像对

实验得到平均重投影误差=0.78,双目极线误差=1.73367。

3.2.2 Matlab实现

1)打开模块,将窗口上方Skew、Tangential Distortion以及3 Coefficients选项选中,将2 Coefficients选项去掉。

2)分别输入左标定图像所在文件夹和右标定图像所在文件夹;输入棋盘格上每个格子所占的真实尺寸大小。

3)选择好左右相机所在文件之后,点击确定按钮,系统会自动检测效果好的标定图像,并剔除效果不好的图像。

4)点击Calibrate按钮,进行标定。窗口界面包含:标定的效果,双目矫正结果,重投影误差柱状图。对于重投影误差较大的图像可以手动删除掉,然后重新标。由图7可以看出,最高标定误差为0.18 pixels,平均误差0.11 pixels,标定效果好。

图7 每幅图像误差以及平均误差

如图8所示,可以展示出不同位置和姿态下双目相机和标定板的相互位置,可以增加合适的位置关系来改善标定结果。图9展示了经过立体校正左右图像对。

图8 相对于标定板不同位置和姿态下双目相机的相对位置

图9 经过立体校正左右图像对

5)点击Exprot Camera Parameter按钮,保存标定的参数数据。

3.3.3 标定结果

2种方法标定得到相机参数结果如表2所示。

表2 不同标定软件标定结果

4 结果分析与比较

由图10a可以直观看出Matlab和OpenCV的重投影误差均在一个像素之间,精度较好。Matlab法精度比OpenCV法更好更稳定,而OpenCV法重投影误差随着照片数量先增加后减少。

图10 双目相机参数标定结果与照片数关系

具体到每个参数,以左目相机内参矩阵为对象,研究了fx、fv、cx、cv、k1、k2、k3与照片数关系,以及双目相机间的平移向量T与照片数关系。Matlab和OpenCV标定结果在照片数较多情况下标定结果的相差不大,其中cx、cv变化明显和厂家值偏差明显。2款软件对切向畸变[p1,p2],估计都为零,而实际厂家还是给出了2个非零的微小量。总体而言,Matlab结果更加稳定,在照片数量较少的情况下仍能得到良好的标定结果;而OpenCV方法在如Tv、Tz、k1等参数有着更接近厂家值的结果。此外,实验过程中环境因素如光线、灰尘,棋盘格质量如材料、平整度,都会对重投影误差有影响,而棋盘格大小,角点数量对结果没有明显影响。

即使输入相同照片,2种工具得到的相机标定结果也不尽相同。二者虽然都是基于张正友提出的标定算法来进行相机标定,Matlab采用的是进一步的Heikkilä的改进算法,有进行结果的迭代优化。同时标定时OpenCV在处理鱼眼相机或比较模糊的图片时会报错,且2个相机的初始位置近乎平行且基线长度不要太长,否则误差会很大。OpenCV中角点是自动检测的,为了保证相同参考系,左右相机标定的角点必须选择相同的网格点和相同的原点。因此,实验时最好将角点可视化,观察角点是否匹配正确。

为了得到更好的结果,实验显示照片数量最好为15~20对,OpenCV相比Matlab需要更多的照片对来完成准确的标定,否则当照片数量较少时会产生很大误差。在照片数小于14张时,OpenCV法在fx、fv、k1、k2有较大的误差,Matlab在Tv、Tz有较大的误差。当照片数小于6张时,Matlab法的其他参数也有着不小的误差。不同的图片因为实际拍摄质量原因进行标定时得到的结果会有差异,重投影误差足够小时标定结果就足够使用。

Matlab作为现有的标定软件,简单易操作,结果稳定,有着更好的用户交互功能,但其结果不能直接被应用到CMAKE工程里,也因其对程序的打包不利于程序跟踪和二次开发。当现有照片数量不多以及存在标定板与镜头夹角较小情况时优先选用。

OpenCV自带的标定程序目前仍存在不足和限制,后续可利用一些方法和算法进行二次开发对标定流程和结果进行优化。除了Matlab中直接输入摄像头信息和采用已经采集好的多张不同位置的标定模板照片2种输入方式外,OpenCV还支持采集的视频流文件输入方式。OpenCV虽然操作复杂,但可以结合图像分割、相机校正和后续外参标定,以实现全自动标定和其他操作,易于将结果加载到程序中。可以将Matlab某些结果导入到OpenCV中来细化标定结果,即在Matlab中标定之后再使用OpenCV标定。但需要注意的是矩阵在Matlab中是按列存储的,即内参矩阵IntrinsicMatrix和旋转矩阵RotationOfCamera2需要转置后再使用。

其次,畸变系数径向畸变参数第3个数值需要放在上述2个参数中的第5个位置。即OpenCV中D=[k1,k2,p1,p2,k3],而在 Matlab 中为 RadialDistortion=[k1,k2,k3],TangentialDistortion=[P1,P2]。否则校正后的图片会有很大偏差。

5 结论

1)利用Matlab和OpenCV均可实现单目相机、双目相机参数标定。

2)随着标定所用照片数量增加,2种工具的标定结果都逐渐趋于稳定。在照片数量较少的时候,Matlab法有着更加稳定的精度。

3)即使采用的照片相同,2种工具得到的结果也会不同。

4)Matlab适合新手操作以及满足只需要得到相机参数这种简单需求。OpenCV适合进行二次开发,可以利用一些方法和算法对标定流程和结果进行优化,以及配合后续图像分割、相机校正和图像识别等过程实现自动操作。而两种工具结果融合能提供更可靠的参考。

猜你喜欢

双目畸变标定
矩形截面单箱双室箱梁的畸变效应分析
基于条纹分析技术的镜头畸变校正实验设计
采用双目视觉和自适应Kalman滤波的作物行识别与跟踪
霜 降 苏美玲
基于双目视觉的机器人定位与导航算法
大型焊接容器局部热处理防畸变工装优化设计
轻卡前视摄像头的售后标定
一种轻卡前视单目摄像头下线标定方法
使用朗仁H6 Pro标定北汽绅宝转向角传感器
几何特性对薄壁箱梁畸变效应的影响