智慧交通day03-车道线检测实现02-2:张氏标定法+双目标定

2024-01-20 08:20

本文主要是介绍智慧交通day03-车道线检测实现02-2:张氏标定法+双目标定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

6.张氏标定法

张氏标定法是张正友博士在1999年发表在国际顶级会议ICCV上的论文《Flexible Camera Calibration By Viewing a Plane From Unknown Orientations》中,提出的一种利用平面棋盘格进行相机标定的实用方法。

该方法介于传统标定法和自标定法之间,既克服了传统标定法需要的高精度三维标定物的缺点,又解决了自标定法鲁棒性差的难题。标定过程不需要特殊的标定物,只需使用一张打印出来的棋盘格,并从不同方向拍摄几组图片即可,不仅实用灵活方便,而且精度很高,鲁棒性好。因此很快被全世界广泛采用,极大的进了三维计算机视觉从实验室走向真实世界的进程。

6.1. 棋盘格数据

棋盘是一块由黑白方块间隔组成的标定板,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。之所以我们用棋盘作为标定物是因为平面棋盘模式更容易处理(相对于复杂的三维物体),但与此同时,二维物体相对于三维物体会缺少一部分信息,于是我们会多次改变棋盘的方位来捕捉图像,以求获得更丰富的坐标信息。如下图所示,是相机在不同方向下拍摄的同一个棋盘图像。如下图所示:

6.2. 单应性矩阵

张氏校正法是基于平面棋盘格的标定,首先我们介绍下两个平面中的单应性映射,在计算机视觉中,单应性(Homography)指从一个平面到另一个平面的投影映射,所以在标定物平面与图像平面之间存在单应性。

上文中我们已经得到了像素坐标系和世界坐标系下的坐标映射关系,因为标定物是平面,我们假设标定棋盘位于世界坐标中z=0平面,然后进行单应性计算。化简前文中的公式有:

那单应性矩阵定义为:

代入上式中有:

那怎么求H的值呢?

假设单应性矩阵H为:

假设图像中对应点的齐次坐标为图像点(u,v,1)和真实世界点(x,y,1)则有:

将上述矩阵展开后有三个等式:

将最后一个公式代入前两个公式中:

所以一组点对应着两个等式。

下面我们将上面的公式展开:

将其整理下:

假如我们得到了标定物与图像中对应的N个点对,那么有线性方程组为:

因为单应性矩阵中包含齐次坐标,我们可以直接将和h33设为1,剩余的8个参数未知的H至少需要4个点对即可计算出来。

6.3. 利用约束条件求解内参矩阵

通过上述介绍,应用4个点我们可以获得单应性矩阵H。但是,H是内参和外参的合体。如果我们想要最终分别获得内参和外参,需要想个办法,先把内参求出来。然后外参也就随之解出了。现在我们把单应性矩阵写成三个列向量的形式:

根据单应性矩阵的定义,有:

其中,λ是标量。

我们知道r1和r2是世界坐标系沿x和y轴的旋转向量,所以两者之间是正交的,且模长为1,可得出两个约束条件:

约束条件1:r1和r2的点积为0,即:

约束条件2:r1和r2的模长为1,即:

将r1和r2用h1,h2和内参矩阵A表示,即:

接下来将约束条件替换为h1,h2和内参矩阵A的表示,则有:

其中,h1和h2已通过单应性矩阵求解出来,未知量就是内参矩阵A了。

首先令:

内参矩阵和它的逆分别是:

 

则B矩阵为:  

从上式中可以发现B是一个对称阵,所以B的有效元素只剩下六个(因为有三对对称的元素是相等的,所以只要解得下面的6个元素就可以得到完整的B了),让这六个元素构成向量b。

接下来我们在做一下化简,令:

即单应性矩阵H的某一列向量,假设:

推导可得:

利用约束条件,有:

这个方程组的本质与用h和A组成的约束条件方程组是一样的。

得到矩阵B之后我们就可以计算内参矩阵A,很简单,内参矩阵中有5个未知参数,结果如下:

