泊车必备一文详解AVM环视自标定腾讯云开发者社区

AVM环视系统中相机参数通常是汽车出厂前在标定车间中进行的离线阶段标定。很多供应商还提供了不依赖于标定车间的汽车自标定方法。自标定指的是:汽车在马路上慢速行驶一段路,利用车道线等先验信息标定出相机的外参。

笔者在算法实现的开始阶段没有从头推导公式,而是直接使用论文中的结论公式,导致自标定出的外参矩阵与车间标定的结果(车间标定结果当作真值)总是存在一个正负号的差别。最终的拼接结果表现为图像与预想的结果存在反转、旋转等问题。笔者从头梳理了一下左右手坐标系、坐标系表征、坐标转换、欧拉角等基本原理,发现网上很多作者对这部内容都是抄来抄去文档很混乱。在实现自标定算法前,需要把这些都搞清楚。

在本帖中,笔者1.2.3节从基础原理讲起,最后第4节讲这些原理在自标定中的应用。

关键字:相机自标定、车道线、消失点、坐标系表征、坐标转换、欧拉角

自标定相机外参生成鸟瞰图

右、左手坐标系

方法一:

方法二:

方法二中四指握向的方向始终是x->y->z->x,即角度为90°,而不是270°。

本节的内容先当作一个先验知识,在后面自标定的实际应用中我们可以一起体会一下。

“坐标系表征”表达的物理意义用通俗的话解释就是:在A坐标系下观察B坐标系时,所看到的B坐标系的X、Y轴的方向。再通俗一点举个简单的例子:我们观察别人头部的时候,可以很容易知道这个人在看哪里,这就是因为我们获取到了对方人头坐标系的x、y、z轴在我们自己坐标系下的朝向。

可以理解为在XOY坐标系下观察xoy坐标系的坐标轴方向。

举个简单的视觉任务中的头姿例子:

如图所示,红色的XYZ坐标系为标准人头坐标系,即人头没有任何角度正朝前方的姿态。黄色的xyz为人头有一些旋转时当前姿态的坐标系。“头姿”指的就是在XYZ坐标系下xyz坐标系的表征,即在标准XYZ坐标系下观察当前人头的姿态:

其中

,

分别表示XYZ坐标系下x轴、z轴、y轴方向的单位向量。这就叫做在XYZ坐标系下xyz坐标系的表征。

对XOY坐标系下的点(1,0)进行坐标转换也分为两种情况,对应两种不同的物理意义

这种情况对应的物理意义为:XOY坐标系下的点(1,0)跟随坐标轴做了

旋转后,在原XOY坐标系下的坐标:

显然XOY坐标系下的点(1,0)跟随坐标轴做了

旋转后,在原XOY坐标系下的坐标为(cos

,sin

)

这种情况对应的物理意义为:XOY坐标系下的点(1,0)在xoy坐标系下的坐标:

在我们通常说的相机坐标转换中,更多的用到的是这第二种,下式中

表示kinect相机到ir相机的坐标转换。

因此我们可以得出一个结论:我们通常说的相机坐标系之间的坐标转换矩阵R,实际上是相机坐标系表征矩阵的逆。即对于如图AB这两个相机,将某点P的坐标从A坐标系转换到B坐标系的坐标转换矩阵,实际上等于A相机坐标系下B相机坐标系的表征矩阵的逆。这个结论对于各种视觉任务的理解非常重要。后面我们再说“坐标转换”说的就是这第二种情况。

笔者在根据github项目[1]实现基于消失点的自标定算法中计算坐标转换矩阵的时候,总是差一个正负号。当时就觉得大概率是因为欧拉角与旋转矩阵的关系没搞懂,而且笔者发现csdn、某乎甚至github上的老哥都是抄来抄去,给出的公式经常会相差一个正负号,估计大部分人都没搞懂最基础的原理是怎么回事。于是笔者从头推导了一遍,终于搞清楚这个东西是怎么用的。

下面我们一起来推导一遍。

欧拉角是坐标系旋转的表示,针对于相机坐标系可定义为(相机坐标系如下):

相机坐标系

