计算机视觉——相机标定(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. 原理
相机标定的基本原理是通过已知的三维世界坐标系中的点和对应的二维图像坐标系中的点,建立一个数学模型,将三维世界坐标系中的点投影到二维图像坐标系中。这个数学模型通常包括以下几个部分:
- 相机内参矩阵(Intrinsic Matrix):描述相机的内部几何特性,包括焦距、主点坐标等。
- 畸变系数(Distortion Coefficients):描述图像畸变,包括径向畸变和切向畸变。
- 旋转矩阵和平移向量(Rotation Matrix and Translation Vector):描述相机在世界坐标系中的姿态,也可以叫做外参数。
常用标定步骤:
- 准备标定板:使用一个已知尺寸的标定板(如棋盘格),并拍摄多张不同角度和位置的图像。
- 检测角点:在每张图像中检测标定板的角点,并记录其二维图像坐标。
- 生成世界坐标:根据标定板的尺寸,生成标定板角点的三维世界坐标。
- 计算内参和畸变系数:使用检测到的角点和生成的世界坐标,计算相机的内参矩阵和畸变系数。
- 计算旋转矩阵和平移向量:计算每张图像的旋转矩阵和平移向量。
- 计算重投影误差:将世界坐标系中的点投影到图像坐标系中,并与实际检测到的图像坐标进行比较,计算重投影误差。
常用术语
内参矩阵: 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 相机坐标系到图像坐标系
相机坐标系到图像坐标系的转换是通过透视投影实现的。假设相机焦距为 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)
利用相似三角形求得: 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=zcf⋅xc, y = f z c ⋅ y c y=\frac{f}{z_c}\cdot y_c y=zcf⋅yc,写为矩阵形式:
[ 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。然后,利用这些系数对图像进行畸变校正,恢复图像的几何形状。
相关文章:
计算机视觉——相机标定(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&a…...
【qt环境配置】windows下的qt与vs工具集安装\版本对应关系
vs工具集安装通过vs的在线安装器勾选工具集即可 工具包下载路径:https://www.microsoft.com/zh-cn/download/details.aspx?id40784 配置工具集在qt中可以自动扫描到 《正确在 Windows 上配置 MSVC(2019) 作为 Qt 编译器》https://b3logfile.com/pdf/article/15922…...
GitHub使用
太久不用GitHub发现自己又有些不会了,突发奇想为何不把每次看到的有指导意义的博客收录一下以便下次查阅呢 如何上传文件夹到GitHub上(配图详解)?_github上傳資料夾-CSDN博客 github上如何删除自己的仓库_github删除仓库-CSDN博…...
元宇宙时代的社交平台:Facebook的愿景与实践
随着科技的不断进步,元宇宙(Metaverse)这一概念逐渐走进了人们的视野。作为全球最大的社交平台之一,Facebook(现Meta)在这场元宇宙革命中扮演着重要角色。Meta不仅在不断扩展其社交平台的边界,还…...
vue2中各种钩子函数的总结以及使用场景
在 Vue 2 中,生命周期钩子函数是 Vue 实例在不同阶段自动调用的函数。这些钩子允许开发者在组件的创建、更新和销毁的特定时刻插入自定义逻辑。以下是 Vue 2 中的各种生命周期钩子函数的总结及其使用场景。 生命周期钩子函数总结 1、beforeCreate 调用时机&#…...
软件架构:从传统单体到现代微服务的技术演变
1.引言 在软件开发中,架构设计不仅仅是程序员的技术任务,它更是一个项目成功的关键。无论是小型应用还是大型分布式系统,软件架构都直接影响着系统的可维护性、可扩展性、性能和稳定性。理解软件架构的必要性,能够帮助开发人员做…...
git新建远程分支后,无法切换
git remote # 列出所有远程主机 git remote update origin --prune # 更新远程主机origin 整理分支 git branch -r # 列出远程分支 git branch -vv # 查看本地分支和远程分支对应关系 git checkout -b gpf origin/gpf # 新建本地分支gpf与远程gpf分支相关…...
【SpringBoot】31 Session + Redis 实战
Gitee https://gitee.com/Lin_DH/system 介绍 【SpringBoot】30 Cookie、Session、Token https://blog.csdn.net/weixin_44088274/article/details/144241595 背景 Spring Session 是 Spring 的一个子项目,它提供了一种管理用户会话信息的方法,无论…...
在Windows环境下的rknn-toolkit环境搭建
首先安装好conda,我是用的是anaconda,miniconda也可以。 下载rknn_toolkit的轮子。可以直接在瑞芯微的git仓库中下载,地址为:github.com/rockchip-linux/rknn-toolkit/releases。我这里下载的是1.7.5版本的。选择rknn-toolkit-v1.…...
Facebook广告突然无消耗?原因解析与解决方案。
在Facebook广告投放中,广告突然无消耗是很多广告主都会遇到的难题。这种情况不仅浪费时间,还可能导致营销活动停滞,影响业务发展。那么,广告无消耗的原因是什么?又该如何解决呢? 一、Facebook广告无消耗的…...
Rabbitmq 镜像队列
RabbitMQ 支持高可用性队列(HA Queues),可以在多个节点之间复制队列,确保即使某个节点失败,消息仍然可用。将 RabbitMQ 部署为集群,确保高可用性和负载均衡。 RabbitMQ 的镜像队列集群(Mirrore…...
TensorBoard
1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件,它提供了一个交互式的界面,用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard,你可以: 可视化训练过程中的各种指标,如损失函数、准…...
运维实战:K8s 上的 Doris 高可用集群最佳实践
今天我们将深入探讨::如何在 K8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群? 本文,我将为您提供一份全面的实战指南,逐步引导您完成以下关键任务: 配…...
2024.12.5——攻防世界Training-WWW-Robots攻防世界baby_web
2024.12.5—攻防世界Training-WWW-Robots 知识点:robots协议 dirsearch工具 本题与第一道Robots协议十分类似,不做wp解析 大致步骤: step 1 打开靶机,发现是robots协议相关 step 2 用dirsearch进行扫描目录 step 3 url传参r…...
当 Nginx 出现连接超时问题,如何排查?
文章目录 当 Nginx 出现连接超时问题,如何排查? 一、了解 Nginx 连接超时的基本概念二、可能导致 Nginx 连接超时的原因 (一)服务器负载过高(二)上游服务响应缓慢(三)网络问题&…...
vue2 项目中实现动态代理,服务器上通过nginx部署 实现动态代理
一、前言&&原理 前言:vue2 项目中,请求接口是从表格的当前获取的,也就是接口ip:端口号:路经不确定,要实现点击表格当前行请求对应的接口 实现原理:将实际要请求的ip等信息存在请求头中,用的时候再…...
基于SpringBoot+Vue的民宿山庄农家乐管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)
之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据,原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据!基于逐月栅格数据我们采用求年平均值的方法得到逐年最…...
后端API接口设计标准(Java)
Controller 层(API接口) 无论是传统的三层架构还是现在的COLA架构,Controller 层依旧有一席之地,说明他的必要性;说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收…...
网络安全法 -网络信息安全
第四章 网络信息安全 第四十条 网络运营者应当对其收集的用户信息严格保密,并建立健全用户信息保护制度。 第四十一条 网络运营者收集、使用个人信息,应当遵循合法、正当、必要的原则,公开收集、使用规则,明示收集、使用信息的…...
matlab figure函数 single 数据类型
1.matlab figure函数详细介绍 在MATLAB中,figure函数用于创建新的图形窗口或激活现有的图形窗口。以下是figure函数的详细介绍和用法: 基本用法 创建新图形窗口:不带任何参数调用figure会创建一个新的图形窗口,并将其设为当前活…...
endroid/qr-code生成二维码,中文乱码的解决方案
endroid/qr-code version:6.0.3 默认不支持中文; 1、https://fonts.google.com/noto/fonts,从这里下载字体; 2、下载简体中文:Noto Sans Simplified Chinese 3、下载后,把压缩包解压,把NotoSansSC-Regul…...
深度和法线纹理
屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后通过获取到该画面的信息进行额外的效果处理 之前的边缘检测、高斯模糊、Bloom、运动模糊等效果都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理,存在以下问题&…...
监听H5页面在微信浏览器异常退出
参考文章 onBeforeUnmount(() > {unNormalExit(); });//---------------------------异常退出---------------------- function unNormalExit() {enterOrExitRoom({type: 37,roomId: roomId.value,userId: userId.value,nickName: name.value,loginUserType: 2, //0 专家 1…...
Linux 串口编程
目录 前言一、tty体系二、串口硬件基础知识三、Linux下的串口编程3.1 打开串口3.2 从串口读写数据,问题1、2的诞生3.3 关闭串口3.4 串口配置3.4.1 获取/设置串口的参数3.4.2 设置波特率3.4.3 设置控制模式标志3.4.4 设置本地模式标志3.4.5 设置输入模式标志3.4.6 设置输出模式标…...
Adminer源码编译 精简语言中英文和基本使用方法
Adminer是一个小而强悍的基于web的数据库管理工具, 官方默认支持几十种语言,但是对于中国的用户而言只需要有中文和英文就够了,其他语言基本无用。这就需要我们下载Adminer源码自己编译 Adminer.php , 如下图所示 adminer 中英文语言精简版本…...
go 中线程安全map
在 Go 语言中,官方包 sync.Map 确实提供了线程安全的映射数据结构。然而,正如你所提到的,使用 sync.Map 时,有时需要进行类型断言,这可能会让代码显得冗长或不直观。 如果你希望使用一个更加易用的线程安全映射&#…...
eslint 安装与使用-基础教程
中文官网 官方规则解析 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 eslint ESlint 是一个检查 JS,TS 语法的工具.能够与常用开发工具,例如 VS Code,进行集成并提供错误提示,和可能的修正方法 安装 安装eslint npm init esli…...
自然语言处理的未来愿景
自然语言处理的未来愿景 在这个信息爆炸的时代,计算机如何理解和生成我们日常使用的语言,已经成为一个引人注目的问题。你有没有想过,为什么智能助手能理解你的指令?又或者,为什么社交媒体上的推荐引擎能够精准地推荐你喜爱的内容?这背后,正是自然语言处理(NLP)在发挥…...
等保2.0三级测评华为华三交换机路由器
在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明: 信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。 非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要…...
做兽药网站用什么图片好/现在的seo1发布页在哪里
// 题目描述 // 求123...n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。public int Sum_Solution(int n) { // 不会:&& || 短路int sum n;boolean f (sum>…...
iis的网站默认端口/公司网站建设
办公室计算机一直使用Windows 7 企业版,近期重新安装了操作系统,换成了Windows 10专业工作站版,但选择的安装文件有问题(版本号:1709,16299.98),不支持系统管理的共享(无…...
酒店网站怎么做/企业品牌网站营销
很多朋友看完macOS Big Sur的介绍就把系统升级到big sur了,面对半成品的开发者预览版(Developer Preview),很多人表示无法接受,可降回10.15.5 的时候,提示不能回退老版本,那么macOS Big Sur如何…...
四海网络网站建设咨询/网盘资源免费观看
原标题:「Linux基础知识」grep文件内容筛选命令的使用grep命令用于从文档中抓取显示包含指定字符的行,grep命令的使用格式如下:grep [选项] 匹配模式 文件1 文件2 ......grep常见的选项有:-n 显示匹配文档行的行号-i 忽略大小写按…...
wordpress推荐文章/百度推广收费多少
论文翻译 论文作者讲解 解决问题 现有评价标准过高的评估模型效果(现有标准一般是accuracy或者 F1 这种标准度量) 解决对策 由软件测试方法得来灵感 建立 CheckList 流程框架: 测试一些独立的最小单元组件(例如,区分词…...
网站全站模板/正规seo多少钱
我想使用串行com端口进行通信,并且每次调用read函数调用时都想实现超时。int filedesc open("dev/ttyS0", O_RDWR );read( filedesc, buff, len );编辑:我正在使用Linux OS。 如何使用选择函数调用实现?参见linux.die.net/man/2/s…...