6.4. 基于内参矩阵估计外参矩阵

通过上面的计算,我们已经得到了相机的内参矩阵A,根据下式:

进行化简,即可得到相机的外参矩阵。

上述的推导过程是基于理想情况下的解,从几何推导上证明了张氏标定的可行性,并没有物理意义。在实际应用中,一般使用极大似然估计进行结果进行改善。

6.5. 极大似然参数估计

首先我们回顾下极大似然估计:极大似然估计是一种估计总体未知参数的方法。它主要用于点估计问题。所谓点估计是指用一个估计量的观测来估计未知参数的真值,即在参数空间中选取使得样本取得观测值的概率最大的参数。

例如:有两个外形完全相同的箱子,甲箱中有99只白球,1只黑球;乙箱中有99只黑球,1只白球。一次实验取出一只球,该球是黑球。问题是:黑球从哪个箱子中取出的?

第一印象是:黑球最像是从乙箱中取出来的,这个推断是符合人们的经验事实。“最像”即为“极大似然”之意,这种想法被称为“极大似然原理”。

那怎么使这个函数最小呢?张氏标定法运用了解决多参数非线性优化问题的LM算法,我们接下来给大家进行介绍。

6.6.优化方法

上一节中我们介绍到极大似然求解时,我们提到了LM算法。如果要优化的问题为线性的可以直接对目标函数求导,并且令其等于零,以此求得其极值,并通过比较求取全局最小值(Global Minimizer),并将其最为目标函数的解。但是如果问题为非线性,此时我们通常无法直接写出其导数形式(函数过于复杂),因此不去试图直接找到全局最小值,而是退而求其次通过不停的迭代计算寻找到函数的局部最小值(Local Minimizer),并认为该局部最小值能够使得我们的目标函数取得最优解(最小值),这就是非线性最小二乘的通常求解思路。很显然,在张氏较正中优化问题并不是线性的,我们需要通过迭代来求最优解。

那如何进行迭代计算呢?

6.6.1. 迭代方法

梯度下降法大家已经在机器学习中接触过,我们现在根据LM算法的发展,依次介绍:牛顿法,高斯牛顿法和LM算法。

6.6.2. 牛顿法

牛顿法主要用来解决非线性优化问题,其收敛速度比梯度下降速度快。主要思想是:在现有的极小值估计值的附近对目标函数做二阶泰勒展开,进而找到极小点的下一个估计值,反复迭代直到函数的一阶导数小于某个接近0的阀值。

 

所以:

什么是雅各比矩阵和hessian矩阵?

牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。下图中红线表示牛顿法,绿线表示梯度下降法。

牛顿法的缺点是包含Hessian矩阵的计算,在高维度计算Hessian矩阵需要消耗很大的计算量,甚至无法计算。

6.6.3. 高斯牛顿法

高斯牛顿(Gauss-Newton)法是对牛顿法的一种改进,它用雅克比矩阵的乘积近似代替牛顿法中的二阶Hessian 矩阵,从而省略了求二阶Hessian 矩阵的计算。下面来看看高斯牛顿法是怎么做的。

 

 

6.6.4. LM法

Levenberg-Marquardt(LM)法在一定程度上修正了高斯牛顿法的缺点,因此它比高斯牛顿法更加鲁棒,不过这是以牺牲一定的收敛速度为代价的--它的收敛速度比高斯牛顿法慢。

下面来看看LM算法到底怎么修正高斯牛顿法的缺点的?

LM采用的搜索方法是信赖域(Trust Region)方法,因为高斯牛顿法中采用近似泰勒函数只在展开点附近有较好的近似效果,如果步长太大近似就不准确,因此我们应该给步长加个信赖区域,在信赖区域里,我们认为近似是有效的,出了这个区域,近似会出问题。

下面我们通过一个示例来看下LM算法的流程:

LM算法可以一定程度避免系数矩阵的非奇异和病态问题,可以提供更鲁棒、更准确的步长。因此LM算法在相机标定、视觉SLAM等领域中应用非常广泛。

