计算机视觉——相机标定(Camera Calibration)

文章目录

  • 1. 简介
  • 2. 原理
  • 3. 相机模型
    • 3.1 四大坐标系
    • 3.2 坐标系间的转换关系
      • 3.2.1 世界坐标系到相机坐标系
      • 3.2.2 相机坐标系到图像坐标系
      • 3.2.3 像素坐标系转换为图像坐标系
      • 3.2.4 世界坐标转换为像素坐标
    • 3.3 畸变
      • 3.3.1 畸变类型
        • 3.3.1.1 径向畸变(Radial Distortion)
        • 3.3.1.2 切向畸变(Tangential Distortion)
      • 3.3.2 畸变模型

在进行机器人视觉相关项目的过程中,首先要进行相机标定,此博客记录相机标定的相关原概念及实施方法。

1. 简介

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定。相机标定是非常关键的环节。

  • 进行摄像机标定的目的:求出相机的内、外参数,以及畸变参数。
  • 标定相机后通常是想做两件事:一个是由于每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变矫正畸变,生成矫正后的图像;另一个是根据获得的图像重构三维场景。

2. 原理

相机标定的基本原理是通过已知的三维世界坐标系中的点和对应的二维图像坐标系中的点,建立一个数学模型,将三维世界坐标系中的点投影到二维图像坐标系中。这个数学模型通常包括以下几个部分:

  1. 相机内参矩阵(Intrinsic Matrix):描述相机的内部几何特性,包括焦距、主点坐标等。
  2. 畸变系数(Distortion Coefficients):描述图像畸变,包括径向畸变和切向畸变。
  3. 旋转矩阵和平移向量(Rotation Matrix and Translation Vector):描述相机在世界坐标系中的姿态,也可以叫做外参数。

常用标定步骤:

  1. 准备标定板:使用一个已知尺寸的标定板(如棋盘格),并拍摄多张不同角度和位置的图像。
  2. 检测角点:在每张图像中检测标定板的角点,并记录其二维图像坐标。
  3. 生成世界坐标:根据标定板的尺寸,生成标定板角点的三维世界坐标。
  4. 计算内参和畸变系数:使用检测到的角点和生成的世界坐标,计算相机的内参矩阵和畸变系数。
  5. 计算旋转矩阵和平移向量:计算每张图像的旋转矩阵和平移向量。
  6. 计算重投影误差:将世界坐标系中的点投影到图像坐标系中,并与实际检测到的图像坐标进行比较,计算重投影误差。

常用术语

内参矩阵: Intrinsic Matrix
焦距: Focal Length
主点: Principal Point
角点: Corner Point
径向畸变: Radial Distortion
切向畸变: Tangential Distortion
旋转矩阵: Rotation Matrices
平移向量: Translation Vectors
平均重投影误差: Mean Reprojection Error
重投影误差: Reprojection Errors
重投影点: Reprojected Points

3. 相机模型

3.1 四大坐标系

在这里插入图片描述世界坐标系是一个全局坐标系,用于描述物体在真实世界中的位置。世界坐标系用 (X_w, Y_w, Z_w) 表示,独立于相机,可以任意选择原点和坐标轴的方向。

**相机坐标系 (Camera Coordinate System)**以相机的光学中心为原点, Z Z Z轴指向相机的正前方, X X X轴和 Y Y Y轴分别指向相机的右侧和下方,用于描述物体在相机视角下的位置。通常,相机坐标系用 ( X c , Y c , Z c ) (X_c, Y_c, Z_c) (Xc,Yc,Zc) 表示。

**图像坐标系 (Image Coordinate System)**是二维坐标系,用于描述物体在相机成像平面上的投影位置。通常,图像坐标系用 ( x , y ) (x, y) (x,y)表示,图像坐标系的原点通常位于成像平面的中心, x x x轴和 y y y轴分别指向图像的右侧和下方。

**像素坐标系 (Pixel Coordinate System)**是二维坐标系,用于描述物体在数字图像中的像素位置。通常,像素坐标系用 ( u , v ) (u, v) (u,v) 表示,即列数和行数。像素坐标系的原点通常位于图像的左上角, u u u轴和 v v v轴分别指向图像的右侧和下方。

