相机标定:关键点法 vs 直接法

2023-05-16

相机标定中最常见的方法是关键点法,比如 OpenCV 和 MatLab 中使用棋盘格、圆阵列等二维图案进行标定,这上面的棋盘格角点和圆心就是所谓的关键点。虽然关键点法有很多优点,但在某些情况下容易遇到标定数据不够的情况,因此便有了基于光度误差的直接法相机标定。本文介绍了关键点法和直接法的大致原理和优缺点。

关键点法原理

关键点法计算相机参数的原理简单来说就是最小化重投影误差。

相机成像过程可以表示为:
u = π ( T ( x ) ) \bold{u} = \pi\bigl(T(\bold{x})\bigr) u=π(T(x))
其中 x = [ x   y   z ] T \bold{x}=[x\ y\ z]^T x=[x y z]T 为世界坐标系下的三维点坐标, u = [ u   v ] T \bold{u}=[u\ v]^T u=[u v]T 为图像上的二维点坐标。

T ( ) T() T() 为三维刚体变换,即旋转平移,包含 6 个自由度,优化过程中一般用旋转向量/四元数+平移向量来表示,其作用是将三位坐标从世界坐标系转换到相机坐标系下。在关键点法中,世界坐标系建立在标定板平面上,所以这里的旋转平移也可以理解为标定板在相机坐标系下的位姿,即外参。

π ( ) \pi() π() 为相机投影函数,可以拆分为针孔投影 P ( ) P() P() 和畸变 D ( ) D() D() 两个过程: π ( x ′ ) = D ( P ( x ′ ) ) \pi(\bold{x}') = D\bigl( P(\bold{x}') \bigr) π(x)=D(P(x)),参数有焦距 ( f x , f y f_x, f_y fx,fy)、主点 ( c x , c y c_x, c_y cx,cy) 和畸变参数 (与畸变模型相关),统称相机内参。

