机器视觉-相机标定及畸变矫正

2023-05-16

摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R、T、K、D中包含相机的5个内参,6个外参。然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数。相机的标定是从空间点及其对应的像素点,获得相机的位置信息和内部参数信息的过程,16个相机参数的总结为此提供了模型基础。最后通过这16个参数建立的模型对失真的图片进行矫正。

1 相机线性模型

摄像机的线性模型是在理想情况下的成像模型,即光学中的中心投影,我们通常也称为针孔模型

1.1 针孔相机模型

在介绍摄像机标定参数之前,需要先简单说一下针孔摄像机的原理。投影平面到小孔的距离为焦距f,物体到小孔的距离为Z,其中物体和投影是倒立相似的关系,下图为针孔摄像机的投影示意 。

如果按照实际的投影关系建立坐标系,那么投影坐标和物体坐标的符号总是相反的,考虑起来不太方便,于是在“数学上”把投影平面平移到其关于小孔对称的位置,这样投影坐标和物体坐标符号就相同了,示意图如下:

根据三角形相似的原理,可以列出如下等式:

\frac{f}{Z}=\frac{l_{ty}}{l_{wt}}

1.2 相机中的坐标系

在视觉测量中,需要进行的一个重要预备工作是定义四个坐标系的意义,即世界坐标系摄像机坐标系 、 图像坐标系像素坐标系  。

  • {world},{camera},{picture}和{pixel}坐标系的坐标用下标来区分,分别是W,c,p,pix
  • {world},{camera},{picture}坐标系单位为长度,一般为mm;{pixel}坐标系单位为像素,一般为pix
  • {world}坐标系为世界坐标系,可以任意指定,其他坐标系都有明确的定义
  • {camera}坐标系为摄像机坐标系,原点在小孔的位置,z轴与光轴重合,Xc轴和Yc轴分别和投影面两边平行
  • {picture}坐标系为图像坐标系,光轴和投影面的交点为原点,Xp轴和Yp轴分别和投影面两边平行
  • {pixel}坐标系为像素坐标系,从小孔向投影面方向看,投影面的左上角为原点Opix,uv轴和投影面两边重合

1.3 各个坐标系的坐标转换

1.3.1 {world}到{camera}

设某点在{world}坐标系中的坐标为P_{W}=\left [ x_{W},y_{W},z_{W}, \right ]^{T},该点在{camera}坐标系中的坐标为P_{c}=\left [ x_{c},y_{c},z_{c}, \right ]^{T},则有

                                                                                        P_{c}=\begin{vmatrix} R& T\\ 0& 1 \end{vmatrix} P_{W}                                        

其中R是正交旋转矩阵:

                                                                                   R=\begin{vmatrix} r_{11} &r_{12} &r_{13} \\ r_{21} &r_{22} &r_{23} \\ r_{31} &r_{32} &r_{33} \end{vmatrix}                                          

T是平移矩阵:

                                                                                     T=\left [ t_{x},t_{y},t_{z}, \right ]^{T}                                               

确定R需要3个参数,确定T需要3个参数,共需6个参数,这6个参数称为摄像机的外部参数。(在单目相机中外参没有多少意义。只有在双目相机中,以另一个摄像头为坐标系,得出的相对另一个摄像头的旋转和平移矩阵才有实际意义)

1.3.2 {camera}到{picture}

