相机光学(十五)——如何提高相机标定的精度

2023-05-16

    为了提高单目相机标定的精度,认真看了张正友标定法的原文,并且学习过网上一些牛人的方法,但是大部分时候说的很笼统,自己把这些经验总结起来并都测试了一下,感觉靠谱的结论列出如下:

(1)在标定时,标定模板所在平面与成像平面(image plane)之间的夹角不能太小,实验表明:当两者之间夹角较小时,会产生很大的误差。

(2)图像中标定板与相机的相对位姿,一般要让标定板占据整张图像的一半左右面积,并且标定板相对于相机要有正视、仰视、俯视、左斜视和右斜视等;
(3)标定板的位姿对标定结果影响比标定照片数目的影响大得多;
(4)标定板一定要平整,否则误差很大,标定板的平整度是最重要的因素;
(5)用于拍摄的照片的先后顺序对结果影响不大,小数点后前五位都是一样的,随机抽掉一张结果影响也不大;
(6)按照张正友标定法原文,拍照顺序是从正对图像开始,每次选择一个坐标轴,旋转45度的角度,拍摄16幅左右的图片就可以,但是感觉可以角度小一点;

-----------------------------------分割线------------------------------
    列出当时自己实验时的拍摄角度方案,这七个方案拍摄标定出来的结果去畸变都没问题,但是光心的位移有一点不同,都往右下方向偏移但是偏移量不同,后来总结效果最好的方案应该 是方案 六,但是优势并不明显。如果以后有人想做这个实验,可以先看看我的不成功案例,也许可以节省时间。

方案一:三组,正视14张、仰视14张、俯视14张,所有照片仅相对水平轴旋转,正视照片占相机视野四分之三,俯仰视照片占相机视野四分之一,每组内的14张照片是划出了一个矩形的轮廓,中间2张,四周12张;
方案二:三组,正视14张、仰视14张、俯视14张,正视照片无转角(无任何旋转),仰视和俯视的照片成扇面状对着相机(既绕水平轴又绕铅垂轴),正视照片占相机视野四分之三,俯仰视照片占相机视野四分之一,14张照片是划出了一个矩形的轮廓,中间2张,四周12张;
方案三:其他与方案二一致,只是仰视和俯视的照片成楔子状对着相机;
方案四:三组,正视14张、仰视14张、俯视14张,正视、仰视和俯视的照片全部成扇面状对着相机,正视照片占相机视野四分之三,俯仰视照片占相机视野四分之一,14张照片是划出了一个矩形的轮廓,中间2张,四周12张;
方案五:其他与方案四一致,只是正视俯视仰视照片成楔子状对着相机;
方案六:先拍四张正视,然后左远右近(就是标定板的左边离相机远右边离相机近,下同)四张,左近右远四张,上远下近四张,上近下远四张——既不是楔子型也不是扇面形。
方案七:长轴中线上,均匀变换角度,拍9张,短轴中线上,均匀变化角度,拍9张,然后四个角各补一张。共22张。
--------------------- 
版权声明:本文为CSDN博主「Witnesses」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zilanpotou182/article/details/68491447

参考链接:https://blog.csdn.net/lxy_2011/article/details/80675803

在传统的相机模型中共有 4 套坐标系:世界坐标系是物体点 p 的三维世界坐标,是由用户自己定义的;相机坐标系 是以相机光心为原点,以垂直于图像平面的相机光轴为 zc轴,xc轴和 yc轴平行于图像平面;图像的物理坐标系 和 分别为像上显示的坐标和畸变矫正后的像点物理坐标;(u,v)为像点的像素坐标系。空间物点 pw到像点 pd的转换就通过这 4 套坐标系经过 3 次转换而得来的[4]。根据理想的小孔成像模型,可表示为:

式(1)中:dx、dy 分别为感光器件上 x 和 y 方向上像素点间的距离;u x 和 y 方向的有效焦距,其单位是像素。r 为世界坐标系到相机坐标系的 3×3 矩阵。t 为世界坐标系到相机坐标系的唯一平移向量。

考虑到一般性,在张氏标定方法中设计了平面靶标,即,z=0,记单应性矩阵

,又可以写为:

单应性矩阵 h 把靶标上的点同图像上的点联系起来,h为 3×3。每一幅图像都最多只有一个单应性矩阵。一个单应性矩阵可以从 4 组((x,y,z)和对应的(u,v))坐标对中产生多达 8 个参数。利用从不同视场拍摄多次拍摄(理论上至少两次)图片计算出多个单应性矩阵,利用最小二乘原理可以计算出相机的内外部参数[5]。有了准确的单应性矩阵 h 才能进一步计算相机的内外部参数。

2 影响标定精度的因素分析

2.1 标定板的测量误差及特征点的提取对标定精度的影响

对一幅图像上的 i(i=1,2,3,4,…)个特征点有(2)式,从中可以看出,特征点的提取精度和世界坐标的测量精度都会对单应性矩阵的计算造成影响,通常特征点会远远大于 4 个,因此以上方程组不相容,不存在通常意义下的解,通常取最小二乘解。即令

可求得单应性矩阵一个 h。特征点(u,v,0)、标定板上角点世界坐标(x,y,z)都会对计算结果产生直接的影响[6],每一幅图像上特征点的数量将影响到每个单应性矩阵的求解精度。

2.2 图像数量对相机标定精度的影响

在该标定方法中要求每一幅图片都从不同的角度去拍摄,即一幅图片就是一个视场,能唯一确定一个单应性矩阵 h。图片的数量即 h 的数量。在由单应性矩阵求解相机内外参数的过程中,h 的数量同样会影响到标定的精度。不考虑畸变的情况下,相机参数共有 9 个,而一个单应性矩阵仅能确定 8 个自由度,因此标定至少需要 2 幅不同视角的图像。为了获得稳定的数值结果,通常采集的图片数量会远远超过次数。如果采集图像不足,明显会对内部参数计算带来一定的误差,但采集图像过多一方面影响标定的精度,另一方面也会造成误差累积,增加错误概率。因此合适图像数量必须加以考虑。

3 仿真及验证

为了进一步准确分析影响相机标定精度的因素,采用计算机模拟和真实图片相结合的办法对主要因素影响做逐项分析。为此以 vc++6.0 和 opencv 为工具编写了仿真软件和标定程序,以模拟相机的投影过程和实现标定。

3.1 仿真分析

(1)图片数量对标定精度的影响。

实验以特征点的重投影误差为主要的衡量标准。假设模拟相机的内外部参数为(像素): 、。畸 变 系 数,k1=-0.043275,k2=0.031404, 。实验中通过设置相同的相机内部参数和多组(40 组)不同的外部参数,投影生成 40组不同的特征点,也即相当于 40 幅不同的图片。从此 40 组特征点中不同组数进行标定相机的内外部参数,得有效焦距随标定图像数量之间的变化曲线。

可见在不考虑(在仿真实验中没有)特征点提取误差和世界坐标测量误差的时,图片数量为 11-15 时,相机内部各个参数基本保持稳定。纵向有效焦距和横向有效焦距都在 2 个像素内波动,测量值基本接近仿真设定的真实值,误差小于 1‰。

(2)标定板世界坐标精度的影响。

制作标定板时,往往都假设打印的黑白棋盘格是等边长的[7]。但是由于普通打印机不够精确,造成了测量标定板的误差。因此有必要研究世界坐标的测量精确程度对标定造成的影响。在上述实验中产生的 40 组特征点中任取 20 组,做相机内外部参数标定。标定时在世界坐标中加入期望为 0、均方差不同的高斯噪声,噪声均方差水平与总投影误差(单位:像素)的关系如下图。

得到重投影误差和噪声误差之间的变化曲线,如图 2。重投影误差随噪声均方差水平的增大而迅速增大,标定结果对世界坐标非常敏感。为了进一步提高标定精度需要提高平面靶标的测量精度,或提高打印精度。当误差水平小于 1.5%时,重投影误差小于一个像素。当误差水平大于 2%时投影误差则迅速变大。

3.2 实际检验

以理光 grdⅲ型定焦相机为标定对象。该型相机有效像素达 1000 万,最高分辨率 3648×2736。实验所用标定靶标为600×450mm,上有 9 行×13 列黑白棋盘格的平面板。为避免因印刷不准确造成的影响,在实验前已经使用全站仪对各个内角点进行了精确的测量。由于全站仪不能保证严格地以板平面为基准面,因此在测量后又进行了坐标转换,基本保证了所有特征点的 z 向坐标为 0。

(1)内部参数标定。

