计算机视觉---相机标定
相机标定在机器人系统中的作用
1.确定相机的内部参数
- 相机的内部参数包括焦距、主点坐标、像素尺寸等。这些参数决定了相机成像的几何关系。通过标定,可以精确获取这些参数,从而将图像中的像素坐标与实际的物理坐标建立联系。例如,已知相机的焦距和主点坐标,就可以根据成像原理计算出物体在图像中的位置与实际位置之间的关系,这对于机器人准确理解视觉信息至关重要。
Opencv库中的solvepnp函数,传入相机内参,畸变参数,实际物体大小,图像物体大小,即可得出物体的x,y,z坐标和旋转矩阵
2.纠正图像畸变
- 实际的相机镜头会引入各种畸变,如径向畸变和切向畸变。径向畸变会使图像中的直线变得弯曲,切向畸变则会导致图像在不同方向上的缩放比例不一致。这些畸变会严重影响机器人对环境的感知和理解。通过相机标定,可以建立畸变模型,并对图像进行校正,使机器人看到的图像更接近真实场景,从而提高视觉检测和识别的准确性。
3.实现机器人坐标系与相机坐标系的转换
- 机器人需要将相机获取的图像信息与自身的运动和操作联系起来,这就需要知道相机坐标系与机器人坐标系之间的相对位置和姿态关系。相机标定可以精确测量这两个坐标系之间的转换关系,使机器人能够将图像中的目标位置转换到自身坐标系下,从而准确地进行目标定位、路径规划和抓取等操作。
Robomaster比赛机器人中,我们的相机坐标系与发生机构存在一定的空间偏差,我们需要用ROS2的urdf(xacro)表述这两个组件之间的空间关系,控制枪口对准目标而不是相机!
4.提高机器人视觉系统的精度和可靠性
- 精确的相机标定可以减少视觉测量中的误差,提高机器人对物体位置、形状和姿态的测量精度。这对于需要高精度操作的机器人任务,如装配、焊接等非常重要。同时,准确的标定也可以提高视觉系统的可靠性,使机器人在不同的光照条件、环境背景下都能稳定地工作,减少因标定不准确而导致的错误决策和操作失误。
每次调整焦距后,建议重新标定;根据环境光调整曝光,太暗容易识别不到,太亮噪声太多。
5.多相机系统的协同工作
- 在一些复杂的机器人应用中,可能会使用多个相机来获取更全面的环境信息。对于多相机系统,相机标定不仅要确定每个相机的内部参数和外部参数,还要精确校准各个相机之间的相对位置和姿态关系,以实现多相机图像的融合和协同工作。这样可以扩大机器人的视觉感知范围,提高对复杂场景的理解能力。
例如,双头哨兵,配备有两个摄像头,分别检测一定的视觉范围,检测效率远高于常规哨兵,可以更加快速的发现目标并追踪打击。
相机标定
(详细内容推荐Opencv4快速入门这本书中的单目视觉和双目视觉部分,在此只是简单的介绍重要内容)
一、核心概念与坐标系定义
1. 定义
相机标定是通过数学建模,确定相机成像系统从三维世界到二维图像的几何映射关系,并校正镜头畸变的过程。其本质是求解两类参数:
- 内参数(Intrinsic):相机固有属性,与外部环境无关,包括焦距( f x f_x fx, f y f_y fy)、主点坐标( c x c_x cx, c y c_y cy)、畸变系数(径向 k 1 k_1 k1, k 2 k_2 k2, k 3 k_3 k3),切向 ( p 1 p_1 p1, p 2 p_2 p2)。

2. 四大核心坐标系