设空间点X_{c}在{camera}下:P_{c}=\left [ x_{c},y_{c},z_{c},1 \right ]^{T},其像点X_{p}在{picture}的齐次坐标为P_{p}=\left [ x_{p},y_{p},1 \right ]^{T},由图中相似三角形可得,

                                                                                       \left\{\begin{matrix} x_{p}=f\tfrac{x_{c}}{z_{c}}\\ y_{p}=f\tfrac{y_{c}}{z_{c}} \end{matrix}\right.                                                 

写成矩阵表示为,

                                                                            z_{c}P_{p}=\begin{bmatrix} f & 0 & 0 & 0\\ 0 & f & 0 &0 \\ 0& 0& 1 & 0 \end{bmatrix}P_{c}                                           

1.3.3 {picture}到{pixel}

s_{x}表示Xpix方向上单位mm的像素数,单位是pix/mm,s_{y}表示Ypix方向上单位mm的像素数,单位是pix/mm,x_{0}y_{0}表示投影平面中心在{pixel}中的坐标,设像素坐标P=\left ( u,v,1 \right )^{T}P = \left ( u,v,1 \right )^{T},则有

                                                                             \left\{\begin{matrix} u=x_{0}+x_{p}\cdot s_{x}\\ v=y_{0}+y_{p}\cdot s_{y}\end{matrix}\right.                                           

写成矩阵形式

                                               P_{pix}=\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}=\begin{bmatrix} s_{x} & 0 &x_{0} \\ 0&s_{y} & y_{0}\\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x_{p}\\ y_{p}\\ 1 \end{bmatrix}=\begin{bmatrix} s_{x} & 0 &x_{0} \\ 0&s_{y} & y_{0}\\ 0 & 0 & 1 \end{bmatrix}P_{p}               

结合{picture}到{image}的变换,则{camera}到{pixel}的变换矩阵K为

                                                      K=\begin{bmatrix} s_{x}&0 &x_{0} \\ 0&s_{y} & y_{0}\\0 & 0& 1\end{bmatrix}\begin{bmatrix} f&0 &0 \\ 0&f &0\\0 & 0& 1\end{bmatrix}=\begin{bmatrix} f_{x}&0 &x_{0} \\ 0&f_{y} & y_{0}\\0 & 0& 1\end{bmatrix}                       

其中,f_{x}=s_{x}ff_{y}=s_{y}f称为相机在u轴和v轴方向上的尺度因子。

小结:f_{x}f_{y}x_{0}y_{0}这4个数叫做摄像机的内部参数,有时把焦距f也当作内部参数。因为这些参数只和摄像机有关系,和具体的摄像场景,和世界坐标系没有关系.f_{x}f_{y}的物理意义是摄像头感光芯片像素点的长宽比例,x_{0}y_{0}的物理意义是摄像头感光芯片安装时与理论中心的水平与垂直偏移量。

1.3.4 {world}到{pixel}

综上,可得:

                                                                      z_{c}\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}=K\cdot \begin{bmatrix} R &T \\ 0 & 1 \end{bmatrix}\begin{bmatrix} x_{w}\\ y_{w}\\ z_{w}\\ 1 \end{bmatrix}                                 

2 相机畸变模型

透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。径向畸变来自于透镜形状,切向畸变来自于整个摄像机的组装过程。畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著。

畸变图示

2.1 径向畸变

顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通廉价的镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:

成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:
                                           

                                                              \left\{\begin{matrix} x_{0}=x\left ( 1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6} \right )\\ y_{0}=y\left ( 1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6} \right ) \end{matrix}\right.

公式里(x_{0}y_{0})是畸变点在成像仪上的原始位置,(xy)是产生畸变后新的位置,下图是距离光心不同距离上的点经过透镜径向畸变后点位的偏移示意图,可以看到,距离光心越远,径向位移越大,表示畸变也越大,在光心附近,几乎没有偏移。

2.2 切向畸变

切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数p1和p2来描述:

                                                              \left\{\begin{matrix} x_{0}=x+\left [ 2p_{1} y+p_{2}\left ( r^{2}+2x^{2} \right )\right ]\\ y_{0}=y+\left [ 2p_{2} x+p_{1}\left ( r^{2}+2y^{2} \right )\right ] \end{matrix}\right.

下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下——右上角的连线是对称的,说明该镜头在垂直于该方向上有一个旋转角度。

小结:单目摄像机透镜畸变校正需要确定的就是k1,k2,k3,p1,p2这5个参数,如果“鱼眼”现象不明显的话,常常使用k1,k2来校正径向畸变。

3,相机畸变矫正

大致流程如下,有待进一步完善

  1. 准备标定图片
  2. 对每一张标定图片,提取角点信息
  3. 对每一张标定图片,进一步提取亚像素角点信息
  4. 在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)
  5. 相机标定
  6. 对标定结果进行评价
  7.  查看标定效果——利用标定结果对棋盘图进行矫正