注意:这样定义的pitch、yaw、roll(x轴pitch,y轴yaw,z轴roll)只能适用于这种相机坐标系,对于其他坐标系,例如飞机坐标系,那pitch、yaw和roll表示的含义就不同了,例如下图(引用自一文详解四元数、欧拉角、旋转矩阵、轴角如何相互转换(qq.com)):

飞机坐标系

当然,我们只讨论相机坐标系的情况,别的不考虑。相机坐标系也是一种右手系。其中z轴为相机光轴,朝向相机正前方;x轴朝向相机右侧;y轴朝向正下方。因此绕x轴旋转为俯仰角,绕y轴旋转为航偏角,绕z轴旋转为滚转角。

我们已经了解欧拉角在相机坐标系中的物理含义,知道了roll、yaw、pitch分别表示什么含义,那么如何通过欧拉角来表示两个不同的坐标系之间的关系呢?继续往下看。

我们先思考一个问题:如果相机绕着某一个轴转动了一个角度,那么我们如何使用数学来表示这个变换呢?本节的示意图,先看xyz,XYZ两个三维的相机坐标系,然后再观察相机坐标系绕某个轴做旋转。每个三维坐标系都表示相机坐标系,也是右手系。

相机绕Z轴旋转与2.1节很像,为了更好地推导数学公式,我们先从上图这个角度来看相机坐标系。图中Z轴方向为垂直于XY平面朝外,先脑补一下这个坐标系是不是和前面3.1中的坐标系是一模一样的(肯定是一样的啊,只不过从哪个角度来观察相机坐标系是不同的),XYZ相机坐标系绕找Z轴旋转了roll角度转换到了xyz坐标系,根据第1章的内容不难知道相机坐标系是一种右手系,且根据1.2中的结论可知上图中的旋转角roll为正。

进一步地,根据2.1节中坐标系表征的结论,在XYZ坐标系下xoy坐标系的表征如下,式中r表示roll角

上图依然是从某个角度看的相机坐标系,其中Y轴为垂直于XOZ平面朝里。根据右手坐标系定理可知图中相机坐标系XYZ绕着Y轴旋转到xyz坐标系,这个方向的旋转角yaw为正。进一步地,在原始XYZ相机坐标系下观察旋转后的xyz坐标系的表征如下,其中y表示yaw角

上图中相机坐标系XYZ绕X轴旋转pitch角,其中X轴为垂直与YOZ平面朝外,按照右手原则上图中的pitch为正。进一步地,在原始XYZ坐标系下观察xyz坐标系的表征如下,其中p表示pitch角。

上一节中讨论的是欧拉角与坐标系表征之间关系的问题,更多地是用在头姿任务中。在很多视觉任务中,我们需要知道的是:当坐标系做了某种旋转之后,同一个点在前后两个坐标系下的映射关系。

第2章中我们得到了结论:我们通常说的相机坐标系之间的坐标转换矩阵R,实际上是相机坐标系表征矩阵的逆

图中点P在XYZ与xyz坐标系下的坐标之间的转换关系可以表示如下:

这回懂了吧,网上csdn、某户、github上经常看见这个矩阵里面的元素有正有负,大家写的都不一样。因为这两种矩阵根本上代表的就不是一个东西,一个是坐标系表征,一个是坐标变换。

第3章结论如下,如果不想推导可以直接记住,经过笔者验证肯定是对的:

相机坐标系问题中的“欧拉角”“坐标系表征”“坐标系转换”

消失点原理

上图中O为相机光心,Imageplane为相机成像平面。地上的两条平行线为汽车行驶在路上时的平行车道线,根据相机透视投影模型不难发现:三维相机坐标系下的平行车道线投影到相机的二维成像平面上会交于一点,这一点我们称之为消失点,它对应的是三维相机坐标系下平行车道线的无穷远点。

消失点示意图

本篇不想讲关于车道线检测的内容,直接看结果吧(帖子写的太辛苦了,后面补吧。。。):

车道线与消失点

此时,需要我们用数学方法构造一个argmin||

||的问题。

对于图中的每一条车道线,我们都计算出了它对应的方程:

x+

y+

=0,其中(x,y)为消失点,

为车道线的直线方程参数,我们需要计算出满足所有直线方程的消失点(x,y)。因此问题转换为:

由于噪声的存在,上述理想化等式不可能存在,因此进一步地转换为:

,可以通过对矩阵