6.7. 标定流程

张氏标定就是利用一张打印的棋盘格,然后对每个角点进行标记其在像素坐标系的像素点坐标,以及在世界坐标系的坐标,张氏标定证明通过4组以上的点就可以求解出H矩阵的值,但是为了减少误差,具有更强的鲁棒性,我们一般会拍摄许多张照片,选取大量的角点进行标定。具体过程如下:

  • 打印一张棋盘格标定图纸,将其贴在平面物体的表面.
  • 拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。
  • 对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点)。我们定义打印的棋盘图纸位于世界坐标系zw=0的平面上,世界坐标系的原点位于棋盘图纸的固定一角(比如下图中黄色点)。像素坐标系原点位于图片左上角。

  • 因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到单应性矩阵H,进而得到相机的内参,外参等信息。

7. 双目标定

对于双目立体视觉,有两个摄像头。它们就像人的一双眼睛一样,从不同的方向看世界。两只眼睛中的图像的视差,让我们对世界有了三维的认识。

双目标定不仅要计算出每个摄像头的内部参数,还需要通过标定来测量两个摄像头之间的相对位置(即右摄像头相对于左摄像头的三维平移 t 和旋转 R 参数)。

两摄像头之间的旋转矩阵和平移矩阵可以由下式求出:

其中,R为两摄像头间的旋转矩阵,T为两摄像头间的平移矩阵。Rr为右摄像头经过张氏标定得到的相对标定物的旋转矩阵,Tr为右摄像头通过张氏标定得到的相对标定物的平移向量。Rl为左摄像头经过张氏标定得到的相对相同标定物的旋转矩阵,Tl为左摄像头经过张氏标定得到的相对相同标定物的平移向量。

我们在直观上感受下旋转矩阵和平移矩阵的意义:

对于R,首先用T把左摄像机坐标系平移到右摄像机坐标系上(即两坐标系远点重合)。然后在同一参考系下的两个旋转矩阵相乘,表示世界坐标先向右旋转到Rr ,再向左旋转Rl。那么两次旋转后得到的旋转,就是右摄像机旋转到左摄像机所需的旋转矩阵R。

对于T,先用R对左坐标系旋转一下,把左右两摄像机调成平行,然后直接平移向量相减,即得到。两摄像机之间的平移向量T。

得到双目标定的结果,我们就可以进行立体校正,立体匹配,三维重建的内容。


总结:

  1. 相机标定的意义

    建立世界坐标系和像素坐标之间的关系,可用于三维重建,图像校正等

  2. 成像原理

    小孔成像

  3. 相机成像模型

    世界坐标系:目标物体位置的参考系,是为了更好的描述相机的位置创建的

    相机坐标系:站在相机角度的坐标系

    图像坐标系:以图像中心为原点的坐标系

    像素坐标系:以图像左上角为原点的坐标系

    坐标系之间的转换:刚体变换-- 透射变换—离散化

    内参:描述相机内部属性的参数

    外参:决定相机坐标与世界坐标系之间相对位置关系

  4. 图像畸变

    径向畸变:沿着透镜半径方向产生的畸变

    切向畸变:透镜本身与相机传感器平面或图像平面不平行而产生

  5. 相机标定方法分类

    传统的标定方法,自标定法,基于主动视觉的标定方法

  6. 张氏标定法

    利用棋盘格图像对相机进行标定:单应性矩阵,利用约束条件求解内参矩阵,根据内参矩阵估计外参矩阵,利用极大似然方法估计参数,优化方法:牛顿法,高斯牛顿法和LM算法

    标定流程:

    • 打印一张棋盘格标定图纸,将其贴在平面物体的表面.
    • 拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。
    • 对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点。

    • 因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到单应性矩阵H,得到相机的内参,外参等信息。

  7. 双目校正

    双目较正,就是利用单目校正得到每个相机的参数后,在计算两个相机之间的相对位置。

这篇关于智慧交通day03-车道线检测实现02-2:张氏标定法+双目标定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625359

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import