内外参可以通过一些算法或者先验信息获得初始估计,而标定板上的关键点三维坐标是已知的,投影到图像上与提取到的关键点实际图像坐标 ( u ′ u' u) 作差,可以构建优化问题:
arg min ⁡ { 1 2 ∑ [ π ( T ( x ) ) − u ′ ] 2 } \argmin \Bigl\{\dfrac{1}{2}\sum{\Big[ \pi\bigl(T(\bold{x})\bigr) - u' \Bigr]^2}\Bigr\} argmin{21[π(T(x))u]2}
通过非线性优化即可得到精确的内外参。

优点:关键点法模型较为简单,计算也相对简单、快速。特制的标定板图案能够非常容易地进行关键点提取和解码 (识别每个关键点的唯一 ID)。关键点的提取通常不容易受光照、噪声等因素影响。

缺点:关键点本身是一种稀疏特征,浪费了一些有用的图像信息。比如棋盘格标定板图像中,有用的其实不只有角点,方格的每条边都有很强的梯度信息能够用于标定,但它们在关键点法中被忽略了。因此关键点法的图像信息利用率较低,往往需要通过大量采图来弥补。

直接法原理

直接法这个词来源于 SLAM (基于直接法的前端跟踪),原理与光流比较相近,即最小化光度误差。

记前述相机成像过程为 u = L ( x ) = π ( T ( x ) ) \bold{u} = L(\bold{x}) = \pi\bigl(T(\bold{x})\bigr) u=L(x)=π(T(x))。显然当 x \bold{x} x 存在 z = 0 z=0 z=0 的约束时, L ( ) L() L() 是可逆的,记为 x = L − 1 ( u ) \bold{x} = L^{-1}(\bold{u}) x=L1(u)。也就是说,已知内外参的情况下,图像上的任意点可以找到其在标定板上的坐标。而标定板图案是已知的,可以表示为: v x = I b ( x ) v_x = I_b(\bold{x}) vx=Ib(x),即给定其上任意点坐标可以得到具体像素值。因此我们可以得到图像上每个点“应该”的像素值:
v u = I b ( L − 1 ( u ) ) v_u = I_b(\bold{L^{-1}(\bold{u})}) vu=Ib(L1(u))
基于上式能够仿真标定图像,而在直接法标定中则可以与实际像素值 ( v u ′ v_u' vu) 作差 (即光度误差),构建优化问题:
arg min ⁡ { 1 2 ∑ [ v u − v u ′ ] 2 } \argmin \Bigl\{\dfrac{1}{2}\sum{\Big[ v_u - v_u' \Bigr]^2}\Bigr\} argmin{21[vuvu]2}
理论上图像上每个点都能提供光度误差信息 (不考虑标定板未覆盖的区域),但实际上灰度梯度较小的点对优化问题求解基本没有贡献,反倒平白增加计算量。因此可以先对标定图像做梯度分析 (Sobel),只将梯度较大的点和它们附近的点加入到优化问题求解中。

优点:直接法能够充分使用图像像素信息,提高图像利用效率,从而降低标定图像采集量的要求。另外,通过合理地建模,直接法还可以解算相机曝光的相关参数 (曝光时间、卷帘曝光的行延迟等)。

缺点:由于常见的畸变模型 (Brown、KB) 的逆运算没有解析解,去畸变过程 ( L − 1 ( ) L^{-1}() L1() 函数的一部分) 需要迭代计算,而且每张图中的残差数量远大于特征点法,导致直接法标定速度很慢。另一方面,如果在简化的直接法模型中不考虑曝光参数,光度误差会受到亮度值偏差和光照不均匀的影响,不过这个问题可以通过图像亮度匹配和亮度均匀化算法解决。

参考资料:

  1. Rehder, Joern, Janosch Nikolic, Thomas Schneider, and Roland Siegwart. “A Direct Formulation for Camera Calibration,” n.d., 8.
  2. Hannemose, Morten, Jakob Wilm, and Jeppe R. Frisvad. “Superaccurate Camera Calibration via Inverse Rendering.” In Modeling Aspects in Optical Metrology VII, edited by Bernd Bodermann, Karsten Frenner, and Richard M. Silver, 40. Munich, Germany: SPIE, 2019. https://doi.org/10.1117/12.2531769.
  3. Usenko, Vladyslav, Nikolaus Demmel, and Daniel Cremers. “The Double Sphere Camera Model.” In 2018 International Conference on 3D Vision (3DV), 552–60. Verona: IEEE, 2018. https://doi.org/10.1109/3DV.2018.00069.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机标定:关键点法 vs 直接法 的相关文章

  • 加密

    lt div id 61 34 article content 34 class 61 34 article content clearfix csdn tracking statistics 34 data pid 61 34 blog
  • 国内代码托管平台Gitee(码云)的入门使用

    网址在这 gt gt gt 码云官网地址 中文代码托管平台 xff0c 英文不好的话 xff0c 使用github一定的障碍 xff0c 所有gitee是很好的选择 文章目录 一 新建仓库二 AndroidStudio使用码云 xff08
  • Docker

    1 环境准备 官方网址 xff1a https docs docker com engine install centos CentOS 7 虚拟机 环境查看 root 64 localhost cat etc centos release
  • Idea kafka 远程 debug

    1 kafka kafka run class sh 修改 xff0c 总共两处需要修改 xff1a mhbtest 64 localhost kafka 2 11 1 0 1 vim bin kafka run class sh if l
  • 高质量嵌入式Linux C编程 .pdf

    http 链接 xff1a https pan baidu com s 10MjISMt0nNeVWo3L 8VCaQ 提取码 xff1a mxhh
  • 来到CSDN

    刚到CSDN 的时候写过一篇关于来到CSDN 的博客 感觉表达不够清楚在此修改一下 写博客是进入提高班后老师要求的 xff0c 至于老师为什么让我们写博客大家可以看这里 博客是需要用心经营的 开始的时候一直在网易上写 xff0c 后来发现网
  • 【毕设调试一】WiFi模块esp8266的调试

    硬件说明 xff1a span style color fe2c24 strong 提示 xff1a strong span span style color 0d0016 主控芯片STM32F103C8T6 xff0c 与WiFi通信串口
  • ubuntu系统下用kazam软件录制的视频不能在windows系统下播放的解决方案

    ubuntu系统下用kazam软件录制的视频不能在windows系统下播放的解决方案 参考文章 xff1a xff08 1 xff09 ubuntu系统下用kazam软件录制的视频不能在windows系统下播放的解决方案 xff08 2 x
  • Huawei LiteOS与freeRTOS、Ucos主流嵌入式操作内核的区别

    LiteOS与freeRTOS Ucos主流嵌入式操作内核的区别 云社区 华为云
  • ROS串口读取16进制的数据

    include lt ros ros h gt 必备 include lt serial serial h gt ROS已经内置了的串口包 include lt iostream gt 输入输出库 int main int argc cha
  • Linux C语言 串口与网络的数据透传/串口服务器

    Linux下C语言 串口与网络的数据透传 已经有开源的软件ser2net 实现了类似的功能 而且更加强大 支持telnet配置参数 而且越来越大 下载源码看了 实现比较复杂 网络上也有许多类似的 但最终还是决定自己写一个 网口采用TCP通信
  • 【国产板切换到sd启动步骤】

    7 Jetson Nano正常启动后 xff0c 确认SD卡是否被识别 xff1a span class token function sudo span span class token function ls span dev mmcb
  • 如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据?

    如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据 xff1f 1 业务背景 在数据架构上 xff0c 很多大数据项目 xff0c 都会将 HIVE SPARK 等离线计算引擎计算获得的结果数据同步到下游业务
  • 【systemd】关于systemd中的 $MAINPID

    MAINPID is a systemd variable for your service that points to the PID of the main application MAINPID是服务的systemd变量 xff0c
  • 【docker】如何拉取特定版本的镜像

    CentOS镜像 docker pull centos centos6 docker pull centos centos7 默认会拉取centos6 centos7 最新版本的镜像 如果你想拉取指定版本的镜像怎么办 xff1f 看Cent
  • 测试分析报告

    测试分析报告 1 引言 1 1 1 编写目的 1 1 2 背景 1 1 3 定义 2 1 4 参考资料 2 2 测试概要 2 3 测试结果及发现 3 3 1 测试 1 xff08 normal xff09 3 3 2 测试 2 xff08
  • 【Docker&ARM】ARM架构服务器上docker的安装

    使用官方仓库安装 Install using the repository https docs docker com install linux docker ce centos 不同Linux发行版 xff0c 添加相应的仓库即可安装
  • 【字符集】解决docker 容器中中文乱码问题

    一个后端服务容器中解压zip包 xff0c 释放出带文件名带中文的文件 xff0c 中文显示被 代替 xff0c 初步推断是服务基础镜像系统字符集出现问题 进入容器中端界面 xff0c 手动创建带中文的文件 xff0c 果不其然 xff0c
  • 【bash】关于shell中 bash -c 执行命令或者可执行文件

    我们知道 c 的意思是 command xff0c 所以 bash c 后面应该跟一个 command 用法 xff1a bash c cmd string 通常使用shell去运行脚本 xff0c 两种方法 bash xxx sh xff
  • 【fiddler】用fiddler实现android手机抓包

    一 fiddler的简介 fiddler是位于客户端和服务器端之间的代理 xff0c 也是目前最常用的抓包工具之一 它能够记录客户端和服务器之间的所有 请求 xff0c 可以针对特定的请求 xff0c 分析请求数据 设置断点 调试web应用

随机推荐

  • 【HttpCanary】Android网络分析工具HttpCanary使用教程

    黑科技HttpCanary xff0c 最强大的Android网络分析工具 https juejin cn post 6844903745562607624 HttpCannary 抓包视频教程 https space bilibili c
  • 【kafka】Kafka 可视化工具Kafka Eagle安装和使用

    一 背景 Kafka产线环境需要管理的Topic和Consumser越来越多 xff0c 使用命令行工具进行管理会非常繁杂 因此 xff0c 大数据平台上需要一套Kafka的管理监控系统 xff0c Kafka Eagle Kafka Ea
  • 【history】如何丝滑地记录Linxu命令行操作历史?

    对于运维来讲 xff0c history命令应该说是用到最多的了 xff0c 尤其是一些老旧的系统 xff0c 一些历史命令更多时候 xff0c 相当于是运维手册 xff0c 但是history命令有时候也有很多不方便的地方 今天介绍一种方
  • 【CPU】如何正确理解 CPU 使用率和平均负载的关系?

    什么是 CPU 使用率 xff1f CPU 使用率就是 CPU 非空闲态运行的时间占比 xff0c 它反映了 CPU 的繁忙程度 比如 xff0c 单核 CPU 1s 内非空闲态运行时间为 0 8s xff0c 那么它的 CPU 使用率就是
  • 【分布式】日志技术

    日志技术是宕机恢复的主要技术之一 日志技术最初使用在数据库系统中 严格来说日志技术不是一种分布式系统的技术 xff0c 但在分布式系统的实践中 xff0c 却广泛使用了日志技术做宕机恢复 xff0c 甚 至如BigTable 等系统将日志保
  • 【故障诊断】【git】git只能下载一个分支,怎么办?

    很多朋友可能都会遇到一个问题 xff0c 就是远程的git明明有两个分支 xff0c 但是却只能下载一个 xff0c 这样该怎么处理呢 xff1f 首先要澄清 xff0c git clone确实只能下载一个分支 xff0c 我们只能先把ma
  • 23种设计模式

    目录 创建型 1 Factory Method xff08 工厂方法 xff09 2 Abstract Factory xff08 抽象工厂 xff09 3 Builder xff08 建造者 xff09 4 Prototype xff08
  • Docker的asp.net core应用部署系列目录(完结)

    第一章 实验基础环境 本系列将用VirtualBox虚拟机安装ubuntu desktop 18 版本进行演示 xff0c 安装方式自行探索 xff0c 亦可购买各种云的linux服务器 章节间多少有依赖 xff0c 请根据自身情况跳过熟悉
  • Docker的asp.net core应用部署系列—— docker运行asp.net core应用镜像

    本系列目录请看这里 https blog csdn net michel4liu article details 80819510 我们接着上篇 xff0c 已经编译好镜像 xff0c 本篇将介绍两种启动方式 xff0c 交互模式启动和后台
  • Docker的asp.net core应用部署系列——进入正在运行的docker容器里面

    本系列目录请看这里 https blog csdn net michel4liu article details 80819510 我们之前已经可以通过交互或后台方式启动一个容器 xff0c 有时我们需要进入docker里面看一些log或者
  • DATAX:MongoDB增量数据写入到mysql中

    项目场景 xff1a 简述 xff1a 使用DATAX进行Mongo的数据抽取 xff0c 然后写入到mysql中 xff0c 其中会牵涉到全量数据的写入和增量数据的写入 全量 数据的写入我们只需要正常写JSON模板即可 xff0c 使用c
  • 无人机自动驾驶软件系列 E04

    无人机自动驾驶软件系列 E04 xff1a 深度估计 xff0c 八叉树地图以及路径规划 详细配置https gaas gitbook io guide software realization build your own autonom
  • Window11安装如何跳过TPM2.0这一步

    最近想体验一把window11 xff0c 怎奈自己的电脑太老了 xff0c 显示不能安装 xff0c 网上大佬们都说是tpm2 0的问题 xff0c 顺着这个角度 xff0c 找到了一个国外大神的解决办法 1 在出现 Win11 会提示
  • 修改已运行Docker容器的端口映射

    方法一 删除容器 xff0c 重新新建容器多加一个 p端口映射即可 方法二 修改容器配置文件 重启docker服务 模拟创建运行中的容器 span class token punctuation span root 64 redmine t
  • e指数函数

    使用win自带的计算器 xff0c 进行以e为底的指数函数进行运算时 xff0c 发现计算器上的EXP键只能用做表示10的多少次方 xff0c 如5e3 xff0c 指的是5乘以10的3次方 xff0c 及5000 查了一下 xff0c 也
  • xsens惯导在ROS下输出汇总

    rostopic list 分别记录下每个对应的信息 xff1a 1 rostopic echo diagnostics header seq 454 stamp secs 1572609754 nsecs 307622909 frame
  • c 编程中extern关键字 使用跨文件全局变量

    我们知道 xff0c 程序的编译单位是源程序文件 xff0c 一个源文件可以包含一个或若干个函数 在函数内定义的变量是局部变量 xff0c 而在函数之外定义的变量则称为外部变量 xff0c 外部变量也就是我们所讲的全局变量 它的存储方式为静
  • 年度回忆录(?——2011.01)

    这是在CSDN 上的第一篇总结 xff08 或者说是回忆录 xff09 xff0c 个人认为 xff1a 总结 xff0c 尤其是年度总结是十分必要的 她可以很好的映射出自己以往的不足 xff0c 并为自己下一步的学习指明方向 以前在网易上
  • 使用JMF实现java写自己的视频播放器

    JMF这个多媒体开发框架太牛了 xff0c 简单的几句代码就能实现一个视频播放器的开发 xff0c 厉害 xff0c 就是支持的格式少了一些 xff0c 没关系 xff0c 这个视频播放器可以播放mpg xff0c avi fvl等等 xf
  • 相机标定:关键点法 vs 直接法

    相机标定中最常见的方法是关键点法 xff0c 比如 OpenCV 和 MatLab 中使用棋盘格 圆阵列等二维图案进行标定 xff0c 这上面的棋盘格角点和圆心就是所谓的关键点 虽然关键点法有很多优点 xff0c 但在某些情况下容易遇到标定