在标定过程中,从不同角度和不同的深度拍摄了 40 幅图像进行标定。分别得到主点坐标和有效焦距与图片数量之间的变化关系。见图 3 和图 4。

从曲线变化可以看出,在实际的标定过程中,由于特征点提取误差,为保证内部参数标定结果可靠,至多需要 20 幅图片使标定结果基本稳定在 3 个像素内波动,约合 1‰。

(2)外部参数标定。

取实验(1)中计算出的内部参数,进行外部参数标定。标定时使用经全站仪精确测量得的世界坐标。标定时在特征点世界坐标中加入期望为 0、均方差不同的高斯噪声,观察噪声均方差水平与总投影误差的关系是否与仿真分析相一致。可以得到重投影误差对噪声均方差相对变化的曲线。如图 5:

从重投影误差和噪声均方差之间的关系可以看出,仿真实验与真实图片实验的结果相一致。从标定结果来看,重投影误差和噪声均方差之间呈明显的正相关;不加入噪声时,平均投影误差可达 0.5 个像素以下;当噪声均方差小于 1 时,两者成近似线性关系;当噪声均方差大于 1 时,重投影误差则迅速增大。

4 结语

本文通过计算机模拟相机成像过程和标定过程,研究了标定图片数量、特征点世界坐标测量精度、特征点提取精度对摄像机相机标定内外参数的影响。认为相机标定至多使用 20张图片就能够实现高精度标定;使用全站仪测量特征点世界坐标,并且特征点图像坐标提取精度达亚像素下能使相机标定的相对误差达 1%以下。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机光学(十五)——如何提高相机标定的精度 的相关文章

  • vscode配置C环境

    vscode配置C环境 最近感觉基础不太行 xff0c 想重新看下数据结构 xff0c 用c语言重新写一下经典的结构 也不想换编辑器 xff0c 就想用vscode xff0c 刚好github上有一个一键配置c环境的工具 记录一下 配置c
  • 【光线追踪系列一】PPM输出;自定义vec3;光线、简单相机及天空采样

    本次光线追踪系列从基础重新开始 xff0c 主要参照 Ray Tracing in One Weekend xff0c 具体实现代码框架见 https github com RayTracing raytracing github io 本
  • 服务器总线协议_第一章----I2C总线协议入门

    目录 一 概述 二 首先了解一下I2C的I O结构 三 其次了解一下I2C的时序 第一部分 xff1a 起始停止信号简介 第二部分 xff1a I2C的时序部分要求 第三部分 xff1a I2C的一帧数据的格式 四 最终问与答 1 xff0
  • 服务器总线协议_第二章----I2C总线协议进阶

    敬请期待 xff0c 预计8月1日发布 xff0c 需要请加个关注
  • 服务器总线协议_第三章----SVID电源管理协议

    目录 一 概述 二 SVID协议组成方式 三 SVID协议拓扑要求 四 SVID如何判别读写 Master读操作 Master写操作 五 问与答 1 xff09 SVID有没有特殊的要求 xff1f 一 概述 首先先了解一下SVID的全称
  • PM_Sync的作用

    目录 一 先来了解一下PM Sync的全称 xff1a 一 PM Sync简介 PM Sync xff1a Power Management synchronization 同步电源管理 在知道这个信号的作用之前需要先来了解一下 ADR 二
  • si4438使用stm32f103配置调试成功!

    刚拿到si4438时候在网上找了一大波资源 xff0c 发现能使用的并没有多少 xff0c 于是自己配置一发 经过不懈努力配置成功 xff0c 现在将一些配置过程分享给大家 xff01 源码已上传 尽情下载 xff01 1 首先打开工程文件
  • 教你如何使用stm32发送一帧数据(结构体中的数据)

    在这篇文章中我介绍一下如何通过串口发送一帧存在结构体中的数据 通过串口接受一帧数据请参考的我博客中的文章 教你如何使用stm32接收一帧数据 xff01 一 xff1a 在 h首先定义一个结构体 typedef struct uint8 t
  • 浅谈线性稳压电源和开关稳压电源(开关电源)

    目前现有电源主要分为两大类 xff1a 线性稳压电源和开关稳压电源 xff08 开关电源 xff09 线性稳压电源 线性稳压电源经过变压 整流 滤波 稳压实现电源稳压 优点 xff1a 稳定性好 xff0c 瞬态响应速度快 xff0c 可靠
  • c++ #define 用法

    1 用于表示将两个参数连在一起 xff0c 其中宏的 前后空格会被省略 define CONNA a b a b define CONNB a b a b int main string a 61 CONNA 34 one 34 34 tw
  • MySQL第五课 Table has no partition for value

    场景 MySQL由于安全性要求 xff0c 版本升级之后 xff0c 执行插入数据出现Table has no partition for value 错误 已有版本5 7 20 log升级到5 7 26 log 说明 建表过程中 xff0
  • DSP数据安全平台

    数据安全平台 xff08 DSP xff0c Data Security Platforms xff09 的概念来源于Gartner的 2021数据安全技术成熟度曲线 xff0c DSP定义为以数据安全为中心的产品和服务 xff0c 旨在跨
  • c++ 数学库

    链接 link
  • vscode使用restClient实现各种http请求

    vscode使用restClient实现各种http请求 一 xff0c 安装插件 首先 xff0c 我们要在vscode的扩展中 xff0c 搜索rest Client xff0c 然后安装它 xff0c 这里我已经安装过了 安装后 xf
  • K210和STM32串口通信(亲测有效)

    声明 最近想做一个K210数字识别和寻迹 xff0c 方便完成2021年电赛F题 xff0c 完成了数字训练和脱机运行就想赶紧进行一次通信 xff0c 调了好几天 郁闷 xff0b 自闭几天 按照官方的历程看 xff0c 配置的没问题但是会
  • 简单Rabbitmq 发送消息和接收消息

    简单Rabbitmq 发送消息和接收消息 1 先在Rabbitmq配置文件中预先创建好交换器 xff0c 队列 xff0c 路由等信息 2 创建生产者发送消息 64 Autowired private RabbitTemplate rabb
  • Elasticsearch(ES6)------(4) ES设置用户名密码访问

    Elasticsearch ES xff08 1 xff09 下载 安装 43 kibana 下载 xff08 2 xff09 本机多节点启动 43 ElasticSearch head插件使用 xff08 3 xff09 索引 文档概念和
  • Elasticsearch(ES6) --根据条件修改字段值

    POST index name doc update by query 34 query 34 34 match 34 34 version 34 34 12 22 34 34 script 34 34 inline 34 34 ctx s
  • redis限流使用lua脚本

    lua脚本 xff0c 计数器限流 5秒内限流10次 64 param key 64 return public boolean acquire String key long now 61 System currentTimeMillis
  • ES6分页from+size、search_after两种查询

    1 from 43 size 分页查询 64 RequestMapping value 61 34 get 34 method 61 RequestMethod GET public BaseResponse lt List lt Obje