4,参考链接

机器视觉学习笔记(4)——单目摄像机标定参数说明_moverzp的博客-CSDN博客_单目摄像机
Step1:模型 16个相机参数(内参、外参、畸变参数)_bitdai2018-CSDN博客_相机内参
张正友标定法的真实理解_waeceo的专栏-CSDN博客_张正友标定法优点
镜头畸变矫正_waeceo的专栏-CSDN博客_畸变矫正
透镜畸变及校正模型_牧野的博客-CSDN博客_畸变模型
相机标定(Camera calibration)原理、步骤_aibotlab的博客-CSDN博客_calibration
相机内参的标定方法_IT的搬运工的博客-CSDN博客_相机内参标定
最详细、最完整的相机标定讲解_a083614的专栏-CSDN博客_相机标定方法
镜头畸变现象及其校正方法_满城风絮-CSDN博客_镜头畸变

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

机器视觉-相机标定及畸变矫正 的相关文章

  • 查看网站的技术架构

    想要快速查看网站使用的架构 xff0c 可以在浏览器中添加Wappalyzer插件 以火狐浏览器为例 火狐浏览器 更多工具 61 gt 面向开发者扩展 61 gt 查找Wappalyzer 61 添加 xff0c 即可 红框中即 Wappa
  • Linux服务器查看日志的几种方法

    1 进入日志文件所在的文件目录 xff0c 比如 xff1a cd opt tomcat7 logs 2 通过命令打开日志 xff0c 分析需求场景打开需要的日志 比如 xff1a tail f catalina out 3 常用命令一 x
  • Postman设置网络代理

    1 什么是网络代理 xff1f 在一个基本的网络会话中 xff0c 一个客户端发送一个请求到服务器 xff0c 服务器返回一个响应 xff1b 一个代理服务是一个应用程序或者系统 作为一个中介在你的电脑和互联网之间 客户端和服务器 xff0
  • Postman中的authorization

    1 概述 Authorization是验证是否拥有从服务器访问所需数据的权限 当发送请求时 xff0c 通常必须包含参数 xff0c 以确保请求具有访问和返回所需数据的权限 Postman提供了授权类型 xff0c 可以轻松地在Postma
  • 无法将非静态数据成员声明为 inline

    示例代码 xff1a span class token macro property span class token directive hash span span class token directive keyword inclu
  • C++中类的成员函数(方法)

    文章目录 成员函数 xff08 方法 xff09 示例1 xff1a 在结构体中引入成员函数示例2 xff1a 类示例3 xff1a 类内定义成员函数示例4 xff1a 类内声明 43 类外定义显示内敛的成员函数示例5 xff1a 类内声明
  • visual studio 2019 安装卸载问题

    1 visual studio 2019 安装 问题1 xff1a 如何安装visual studio 2019 企业版 可参考 xff1a http www winwin7 com soft 9019 html xiazai 问题2 xf
  • GDAL图像重采样

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • C#入门基础教程

    文章目录 C 基础入门基本用法 xff08 理解面向对象编程 xff09 示例1 xff1a 创建线类 关键字数据类型数值类型布尔与文本类型引用类型指针类型示例2 xff1a 数值类型示例3 xff1a 文本类型示例4 xff1a Obje
  • 1. 在VS2019上配置PIE.NET-SDK插件式环境(c#)

    1 开发环境部署 确保Win10系统安装Visual Studio2019安装PIESDK Net V6 3 Windows X64 exe 2 创建工程 1 选Windows窗口应用 xff0c 不然后面找不到 Net framwork
  • std::string、const char*、QString之间相互转换

    字符串转换 std string 转 const char std string str 61 34 string 34 const char cstr 61 str c str const char 转 std string span c
  • Cannot convert a symbolic Tensor (simple_rnn/strided_slice:0) to a numpy array. 报错 (解决方法)

    1 报错 问题 xff1a xff08 来自 Python深度学习 P164 165 xff09 在运行以下代码的时候 xff0c 报错 xff1a Cannot convert a symbolic Tensor simple rnn s
  • 图像几何校正

    几何校正中混淆的概念 名词描述几何校正几何畸变会给基于遥感图像的定量分析 变化检测 图像融合 地图测量或更新等处理带来误差 xff08 主要指二维平面坐标 xff09 xff0c 所以需要针对图像的几何畸变进行校正 xff0c 也就是几何校
  • 解决VS2015 安装失败问题,如安装包损坏或丢失

    搜索包路径选择下面这个路径
  • 1.ODBC连接Postgresql

    SQLDriverConnect SQLDriverConnect 是 SQLConnect 的替代方法 它支持需要比 SQLConnect 中的三个参数更多的连接信息的数据源 对话框来提示用户输入所有连接信息 xff0c 以及系统信息中未
  • ImportError: DLL load failed while importing Qsci

    pyqt5报错 xff1b ImportError span class token operator span DLL load failed span class token keyword while span importing Q
  • 关于编译QGIS3.22.12配置的python库

    注意 xff1a 安装了多个python环境的很容易编译出错 xff1b 其中3 22需要配置python3 9的环境 在编译QGIS过程中的报错 报错1 xff1a No module named span class token cha
  • Qt中设置删除提示框

    Qt中设置删除提示框 QMessageBox StandardButton sButton 61 QMessageBox question NULL QObject tr 34 提示 34 QObject tr 34 该数据是否删除 34
  • 你真的对图像格式了解么?

    图像是人类视觉的基础 xff0c 是自然景物的客观反映 xff0c 是人类认识世界和人类本身的重要源泉 图 是物体反射或透射光的分布 xff0c 像 是人的视觉系统所接受的图在人脑中所形成的印象或认识 xff0c 照片 绘画 剪贴画 地图
  • 配置Qt中pro、pri文件

    002helloWorld pro span class token macro property span class token directive hash span span class token directive keywor

随机推荐

  • 构建一个字符串类

    文章目录 1 构建字符串数据 2 创建那些函数给外界调用 1 构造函数以及设计构造函数初值 2 类内带有指针 考虑3个特殊重要函数 3 考虑辅助函数 3 定义具体函数 1 设计构造函数内容
  • PostgreSQL查询

    PostgreSQL 数据库连接 QT xff1a 建立到数据库的连接 QSqlDatabase db 61 QSqlDatabase addDatabase 34 QPSQL 34 db setHostName 34 localhost
  • Conda install 报错:An HTTP error occurred when trying to retrieve this URL. HTTP errors are often...

    1 问题描述 xff1a 准备在Anaconda prompt执行以下命令 xff1a conda install c stellargraph stellargraph 报错 xff1a An HTTP error occurred wh
  • svn原理----revert,回滚

    一 子命令Svn revert 取消所有的本地编辑 下面我们来看一下子命令Svn revert例子 xff1a 丢弃对一个文件的修改 xff1a Svn revert foo c Reverted foo c 如果你希望恢复一整个目录的文件
  • Qt 自定义控件提升,头文件找不到的问题

    Qt 自定义控件提升 xff0c 头文件找不到的问题 在附加包含目录添加 xff1a
  • 分析int(*p)[4] = a

    面试题 xff1a 二级指针 include lt iostream gt int main int a 3 4 61 0 1 2 3 4 5 6 7 8 9 10 11 int p 4 61 a std cout lt lt p 43 1
  • af::convolve在CUDA中局限性

    使用在Cuda出现访问冲突问题 xff08 opengcl正常 xff09 xff1a af convolve I I kernel 报错 xff1a 0x00007FFC6443ADAC af dll 处 位于 XXXX exe 中 引发
  • 2016

    2016 最近 xff0c 许多朋友兴起总结2016了 xff0c 看得我心痒 xff0c 心热 我自己不禁也总结起来了 别人的总结要么是 2016XXXX 要么是 2016OOOO 我苦思2秒 xff0c 却想不起一个标题来 xff0c
  • gdb反汇编disassemble

    GDB Command Reference disassemble command gdb反汇编可用disassemble disass命令 用法如下 xff1a disassemble disassemble Function 指定要反汇
  • S.M.A.R.T. 参数(smartctl)计算硬盘精确健康值

    参考 xff1a Acronis Drive Monitor Disk Health Calculation 文章目录 1 背景2 smartctl a dev sda3 计算健康值3 1 关键参数3 1 1 公式说明3 2 2 计算举例
  • python脚本——通过telnet连接设备

    文章目录 一 说明二 代码三 用法总结 一 说明 通过telnetlib库 xff0c telnet到设备上并做一些测试 包括重启设备 等待重启完成 其它测试操作等 二 代码 span class token comment usr bin
  • lspci 命令详解及常用命令

    文章目录 一 说明二 参数说明三 用法举例 一 说明 lspci是查看设备上pcie设备信息的命令 该命令的不同参数配合 xff0c 在查看pcie设备和定位pcie问题时很有用 包括查看pcie设备中断号 查看配置空间内容 修改配置空间寄
  • 中断模式和polling模式 && 硬件中断和软件中断

    文章目录 一 总结在前二 中断2 1 硬件中断与软件中断2 1 1 对比2 1 2 硬件中断2 1 3 软件中断 三 polling 一 总结在前 S NOInterruptPolling1中断模式下 xff0c 设备通知CPU有业务需要被
  • dma_alloc_coherent 申请内存用法和问题总结

    文章目录 1 dma alloc coherent用法2 问题3 解决方法方法一 xff0c 走CMA空间配置3 1 内核配置 96 96 CONFIG CMA 96 96 3 2 修改cma起始地址3 3 设置cma空间 xff08 大小
  • hadoop之HDFS:通过Java API访问HDFS

    HDFS是一个分布式文件系统 xff0c 可以通过Java API接口对HDFS进行操作 xff0c 下面记录实现Java API的过程和出现的一些问题及解决方案 环境搭建 导入jar包 common包中的jar文件导入 hadoop 2
  • sonic开发——修改内核配置

    参考 xff1a https github com Azure sonic linux kernel sonic 中的内核配置修改不需要编译menuconfig xff0c 而是直接修改 patch kconfig exclusions和p
  • 计算机内存管理之内存访问

    文章目录 一 设备I O内存访问ioremap amp ioremap nocacheioremap cachedioremap wc amp ioremap wtI O内存访问流程 二 设备地址映射到用户空间mmap过程 三 devmem
  • 内存管理之预留内存

    文章目录 一 memblock二 cmdline 有时候 xff0c 我们需要预留一段内存不受内核直接管理分配 xff0c 有什么办法 xff1f 一 memblock mmeblock是内存的一种管理机制 xff0c 主要管理这两种内存
  • 远程工作的一些命令

    文章目录 git配置ssh免密登录sshfs映射远程目录linux远程控制其它主机vscode ssh失败 git配置 git config global user name usrname git config global user e
  • 机器视觉-相机标定及畸变矫正

    摘要 xff1a 本文首先介绍了针孔相机模型 xff08 线性模型 xff09 xff0c 然后推导四个坐标轴变换的关系 xff0c 引出R T K D中包含相机的5个内参 xff0c 6个外参 然后介绍相机畸变的原因以及畸变模型 xff0