A进行特征分解,最小特征值对应的特征向量就是这个问题的解,也就是消失点坐标。

消失点求解代码如下:

voidRoadCalibrate::VanishPointsFitting(conststd::vector&line_params,cv::Point2d&pts){if(int(line_params.size())<2){LOG_ERROR("linesdetectedarenotenouth");return;}inth=int(line_params.size());intw=3;cv::MatA=cv::Mat::ones(h,w,CV_32F);for(inti=0;i(i,0)=line_params[i].x;A.at(i,1)=line_params[i].y;A.at(i,2)=line_params[i].z;}cv::MatA_T;cv::transpose(A,A_T);cv::MatAt_A=A_T*(A);cv::Mateigenvalues;cv::Mateigenvectors;cv::eigen(At_A,eigenvalues,eigenvectors);pts.x=eigenvectors.at(2,0)/eigenvectors.at(2,2);pts.y=eigenvectors.at(2,1)/eigenvectors.at(2,2);}opencv中调用eigen可以进行特征分解,特征值大小从大到小排列,特征向量是一行一行写入opencv的mat中的,即mat矩阵的第三行为解,拿到第三行向量做归一化即可。

)是包含一个尺度在里面的,而在二维平面中这个

肯定是1,因此不管算出来的解是啥,最后做归一化就可以得到消失点的二维像素坐标了。

基于消失点标定外参的方法是通过相机模型推导的,式中(X,Y,Z,1)为道路坐标系下某一点的齐次坐标,通过外参(R,t)转换到相机坐标系,然后通过相机内参K转移到图像坐标系下。我们要做的就是计算外参R。

相机模型

在我们AVM自标定的应用中,要标定的相机外参主要是俯仰角pitch,一般情况下yaw和roll很小。道路坐标系可以理解为朝向正前方,而我们的相机坐标系有一个俯仰角pitch,以一定角度向下倾斜。

我们已经知道消失点对应的三维坐标点在无穷远处,即Z为正无穷,且根据4.2中消失点计算的方法可以求解出消失点的二维坐标。因此我们可以通过上述相机模型+消失点二维图像坐标+消失点三维坐标的Z为无穷大这些先验构建起约束关系,推导如下:

那么问题来了,我们得到了旋转矩阵的最后一列r有什么用呢?这就又要使用到第3章中的欧拉角知识。首先我们要确定,当前的问题是坐标转换(求解将某点的坐标从道路坐标系转换到相机坐标系的R),而不是坐标系表征,因此用到的是第三章表格中的第二行矩阵(这一点必须要明确,否则在算法实现的时候总是差一个正负号,或者你看到最终投影的结果反转之类的,这也是本贴为什么花了前三个章节分别讲了左右手坐标系、坐标系转换、坐标系表征、欧拉角这些东西)。

相机坐标系与道路坐标系的转换关系可以理解成相机坐标系先绕x轴旋转某个pitch角度,再绕y轴旋转某个yaw角度,最后绕z轴旋转某个roll角度;也可以理解成先绕x轴旋转某个pitch角,再绕z轴旋转某个roll角,最后绕y轴旋转......。一共有

=321=6中不同的顺序组合。假设我们确定了坐标转换矩阵R,那么可以求解出6中不同的欧拉角,就是因为旋转轴的组合顺序不同。

实际上我们在基于消失点进行相机外参标定时用的时如下组合:

上式的物理意义是:相机先绕Z轴旋转roll翻滚角,然后绕X旋转pitch俯仰角,最后绕Y旋转航偏角,需要注意的是坐标转换矩阵的连乘顺序为左乘。即假设

将点p的坐标从a坐标系转换到b坐标系得到

(即

=

p),

将点

的坐标从b坐标系转换到c坐标系(即

),那么点p从a坐标系转换到c坐标系可表示为:

进一步地,可以得到道路坐标系与相机坐标系之间的坐标转换关系,从下式中可以看到第三列向量非常简洁,而由于我们前面已经算出了第三列

,因此可以通过反三角函数直接计算出pitch角和yaw角。

实际上roll、yaw、pitch的六种组合式中,每一种组合式的结果R必然有一列是非常简洁的,而在4.3节中我们根据消失点深度Z是无穷的+消失点图像坐标+相机内参这三个先验信息可以计算出R矩阵中第三列向量,因此我们在基于消失点计算外参的算法中构造这个R的时候,选取的是如上式的这种组合方式。