- 像素坐标系( u u u- v v v):原点位于图像左上角,单位为像素,通过缩放和平移与图像坐标系关联。
- 图像坐标系( o o o- x y xy xy):原点为光轴与成像平面的交点(理想主点),单位为物理长度(如毫米),遵循小孔成像模型。
- 相机坐标系( O c O_c Oc- X c X_c Xc Y c Y_c Yc Z c Z_c Zc):原点位于相机光心,( Z c Z_c Zc) 轴沿光轴方向,( X c X_c Xc, Y c Y_c Yc) 轴与成像平面平行。
- 世界坐标系( O w O_w Ow- X w X_w Xw Y w Y_w Yw Z w Z_w Zw):用户定义的全局坐标系,用于描述物体的三维位置(如标定板平面设为 ( Z w Z_w Zw=0)。
二、数学模型:从3D到2D的映射
1. 理想成像:针孔相机模型
从世界坐标到像素坐标的转换分三步:

2. 畸变模型:校正光学缺陷
实际镜头存在两类畸变:
-
径向畸变(中心对称):
- 桶形畸变(广角镜头):边缘像素向中心收缩,( k 1 k_1 k1 < 0);
- 枕形畸变(长焦镜头):边缘像素向外扩张,( k 1 k_1 k1 > 0)。
校正公式(以归一化坐标 ( x x x, y y y) = ( X c X_c Xc/ Z c Z_c Zc, Y c Y_c Yc/ Z c Z_c Zc) 为例):

-
切向畸变(非对称):
由镜头安装误差导致,像素点沿切线方向偏移:

校正顺序:先对归一化坐标去畸变,再转换为像素坐标。
三、标定方法分类与实现
1. 按标定物分类
-
传统3D标定法:
- 使用高精度三维标定物(如立方体),已知所有角点的3D坐标。
- 优点:精度极高(亚毫米级),适用于工业测量;缺点:设备昂贵,操作复杂。
-
张正友标定法(2D标定板):
- 使用平面棋盘格(世界坐标设为 ( Z w Z_w Zw=0),通过至少6张不同视角图像求解参数。
- 步骤:
-
角点检测:用OpenCV的
findChessboardCorners()获取像素坐标 ( u i u_i ui, v i v_i vi); -
线性求解初值:通过最小二乘解超定方程组,得到 ( K K K, R R R, t t t) 的初始估计;
-
非线性优化:以重投影误差(如下式)为目标,用LM算法优化所有参数(包括畸变系数);

-
精度评估:计算平均重投影误差(理想<1像素)。
-
- 优点:简单易用,无需3D设备;缺点:精度依赖标定板精度和图像质量。

- 自标定法:
- 无需标定板,利用相机运动(如不同视角的图像序列)和场景结构信息求解参数。
- 适用于动态场景(如SLAM初始化),但精度较低,需结合Bundle Adjustment优化。
2. 按相机数量分类
-
单目标定:求解单个相机的内外参数。
-
双目/多相机标定:
- 除单目参数外,还需求解相机间的相对外参数(如双目相机的基线距离 ( B B B) 和旋转矩阵 ( R l e f t − r i g h t R_{left-right} Rleft−right),用于立体匹配和深度计算。
- 联合标定方法:同时拍摄标定板,确保所有相机视野覆盖标定板,利用全局优化求解所有相机参数。
-
传感器联合标定(如相机-IMU):
- 目标:求解相机与IMU的外参数(旋转 ( R c a m − i m u R_{cam-imu} Rcam−imu)、平移 ( t c a m − i m u t_{cam-imu} tcam−imu),以及时间同步参数。
- 方法:使用Kalibr工具,通过手持标定板运动,利用IMU的惯性测量和相机的视觉观测联合优化参数,适用于SLAM系统。
四、标定板设计与数据采集
1. 标定板类型
- 棋盘格(最常用):
- 优点:角点检测算法成熟(如Harris角点),适合快速标定;
- 缺点:存在对称性,需设置不对称角点(如缺角)辅助定位。
- 圆形阵列:
- 圆心检测精度高(亚像素级),适合高精度场景(如工业视觉);
- 缺点:检测算法较复杂。
- 其他:不对称图案、三维结构光标定板(用于大视角相机)。
2. 数据采集要点
- 视角多样性:拍摄至少10张图像,覆盖不同距离(0.5~3倍焦距)、角度(倾斜±30°)、旋转(绕各轴转动),避免正对或单一视角。
- 图像质量:
- 光照均匀,避免过曝/欠曝(影响角点检测);
- 标定板占图像比例适中(1/4~3/4),边缘清晰无运动模糊。
- 标定板精度:格子尺寸需精确测量(误差<0.1mm),建议使用工业级标定板。
五、优化算法与误差分析
1. 线性最小二乘(初值求解)
将投影模型线性化,忽略畸变,建立关于内/外参数的超定方程:

通过奇异值分解(SVD)求解最小二乘解,作为非线性优化的初值。
2. 非线性优化(Bundle Adjustment)
-
目标函数:重投影误差平方和

-
优化算法:Levenberg-Marquardt(LM)算法,结合高斯牛顿法和梯度下降法,处理非线性最小二乘问题。
3. 误差来源
- 系统误差:标定板加工精度、相机热漂移(长时间使用焦距变化)。
- 检测误差:角点定位精度(亚像素级检测可提升至0.1像素以下)。
- 模型误差:忽略高阶畸变(如k3)或使用简化模型(如假设 ( f x f_x fx = f y f_y fy)。
六、特殊相机标定
1. 鱼眼相机/广角镜头
-
畸变模型:传统针孔模型失效,改用球面投影或等距投影模型,如:

-
标定方法:使用圆形标定板或专用鱼眼标定算法(如OpenCV的
fisheye模块),畸变系数通常包含4项( k 1 , k 2 , k 3 , k 4 k1, k2, k3, k4 k1,k2,k3,k4)。
2. 多镜头相机(如全景相机)
- 需对每个镜头单独标定,再通过坐标变换拼接全景图像,关键是精确求解各镜头间的相对外参数。
七、工具与库
| 工具 | 特点 | 适用场景 |
|---|---|---|
| OpenCV | 支持张正友标定、鱼眼标定,提供calibrateCamera()、fisheye::calibrate()等函数,代码开源。 | 通用视觉、快速原型开发 |
| MATLAB Toolbox | 图形化界面,自动检测角点,支持误差可视化,适合教学与初步标定。 | 非编程用户、精度验证 |
| Kalibr (ROS) | 支持多相机、相机-IMU联合标定,输出ROS可用的参数文件,兼容机器人系统。 | 机器人导航、SLAM系统集成 |
| Camera Calibration Toolbox (Bouguet) | 经典Matlab工具,支持自定义标定板,提供径向/切向畸变校正,精度高。 | 科研、工业视觉预处理 |
八、应用场景与精度要求
| 领域 | 典型应用 | 精度要求 |
|---|---|---|
| 工业视觉 | 零件尺寸测量、缺陷检测 | 亚像素级(<0.5像素),重投影误差<0.3像素 |
| 自动驾驶 | 目标距离测量、车道线检测 | 1~2像素,需实时标定更新 |
| 三维重建 | SfM、SLAM地图构建 | 0.5~1像素,依赖场景复杂度 |
| AR/VR | 虚拟物体定位与渲染 | 1~3像素,兼顾实时性与精度 |
| 医学影像 | 手术导航、病灶三维建模 | 亚毫米级,需高精度3D标定物 |
九、注意事项与最佳实践
- 标定板选择:根据相机类型(普通/鱼眼)和精度需求选择棋盘格或圆形板,尺寸覆盖相机视野的1/3~2/3。
- 数据预处理:对图像进行灰度化、去噪(如高斯滤波),提高角点检测成功率。
- 初值敏感性:非线性优化依赖初值,若线性解误差大,可手动调整主点坐标(设为图像中心)或焦距(根据图像分辨率估算)。
- 长期稳定性:定期重新标定(如相机更换、环境温度变化),避免参数漂移影响系统精度。
十、扩展:从标定到视觉系统构建
相机标定是视觉测量的起点,后续应用需结合标定结果:
- 立体视觉:利用双目相机的内参数和相对外参数,通过极线约束计算视差,恢复场景深度。
- SLAM:单目SLAM需通过三角化估计尺度,而相机-IMU联合标定可提供初始尺度和重力方向,提升定位精度。
- 增强现实:根据实时外参数 ( R , t ) (R, t) (R,t),将虚拟物体坐标转换为相机坐标系下的坐标,再通过内参数投影到屏幕像素。
总结
**相机标定是连接三维世界与二维图像的桥梁,其核心是通过数学建模和优化求解内外参数,消除畸变影响。**从基础的张正友标定到复杂的多传感器联合标定,标定方法的选择依赖于应用场景的精度、实时性和设备条件。掌握坐标系转换、畸变模型、优化算法等核心知识点,是实现高精度视觉测量、三维重建和机器人导航的关键。通过合理设计标定流程、选择工具并严格控制误差,可确保后续视觉算法的可靠性和鲁棒性。
相关文章:
计算机视觉---相机标定
相机标定在机器人系统中的作用 1.确定相机的内部参数 相机的内部参数包括焦距、主点坐标、像素尺寸等。这些参数决定了相机成像的几何关系。通过标定,可以精确获取这些参数,从而将图像中的像素坐标与实际的物理坐标建立联系。例如,已知相机…...
LeetCode 443 压缩字符串
字符数组压缩算法详解:实现与分析 一、引言 在处理字符数组时,我们常常遇到需要对连续重复字符进行压缩的场景。这不仅可以节省存储空间,还能提升数据传输效率。本文将深入解析一个经典的字符数组压缩算法,通过详细的实现步骤和…...
datasheet数据手册-阅读方法
DataSheet Datasheet(数据手册):电子元器件或者芯片的数据手册,一般由厂家编写,格式一般为PDF,内容为电子分立元器件或者芯片的各项参数,电性参数,物理参数,甚至制造材料…...
AI绘制流程图,方法概述
1 deepseek 生成图片的mermaid格式代码,在kimi中进行绘图或在jupter notebook中绘制: 或在draw.io中进行绘制(mermaid代码) 2 svg是矢量图,可以插入到word """mermaid graph TDA[基线解算] --> B[北…...
ObjectOutputStream 深度解析
ObjectOutputStream 深度解析 ObjectOutputStream 是 Java IO 体系中的一个关键类,用于序列化(将对象转换为字节流),通常与 ObjectInputStream 配合使用,实现对象的持久化存储或网络传输。 1.作用:完成对象的序列化过程 2.它可以将JVM当中的Java对象序列化到文件中/网…...
git回滚指定版本并操作
你可以通过以下步骤切换到第三个版本。根据你的需求,有两种主要方法: 方法 1:临时查看第三个版本(不修改当前分支) 适用于仅查看或测试旧版本,不保留后续修改: 找到第三个版本的提交哈希&#…...
【AI插件开发】Notepad++ AI插件开发实践:支持配置界面
一、引用 此前的系列文章已基本完成了Notepad的AI插件的功能开发,但是此前使用的配置为JSON配置文件,不支持界面配置。 本章在此基础上集成支持配置界面,这样不需要手工修改配置文件,直接在界面上操作,方便快捷。 注…...
polkitd服务无法启动导致docker无法启动问题解决
问题docker服务无法启动,溯源发现是polkit服务没有正确运行 systemctl status polkit可以看到类似提示 Sep 18 02:58:24 server1 dbus[897]: [system] Failed to activate service org.freedesktop.PolicyKit1: timed out Sep 18 02:59:29 server1 systemd[1]: po…...
软件工程中数据一致性的探讨
软件工程中数据一致性的探讨 引言数据一致性:软件工程中的业务正确性与性能的权衡数据一致性为何重要业务正确性:事务的原子性与一致性ACID原则的基石分布式事务的挑战一致性级别:从强一致到最终一致 实践中的一致性权衡金融系统:…...
数据库原理及应用mysql版陈业斌实验四
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表(学生表&…...
华为OD机试真题——最长的顺子(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录全流程解析/备考攻略/经验…...
【HTML】html文件
HTML文件全解析:搭建网页的基石 在互联网的广袤世界里,每一个绚丽多彩、功能各异的网页背后,都离不开HTML文件的默默支撑。HTML,即超文本标记语言(HyperText Markup Language),作为网页创建的基…...
使用 XWPFDocument 生成表格时固定列宽度
一、XWPFDocument XWPFTable个性化属性 1.初始默认写法 XWPFTable table document.createTable(n, m); //在文档中创建一个n行m列的表格 table.setWidth("100%"); // 表格占页面100%宽度// 通过getRow获取行进行自定义设置 XWPFTableRow row table.getRow(0); XW…...
足球AI模型:一款用数据分析赛事的模型
2023 年欧冠决赛前,某体育数据平台的 AI 模型以 78% 的概率预测曼城夺冠 —— 最终瓜迪奥拉的球队首次捧起大耳朵杯。当足球遇上 AI,那些看似玄学的 "足球是圆的",正在被数据与算法拆解成可计算的概率命题。今天我们就来聊聊&#…...
【ESP32|音频】一文读懂WAV音频文件格式【详解】
简介 最近在学习I2S音频相关内容,无可避免会涉及到关于音频格式的内容,所以刚开始接触的时候有点一头雾水,后面了解了下WAV相关内容,大致能够看懂wav音频格式是怎么样的了。本文主要为后面ESP32 I2S音频系列文章做铺垫࿰…...
万向死锁的发生
我是标题 1.欧拉角2.万向死锁 参考:小豆8593 1.欧拉角 欧拉角在Unity中描述的是一种变换(Transform)共有3个轴体,默认顺序为x->y->z. 2.万向死锁 可以把万向死锁的情况理解成:由于轴体旋转的顺序是固定的&am…...
JavaScript学习教程,从入门到精通,JavaScript BOM (Browser Object Model) 详解(18)
JavaScript BOM (Browser Object Model) 详解 1. BOM 介绍 BOM (Browser Object Model) 是浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象。BOM的核心对象是window,它表示浏览器的一个实例。 BOM包含的主要对象: window…...
人工智能与云计算:技术融合与实践
1. 引言 人工智能(AI)和云计算是当今科技领域最具变革性的两项技术。AI通过模拟人类智能解决问题,而云计算则提供了弹性可扩展的计算资源。两者的结合创造了前所未有的可能性,使企业能够以更低的成本部署复杂的AI解决方案。 本文将探讨AI与云计算的技术融合,包括核心概念、…...
42.[前端开发-JavaScript高级]Day07-手写apply-call-bind-块级作用域
手写apply-call-bind <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…...
ObjectInputStream 终极解析与记忆指南
ObjectInputStream 终极解析与记忆指南 一、核心本质 ObjectInputStream 是 Java 提供的对象反序列化流,继承自 InputStream,用于读取由ObjectOutputStream序列化的Java对象。 核心特性速查表 特性说明继承链InputStream → ObjectInputStream核心功能实现Java对象反序列化…...
数据结构有哪些类型(对于数据结构的简述)
在学习计算机时,数据结构是不可忽视的一点,从考研时的408课程,再到工作中编写软件,网站,要想在计算机领域站住脚跟,数据结构是必备的 在这里,我对于数据结构进行了汇总,并简要描述&…...
Vscode 插件开发
文章目录 1、使用vscode官方插件生成框架,下载脚手架2、使用脚手架初始化项目,这里我选择的是js3、生成的文件结构如下,重要的就是以下两个文件4、代码5、打包使用6、发布官网地址7、publisher ID undefined provided in the extension manif…...
C# string和其他引用类型的区别
在C#中,字符串(String)和其他引用类型(Reference Types)之间有几个关键的区别,这些区别主要体现在它们的内存管理、赋值行为以及使用方式上。 1. 内存管理 字符串(String)࿱…...
RTT添加一个RTC时钟驱动,以DS1307为例
添加一个外部时钟芯片 这里多了一个选项 复制drv_rtc.c,重命名为drv_rtc_ds1307.c 添加到工程中 /*** @file drv_rtc_ds1307.c* @brief * @author jiache (wanghuan3037@fiberhome.com)* @version 1.0* @date 2025-01-08* * @copyright Copyright (c) 2025 58* */ #...
常见的低代码策略整理
低代码策略通过简化开发流程、降低技术门槛、提升效率,帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面: 快速交付与降本增效 减少编码需求:通过可视化配置(如变量替换、表达式函数)替代传统编码…...
从彩色打印单行标准九九表学习〖代码情书〗的书写范式(Python/DeepSeek)
写给python终端的情书,学习代码设计/书写秘笈。 笔记模板由python脚本于2025-04-17 12:49:08创建,本篇笔记适合有python编程基础的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简…...
QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)
目录 引言相关阅读项目结构文件组织 核心技术实现1. 数据模型设计联系人项目类 (datamodel.h)数据模型类 (datamodel.h)数据模型实现 (datamodel.cpp) 2. 主程序入口点 (main.cpp)3. 主界面设计 (Main.qml)4. 联系人对话框 (ContactDialog.qml)5. 自定义组件CustomTextField.qm…...
postman莫名奇妙报错,可能是注释引起的。postman 过滤请求体中的注释。
postman莫名奇妙报错,可能是注释引起的。postman 过滤请求体中的注释。 1、问题描述2、问题分析3、解决方法 1、问题描述 postman http请求测试时,如果在请求体中添加了注释,那么这个注释会被带到服务端执行,导致服务端接口返回报…...
扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)
一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此,microeco包发表以来被学界广泛关注,截止2…...
中间件--ClickHouse-4--向量化执行(什么是向量?为什么向量化执行的更快?)
1、向量(Vector)的概念 (1)、向量的定义 向量:在计算机科学中,向量是一组同类型数据的有序集合,例如一个包含多个数值的数组。在数据库中,向量通常指批量数据(如一列数…...