3.2 坐标系间的转换关系

3.2.1 世界坐标系到相机坐标系

世界坐标系到相机坐标系的转换通常通过一个刚体变换(旋转和平移)来实现。这个变换可以用一个4x4的变换矩阵 T w c T_{wc} Twc 表示,包含旋转矩阵 R R R和平移向量 t t t

[ X c Y c Z c 1 ] = T w c [ X w Y w Z w 1 ] = [ R t 0 1 ] [ X w Y w Z w 1 ] \begin{bmatrix}X_c\\Y_c\\Z_c\\1\end{bmatrix}=T_{wc}\begin{bmatrix}X_w\\Y_w\\Z_w\\1\end{bmatrix}=\begin{bmatrix}R&t\\0&1\end{bmatrix}\begin{bmatrix}X_w\\Y_w\\Z_w\\1\end{bmatrix} XcYcZc1 =Twc XwYwZw1 =[R0t1] XwYwZw1

3.2.2 相机坐标系到图像坐标系

img

相机坐标系到图像坐标系的转换是通过透视投影实现的。假设相机焦距为 f f f,则成像面是与 X c O Y c X_cOY_c XcOYc平面平行且距离为 f f f的平面,在相机坐标系中, p ( x c , y c , z c ) p(x_c,y_c,z_c) p(xc,yc,zc),在图像坐标系中的成像点是 p ′ ( x , y ) p'(x,y) p(x,y)

img

利用相似三角形求得: x x c = y y c = f z c \frac{x}{x_c}=\frac{y}{y_c}=\frac{f}{z_c} xcx=ycy=zcf

x = f z c ⋅ x c x=\frac{f}{z_c}\cdot x_c x=zcfxc, y = f z c ⋅ y c y=\frac{f}{z_c}\cdot y_c y=zcfyc,写为矩阵形式:
[ x y 1 ] = [ f z c 0 0 0 0 f z c 0 0 0 0 1 z c 0 ] ⋅ [ x c y c z c 1 ] \begin{bmatrix}x\\y\\1\end{bmatrix}=\begin{bmatrix}\frac{f}{z_c}&0&0&0\\0&\frac{f}{z_c}&0&0\\0&0&\frac{1}{z_c}&0\end{bmatrix} \cdot \begin{bmatrix}x_c\\y_c\\z_c\\1\end{bmatrix} xy1 = zcf000zcf000zc1000 xcyczc1
也可以写作:
z c ⋅ [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] ⋅ [ x c y c z c 1 ] z_c \cdot \begin{bmatrix}x\\y\\1\end{bmatrix}=\begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0\end{bmatrix} \cdot \begin{bmatrix}x_c\\y_c\\z_c\\1\end{bmatrix} zc xy1 = f000f0001000 xcyczc1

3.2.3 像素坐标系转换为图像坐标系

在这里插入图片描述像素坐标系uov是一个二维直角坐标系,反映了相机CCD/CMOS芯片中像素的排列情况。原点o位于图像的左上角,u轴、v轴分别于像面的两边平行。像素坐标系中坐标轴的单位是像素(整数)

像素坐标系不利于坐标变换,因此需要建立图像坐标系XOY其坐标轴的单位通常为毫米(mm),原点是相机光轴与相面的交点(称为主点),即图像的中心点,X轴、Y轴分别与u轴、v轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。
在这里插入图片描述其中, d x dx dx d y dy dy分别为像素在 x x x y y y轴方向上的物理尺寸, u 0 u_0 u0, v 0 v_0 v0为主点(图像坐标系原点)坐标。

3.2.4 世界坐标转换为像素坐标

在这里插入图片描述

3.3 畸变

3.3.1 畸变类型

在这里插入图片描述

3.3.1.1 径向畸变(Radial Distortion)

径向畸变是由于镜头的形状引起的,通常表现为图像中心区域的放大或缩小。径向畸变可以进一步分为两种类型:

  • 桶形畸变(Barrel Distortion):图像向外凸起,类似于桶的形状。
  • 枕形畸变(Pincushion Distortion):图像向内凹陷,类似于枕头的形状。