随机推荐

  • 使用activiti总结--bpmn画流程图

    假期结束 xff0c 赶紧总结一下前几天使用的Activiti工作流的一些方法 简单介绍一下Activiti Activiti一套完整的方便的业务流程管理 xff08 BPM xff09 框架 xff0c 它是覆盖了业务流程管理 工作流 服
  • clock函数 使用以及问题

    使用 clock 函数是一个计算程序运行时间 xff08 其实简略的理解为占用CPU的使用时间 xff09 其实如果使用sleep函数 xff0c 程序是放弃CPU的使用权 xff0c 直到某个时间的到来 xff0c 当然就不会存在占用CP
  • 使用activiti总结--发布,办理,查询

    接上一篇文章 xff0c 使用创建好的流程图 xff0c 总结一下activiti发布到查询使用的方法和测试代码 流程图 1 引用配置文件 activiti cfg xml xff0c 不引用或者引用失败的话在创建流引擎的时候会报空指针异常
  • Could not open JDBC Connection for transaction

    操做 xff1a 访问20次数据库没问题 xff0c 超过20次调用后报如下错误 详细报错 xff1a org springframework transaction CannotCreateTransactionException Cou
  • 【可信计算】第八次课:可信软件栈编程开发

    TPM2开源软件包 目前在github上TPM2开源软件一共包含六个项目tpm2 tools tpm2 tss tpm2 pkcs11 tpm2 tss engine tpm2 abrmd tpm2 totp 1 tpm2 tools 这一
  • 国赛----可见光室内定位

    初期试探 拿到题目后 xff0c 反复读了题目 首先队内结合网上资料形成了两种方案 xff0c 原理相同就是利用光信号到达的强度来定位 两者差距在于算法不同而已 xff0c 一种利用计算得出位置 xff0c 另一种就是经过测量得到一种位置与
  • 各种Arduino外部中断程序

    一 中断 Interrupt 的基本概念 中断 xff08 Interrupt xff09 是计算机的一个重要概念 xff0c 现代计算机普遍采用中断技术 什么是中断呢 xff1f CPU执行时原本是按程序指令一条一条向下顺序执行的 但如果
  • PX4通过参数脚本给飞控导入参数

    PX4通过参数脚本给飞控导入参数 先找一架正常能飞的无人机连接地面站 在参数页面右上角点击工具 gt 保存到文件 保存的时候文件名注明参数的相关信息 然后将需要加载参数的无人机连接至地面站 xff0c 注意需要加载参数的无人机必须和保存的参
  • 深蓝 运动规划

    文章目录 CH1 Introduction一 Motion Planning 概念二 Front end xff1a Path finding1 Search based methods2 Sampling based methods3 K
  • 接收机/DTU 安装调试 读取gps数据

    文章目录 一 整体连接图二 DTU配置三 接收机设置 在这里记录一下 xff0c 实验室平台上 xff0c 安装gps接收机和配置的一些步骤 一 整体连接图 二 DTU配置 首先 DTU 需要通过 COM 口和电脑端连接 xff0c 注意这
  • OOQP 安装和使用

    OOQP 安装和使用 1 安装2 使用 1 安装 需要先安装 blas 和 ma27 BLAS xff1a span class token builtin class name cd span my lib span class toke
  • 系统指标

    目录 1 cpu xxx 1 1 cpu空闲率cpu idle cpu idle表示除硬盘IO等待时间以外其它等待时间 xff0c 这个值越大 xff0c 表示cpu越空闲 xff0c 还可以执行更多的任务 xff0c 反之亦然 xff0c
  • stm32 MPU6050 6轴姿态传感器的介绍与DMP的应用

    最近应用到三轴姿态传感器 xff0c 因为之前有MPU6050 xff08 6轴传感器 xff0c 这是6轴的 xff09 xff0c 进行搭配使用 xff0c 通过三轴姿态传感器进行舵机的角度调整 内容来源学习正点原子的教程 xff09
  • 室内外融合北斗+uwb终端数据监听和发送控制方法

    UDP接收GNGGA报文同时转发UDP报文的方法 span class token keyword package span span class token class name Frame span span class token p
  • Ubuntu使用终端命令安装谷歌Chrome浏览器

    使用命令行安装谷歌浏览器稳定版 span class token function sudo span span class token function wget span http www linuxidc com files repo
  • 无人机PX4使用动捕系统mocap的位置实现控制+MAVROS

    动捕系统Optitrack xff0c 有很高的定位精度 xff0c 能够给无人机提供比较精确的位置信息 xff0c 因此如果实验室有条件 xff0c 都可以买一套动捕系统 动捕系统的原理 xff1a 光学式动作捕捉依靠一整套精密而复杂的光
  • Optitrack使用ros完成实时接收刚体的位置与四元数信息

    1 Opitrack系统标定 工作环境 xff1a 运行Motive的Windows主机 和一台安装有ROS的ubuntu电脑 标定步骤 1 准备 优化捕获设置 xff1b 2 在相机预览窗口 xff08 Camera Preview xf
  • RoboMaster机甲大师比赛入门?我们从STM32开始!

    同步博客地址 xff1a 从STM32开始的RoboMaster生活 xff1a 入门篇 项目 amp 教程仓库 xff1a STM32 RoboMaster 1 0 STM32是什么 1 1 定义 ST 43 M 43 32 61 STM
  • C++头文件定义类的方法

    新手在写C 43 43 程序定义类的时候 xff0c 可能会犯一个错误 xff0c 就是在main函数文件里定义很多类 xff0c 一个文件中包含很多函数 xff0c 这样程序看起来很冗杂 今天总结一下如何在C 43 43 中使用头文件来定
  • 相机光学(十五)——如何提高相机标定的精度

    为了提高单目相机标定的精度 xff0c 认真看了张正友标定法的原文 xff0c 并且学习过网上一些牛人的方法 xff0c 但是大部分时候说的很笼统 xff0c 自己把这些经验总结起来并都测试了一下 xff0c 感觉靠谱的结论列出如下 xff