yawpitch的计算:

这个碗模型的中心就是汽车中心,中间的长方形区域就是汽车位置。

下图为放大后的坐标系示意图:

如图上图所示,道路坐标系与汽车标系之间的关系非常简单,它们都是有两个轴平行于地面,一个轴垂直于地面,因此很容易用第2章中的坐标系表征方法来相互表示。

我们想得到的是car坐标系->road坐标系的坐标转换关系,因此我们只需要先计算car坐标系下road坐标系的表征,然后对矩阵求逆即可。显然,在car坐标系下road坐标系的表征为:

则坐标转换矩阵为:

示意代码如下:

;/*******************************************************************************************************/voidRoadCalibrate::ExtrinsicCalibration(cv::Mat&coor_car2cam){cv::Matcar_look_road=(cv::Mat_(3,3)<<1,0,0,0,0,1,0,-1,0);cv::Matcoor_car2road;cv::invert(car_look_road,coor_car2road,CV:DECOMP_LU);coor_car2cam=coor_road2cam*coor_car2road;}/*******************************************************************************************************/来直接看下基于消失点自标定与在标定车间通过solvePnP标定的差异:

从标定的外参结果上来看大差不差,接下来我们可视化看下生成的鸟瞰图如何。

代码如下:

cv::MatRoadCalibrate::GenerateBev(floatyaw,floatpitch,constcv::Mat&gray){//coordinate:road->camerafloatroll=0;cv::Matrotation_yaw=(cv::Mat_(3,3)<(3,3)<<1,0,0,0,cos(pitch),sin(pitch),0,-sin(pitch),cos(pitch));cv::Matrotation_roll=(cv::Mat_(3,3)<roadcv::MatcoorR_cam2road;cv::invert(coorR_road2cam,coorR_cam2road,cv::DECOMP_LU);//road->bevcv::MatcoorR_road2bev=(cv::Mat_(3,3)<<1,0,0,0,cos(-1.57),sin(-1.57),0,-sin(-1.57),cos(-1.57));cv::MatcoorR_cam2bev=coorR_road2bev*coorR_cam2road;cv::MatH_cam2bev=m_intrinsic_dist*coorR_cam2bev*m_intrinsic_dist_inverse;cv::Matimg_bev;cv::warpPerspective(gray,img_bev,H_cam2bev,gray.size(),cv::INTER_LINEAR);imshow("bev",img_bev);}自标定生成鸟瞰图

最近的工作中越来越意识到算法底层原理的重要性,就算是调参也要弄清楚算法的逻辑,更不用说像自标定这种没有现成的API需要自己一点一点堆砌的东西。

本文中基于消失点的自标定只是一个糙版demo,目前还只能标定出yaw和pitch默认roll是0,外参矩阵中的t也是使用标定车间的标定结果,还有很多东西需要完善。比如车道线检测中的保护逻辑,标定出前后相机外参后需要在全局做优化等等。最后推荐一篇论文:《AutomaticCalibrationofanAroundViewMonitorSystemExploitingLaneMarkings》有些思路可以借鉴一下。

THE END
1.汽车构造第三版陈家瑞主编课后习题答案3、在汽车运行中,发动机的符合和转速是经常变化的。为了使发动机在各种工况下都能适时的点火,汽油发动机的点火系必须设置真空点火提前和离心点火提前两套调节装置。离心点火提前调节装置在发动机转速变化时,自动的改变断电器凸轮与分电器轴之间的相位关系,以改变点火提前角。真空点火提前调节装置在发动机负荷(即节气门开度https://m.360docs.net/doc/5c11426027.html
2.2013汽车维修实习报告范文(二)、气缸、气门、功率发动机基本参数详解 汽车发动机的基本参数包括发动机缸数,气缸的排列形式,气门,排量,高输出功率,大扭矩。缸数:汽车发动机常用缸数有3、4、5、6、8缸。排量1升以下的发动机常用3缸,12.5升一般为4缸发动机,3升左右的发动机一般为6缸,4升左右为8缸,5.5升以上用12缸发动机。一般来说,在同等https://m.51test.net/show/3351166/
3.汽车轮胎知识大全汽车轮胎规格参数详解 汽车轮胎规格参数,是轮胎几何参数与物理性能的标志数据。不同规格的轮胎对于整车的性能表现以及舒适性都会产生影响,下面我们一起看下。 断面宽度 是影响整车油耗表现的一个因素。轮胎的越宽,与地的接触面积越大,相应的就增加了轮胎与地面的摩擦力,车辆的动能转化为摩擦热能而损失的能量会增加,如https://www.jy135.com/qiche/78923.html
4.汽车知识入门篇之汽车参数详解二、发动机基本参数详解 1、缸数:汽车发动机常用缸数有3、4、5、6、8、10、12缸。排量1升以下的发动机常用三缸,1~2.5升一般为四缸发动机,3升左右的发动机一般为6缸,4升左右为8缸,5.5升以上用12缸发动机。一般来说,在同等缸径下,缸数越多,排量越大,功率越高;在同等排量下,缸数越多,缸径越小,转速可以提http://www.360doc.com/content/13/0315/21/10310181_271754424.shtml
5.汽车的主要尺寸参数和性能参数详解一、汽车的主要尺寸参数包括轴距、 轮距、 总长、 总宽、 总高、 前悬、 后悬等。 1. 轴距 L 轴距指车轴之间的距离。对双轴汽车,轴距就是前、后轴之间的距离;对三轴汽车,轴距是指前轴与中轴之间的距离和前轴与后轴之间的距离的平均值。汽车轴距短,汽车总长就短,质量就小,最小转弯半径和纵向通过半径也小https://www.dongchedi.com/ugc/article/7128358581757592068
6.2500型压裂车详解.doc2500型压裂车详解.doc 2500型(YL140-1860)压裂泵车结构、操作与维护 目 录缩写说明 Ⅵ第一章 结构与组成 1 一、概述 1 二、工作原理 3 三、压裂泵车的编号及型号说明 5 四、2500型压裂泵车性能参数 7 1、总体尺寸及重量 7 2、 整车工作性能参数 8 柱塞直径3-3/4″的性能参数 8 柱塞直径4″的性能参数https://max.book118.com/html/2016/0308/37109638.shtm
7.小米SU7纯电动汽车重量对照表与参数详解2.2 参数详解 制造企业: 北京汽车集团越野车有限公司 轴距: 3000mm 续航里程: 668-800km 车身尺寸: 长×宽×高:4997×1963×1440/1455mm 最高车速: 265km/h 动力电机型号: TZ220XY102 动力电机功率: 299马力 动力电机制造商: 苏州汇川联合动力系统股份有限公司 https://www.chenglix.com/zixun/914052.html
8.仰望汽车参数配置详解仰望汽车参数配置详解 比亚迪仰望数据参数如下: 电机转速20500,超1100匹马力,每个电机功率220-240kW,扭矩320-420Nm,120km/h爆胎不翻车,800V碳化硅模块。 非承载式车身,车长5.3米,轴距3.05米。 易四方技术平台,四轮四电机独立驱动,纯电动、插电式混合动力。https://www.yoojia.com/wenda/1100256.html
9.值得学习!马自达323参数,马自达328参数解析,性能与配置全览马自达328参数详解:技术与性能的完美结合 在当今汽车市场中,马自达以其独特的设计理念和卓越的性能表现赢得了广泛的赞誉,马自达323作为一款经典且实用的中型轿车,凭借其出色的参数配置和驾驶体验,成为了众多消费者的首选,本文将深入分析马自达323的几项关键参数,探讨它们如何共同作用,为驾驶者带来非凡的驾驶乐趣。 http://dabazhou.com/post/560.html
10.第4页:车企服务理念从入门到熟练掌握卡车基础知识普及篇“04”为主参数代码。主参数代码的意义为: ①在载重车中(载重汽车、越野车、自卸车、牵引车、特装车、全挂车、半挂车),这两位数表示的是车辆总质量(车辆自重和载重量之和)(单位:吨)。②在轿车中这两位数表示的是汽车的排气量(单位:升)。③客车中这两位数表示的是车身长度(单位:m)注:主参数不足规定位数时http://www.360che.com/driver/120315/19680_all.html