x corrected = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y corrected = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{\text{corrected}} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6)\\ y_{\text{corrected}} = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) xcorrected=x(1+k1r2+k2r4+k3r6)ycorrected=y(1+k1r2+k2r4+k3r6)
其中:

  • ( x , y ) (x, y) (x,y) 是畸变前的像素坐标。
  • ( x corrected , y corrected ) (x_{\text{corrected}}, y_{\text{corrected}}) (xcorrected,ycorrected) 是畸变校正后的像素坐标。
  • r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2 是像素点到图像中心的距离的平方。
  • k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3 是径向畸变系数。
3.3.1.2 切向畸变(Tangential Distortion)

切向畸变是由于镜头和成像平面不完全平行引起的。这种畸变会导致图像中的某些区域相对于其他区域发生偏移。切向畸变可以用以下公式描述:

x corrected = x + [ 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] y corrected = y + [ p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ] x_{\text{corrected}} = x + [2p_1 xy + p_2(r^2 + 2x^2)] \\ y_{\text{corrected}} = y + [p_1(r^2 + 2y^2) + 2p_2 xy] xcorrected=x+[2p1xy+p2(r2+2x2)]ycorrected=y+[p1(r2+2y2)+2p2xy]

其中, p 1 , p 2 p_1, p_2 p1,p2 是切向畸变系数。

3.3.2 畸变模型

综合径向畸变和切向畸变,完整的畸变模型可以表示为:
x corrected = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] y corrected = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ] x_{\text{corrected}} = x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + [2p_1 xy + p_2(r^2 + 2x^2)] \\ y_{\text{corrected}} = y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + [p_1(r^2 + 2y^2) + 2p_2 xy] xcorrected=x(1+k1r2+k2r4+k3r6)+[2p1xy+p2(r2+2x2)]ycorrected=y(1+k1r2+k2r4+k3r6)+[p1(r2+2y2)+2p2xy]

在相机标定过程中,通过拍摄已知几何形状的标定板(如棋盘格),可以计算出畸变系数 k 1 , k 2 , k 3 , p 1 , p 2 k_1, k_2, k_3, p_1, p_2 k1,k2,k3,p1,p2。然后,利用这些系数对图像进行畸变校正,恢复图像的几何形状。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang内存模型总结1(mspan、mcache、mcentral、mheap)

1.内存模型 1.1 操作系统存储模型 从上到下分别是寄存器、高速缓存、内存、磁盘,其中越往上速度越快,空间越小,价格越高。 关键词是多级模型和动态切换 1.2 虚拟内存与物理内存 虚拟内存是一种内存管理技术,允许计算机使用比…

Qt Quick开发基础+实战(持续更新中…)

最近更新日期:2024/12/4 一、Qt Quick简介 写在前面: 本篇文章虽然只是作为我的学习笔记,但也作为我日后复习之用,所以会认真并详细记录,但会分重点。 1.3 新建Qt Quick Application工程 这节主要讲2个知识点&#x…

elementui table滚动分页加载

文章目录 概要 简化的实现示例&#xff1a; 小结 概要 在使用 Element UI 的 Table 组件时&#xff0c;如果需要实现滚动分页加载的功能&#xff0c;可以通过监听 Table 的滚动事件来动态加载更多数据。 简化的实现示例&#xff1a; <template><el-table ref"…

使用GDI对象绘制UI时需要注意的若干细节问题总结

目录 1、一个bitmap不能同时被选进两个dc中 2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数 3、不能删除已经被选入DC中的GDI对象 4、使用完的GDI对象&#xff0c;要将之释放掉&#xff0c;否则会导致GDI对象泄漏 5、CreateCompatibleBitmap返回错…

基于频谱处理的音频分离方法

基于频谱处理的音频分离方法 在音频处理领域&#xff0c;音频分离是一个重要的任务&#xff0c;尤其是在语音识别、音乐制作和通信等应用中。音频分离的目标是从混合信号中提取出单独的音频源。通过频谱处理进行音频分离是一种有效的方法&#xff0c;本文将介绍其基本原理、公…

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…

【机器学习】—Transformers的扩展应用:从NLP到多领域突破

好久不见&#xff01;喜欢就关注吧~ 云边有个稻草人-CSDN博客 目录 引言 一、Transformer架构解析 &#xff08;一&#xff09;、核心组件 &#xff08;二&#xff09;、架构图 二、领域扩展&#xff1a;从NLP到更多场景 1. 自然语言处理&#xff08;NLP&#xff09; 2…

Linux 文本处理三剑客基本用法

Linux文本处理三剑客 - grep sed awk 1. 基本用法 grep 是一种强大的文本搜索工具&#xff0c;用于在文件中搜索指定的模式&#xff08;通常是字符串或正则表达式&#xff09;&#xff0c;并输出匹配的行。以下是 grep 的一些基本用法&#xff1a; 基本语法 grep [选项] 模式…

解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204

&#x1f6e0;️ 解决 Maven 部署中的 Artifact 覆盖问题&#xff1a;实战经验分享 &#x1f4cc; 引言 在软件开发过程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;是提高开发效率和代码质量的关键手段。Hudson 和 Maven 是两种广泛使用的工具&#xff0…

3DMAX星空图像生成器插件使用方法详解

3DMAX星空图像生成器插件&#xff0c;一键生成星空或夜空的二维图像。它可用于创建天空盒子或空间场景&#xff0c;或作为2D艺术的天空背景。 【主要特点】 -单击即可创建星空图像或夜空。 -星数、亮度、大小、形状等参数。 -支持任何图像大小&#xff08;方形&#xff09;。…

Linux权限机制深度解读:系统安全的第一道防线

文章目录 前言‼️一、Linux权限的概念‼️二、Linux权限管理❕2.1 文件访问者的分类&#xff08;人&#xff09;❕2.2 文件类型和访问权限&#xff08;事物属性&#xff09;✔️1. 文件类型✔️2. 基本权限✔️3. 权限值的表示方法 ❕2.3 文件访问权限的相关设置方法✔️1. ch…

C# 动态类型 Dynamic

文章目录 前言1. 什么是 Dynamic&#xff1f;2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…

Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 电子产品管理 系统管理 数据可视化分析看板展示 摘要 本…

用 NotePad++ 运行 Java 程序

安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…

vxe-table 树形表格序号的使用

vxe-table 树形结构支持多种方式的序号&#xff0c;可以及时带层级的序号&#xff0c;也可以是自增的序号。 官网&#xff1a;https://vxetable.cn 带层级序号 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> <…

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

之前和很多群友聊天发现对2016的无域和负载均衡满心期待&#xff0c;毕竟可以简单搭建而且可以不适用第三方负载均衡器&#xff0c;SQL自己可以负载了。windows2016已经可以下载使用了&#xff0c;那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …

Groom Blender to UE5

Groom Blender to UE5 - Character & Animation - Epic Developer Community Forums Hello, 你好&#xff0c; While exporting my “groom” from blender to UE5, I notice that the curves have a minimal resolution in Unreal. However I would like to get the same …

TCP/IP协议图--TCP/IP基础

1. TCP/IP 的具体含义 从字面意义上讲&#xff0c;有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下&#xff0c;它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说&#xff0c;IP 或 ICMP、TCP 或 UDP、…

R语言机器学习论文(二):数据准备

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据一、数据描述二、数据预处理(一)修改元素名称(二)剔除无关变量(三)缺失值检查(四)重复值检查(五)异常值检查三、描述性统计(一)连续变量数据情…

【算法】【优选算法】位运算(下)

目录 一、&#xff1a;⾯试题 01.01.判定字符是否唯⼀1.1 位图1.2 hash思路1.3 暴力枚举 二、268.丢失的数字2.1 位运算&#xff0c;异或2.2 数学求和 三、371.两整数之和四、137.只出现⼀次的数字 II五、⾯试题 17.19.消失的两个数字 一、&#xff1a;⾯试题 01.01.判定字符是…