相机的标定

文章目录

  • 相机的标定
      • 标定步骤
      • 标定结果
      • 影响因素
      • 参数分析
      • 精度提升
          • 一、拍摄棋盘格
          • 二、提升标定精度
      • 标定代码实现

相机的标定

双目相机的标定是确保它们能够准确聚焦和成像的关键步骤。以下是详细的标定步骤和可能的结果,同时考虑了不同光照条件和镜头光圈大小等因素对标定结果的影响。

标定步骤

  1. 准备标定板

    • 使用一个具有明显特征点的标定板,如棋盘格标定板。
    • 确保标定板平整且特征点清晰可辨。
  2. 固定相机位置

    • 将双目相机固定在稳定的三脚架或支架上。
    • 调整相机位置,确保标定板完全位于相机的视野内。
  3. 采集标定图像

    • 在不同的角度和距离下,移动标定板并拍摄多组图像(通常建议至少15组)。
    • 确保图像中标定板的特征点清晰可见。
  4. 使用标定软件

    • 可以使用OpenCV、MATLAB等提供的相机标定工具。
    • 导入拍摄的标定图像,并识别标定板上的特征点。
  5. 计算标定参数

    • 通过软件计算相机的内参(如焦距、主点坐标等)和外参(如旋转矩阵和平移向量)。
    • 同时,软件还会给出畸变系数等参数。
  6. 立体校正和验证

    • 使用标定参数进行立体校正,确保左右相机的图像在同一水平线上对齐。
    • 通过拍摄实际场景验证标定的准确性,观察立体匹配的效果。

标定结果

  • 标定参数:包括相机的内参(焦距、主点等)、外参(旋转矩阵、平移向量)和畸变系数。
  • 误差分析:标定软件通常会给出重投影误差等指标,用于评估标定的准确性。重投影误差越小,说明标定越准确。

影响因素

  1. 光照条件

    • 强光或弱光条件下,标定板的特征点可能不够清晰,影响标定的准确性。
    • 建议在均匀且适度的光照条件下进行标定。
  2. 镜头光圈大小

    • 光圈大小影响景深和图像亮度。过大或过小的光圈都可能导致标定板上的特征点模糊。
    • 选择适中的光圈大小,以获得清晰的标定图像。

综上所述,双目相机的标定是一个精确且细致的过程,需要考虑多种因素以确保标定的准确性。通过遵循上述步骤并注意影响因素,可以获得高质量的标定结果,从而实现双目相机的准确聚焦和成像。

角点的数量:如果标定板格子是12x9的,那么格点的数据则是11x8

Calibration Error: 0.26985438768011444
Intrinsic Matrix:[[9.64900471e+04 0.00000000e+00 4.00956403e+02][0.00000000e+00 9.84639627e+04 5.17965206e+02][0.00000000e+00 0.00000000e+00 1.00000000e+00]]
Distortion Coefficients:[-7.27106948e+00  4.02668787e-02 -2.75489644e-02 -1.58608135e-022.25903054e-04]

这些参数通常与计算机视觉中的相机标定(Camera Calibration)相关。相机标定是确定相机的内部参数(内参)和畸变系数的过程,以便更准确地从图像中获取信息。下面我会解释这些参数的含义:

  1. Calibration Error:

    • Calibration Error: 0.26985438768011444 表示相机标定的误差。这个数值越小,说明标定越准确。误差是通过比较标定板上角点的实际图像坐标与通过标定参数计算得到的图像坐标之间的差异来计算的。
  2. Intrinsic Matrix:

    • 这个矩阵描述了相机的内部几何和光学特性,通常包含焦距(fx, fy)、主点(cx, cy)等参数。矩阵的形式一般为:

      [fx  0  cx]
      [ 0 fy cy]
      [ 0  0  1]
      

      在你给出的数据中:

      • fx = 9.64900471e+04fy = 9.84639627e+04 是相机在x和y方向上的焦距(以像素为单位)。
      • cx = 4.00956403e+02cy = 5.17965206e+02 是图像坐标系中相机的主点坐标。
      • 矩阵的第三行是标准形式,表示这是一个齐次坐标变换。
  3. Distortion Coefficients:

    • 这些系数用于纠正由于相机镜头畸变引起的图像变形。常见的畸变包括径向畸变和切向畸变。
    • 在你给出的数据中,有五个畸变系数:
      • k1 = -7.27106948e+00 通常是径向畸变的主要系数。
      • k2 = 4.02668787e-02, k3 = -2.75489644e-02 可能是径向畸变的高阶系数。
      • p1 = -1.58608135e-02, p2 = 2.25903054e-04 通常是切向畸变的系数。

通过这些参数,你可以对相机拍摄的图像进行畸变校正,以及从图像坐标转换到真实世界坐标等。这在许多计算机视觉应用中,如三维重建、目标跟踪、机器人导航等,都是非常重要的。

参数分析

在相机标定过程中,内参和外参是否会随着标定板的变化而变化,这个问题可以从两个方面来分析:

一、内参

  1. 内参是描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸变系数等。
  2. 这些参数通常在相机标定时确定,并且对于特定相机型号是固定的,不随时间变化。
  3. 因此,内参不会随着标定板的变化而变化。无论标定板的形状、大小或位置如何改变,相机的内部属性如焦距、主点坐标等保持不变。

二、外参

  1. 外参是描述相机在世界坐标系中的位置和姿态的参数,包括旋转矩阵和平移向量。
  2. 这些参数与相机和标定板之间的相对位置关系密切相关。
  3. 当标定板的位置或方向发生变化时,相机的外参也会随之变化。例如,如果移动相机或更改拍摄角度,外参会随之调整以反映这些变化。
  4. 因此,外参会随着标定板的变化而变化。具体来说,当标定板与相机的相对位置或姿态发生改变时,需要重新进行标定以获取准确的外参。

三、畸变系数

  1. 畸变系数的定义

    • 畸变系数是描述相机镜头制造偏差等因素导致的成像失真系数,主要包括径向畸变系数和切向畸变系数。
    • 这些畸变系数是相机本身的固有属性,与相机的制造和组装过程有关。
  2. 标定板的作用

    • 标定板在相机标定过程中主要用于提供已知的几何特征(如棋盘格的角点),以便通过图像处理算法来估计相机的内外参数和畸变系数。
    • 标定板的变化可能包括其位置、方向或图案的变化。
  3. 畸变系数与标定板的关系

    • 虽然标定板用于估计畸变系数,但畸变系数本身并不会因为标定板的变化而变化。
    • 畸变系数是相机镜头的固有特性,与标定板无关。标定板只是用于测量和估计这些系数的工具。
  4. 实验观察与结论

    • 在实际标定过程中,可能会观察到畸变系数的估计值随着标定板的不同设置(如不同位置、角度或图案)而有所差异。然而,这种差异主要是由于标定过程中的误差、图像噪声或算法的不稳定性引起的,并非畸变系数本身发生了变化。
    • 因此,可以归纳出结论:畸变系数不会随着标定板的变化而变化。它们是相机的固有属性,只与相机的镜头质量和组装工艺有关。

综上所述,

内参是相机的固有属性,不会因标定板的变化而改变;而外参则与相机和标定板之间的相对位置关系密切相关,当这种关系发生变化时,外参也需要相应地进行调整。

畸变系数是相机的固有特性,不会因标定板的变化而改变。标定板只是用于测量和估计这些系数的工具,而估计值的差异主要来源于标定过程中的各种误差和不确定性。

外参在计算机视觉和机器人领域中起着至关重要的作用。以下是对外参的详细解释:

一、定义

外参,即外在参数,是描述相机或传感器在世界坐标系中的位置和姿态的参数。它通常包括旋转矩阵和平移向量,这些参数确定了相机或传感器相对于一个固定参考坐标系的位置和方向。

二、作用

  1. 定位与姿态估计:外参的主要作用是确定相机或传感器在空间中的精确位置和姿态。这对于许多应用来说至关重要,如机器人导航、自动驾驶车辆、增强现实和虚拟现实等。

  2. 多传感器融合:在多个传感器(如多个摄像头、激光雷达等)同时使用的系统中,外参标定可以帮助系统理解每个传感器之间的相对位置关系,从而实现多传感器数据的准确融合。

  3. 三维重建与立体视觉:在立体视觉中,通过两个或多个相机的外参标定,可以确定它们之间的相对位置和姿态关系,进而利用这些关系进行三维场景的重建。

三、应用场景与案例

  1. 自动驾驶:在自动驾驶车辆中,车载摄像头、激光雷达等传感器的外参标定对于实现精确的环境感知和定位至关重要。通过外参标定,车辆能够更准确地判断周围物体的位置和距离,从而提高行驶的安全性和准确性。

  2. 机器人导航:在机器人导航中,外参标定有助于机器人确定自身在空间中的位置和姿态。这对于机器人执行各种任务(如抓取、移动等)时的精确定位和路径规划非常重要。

  3. 增强现实(AR):在AR应用中,外参标定可以帮助虚拟图像与现实世界精确对齐。通过标定摄像头与现实世界的相对位置关系,AR系统能够在用户视野中正确地叠加虚拟元素,从而提供沉浸式的体验。

  4. 三维测量与建模:在工业测量、建筑设计等领域,外参标定是实现精确三维测量和建模的关键步骤。通过标定多个相机之间的外参关系,可以从不同角度捕捉物体的图像并重建其三维模型。

综上所述,外参在计算机视觉和机器人领域具有广泛的应用价值。通过精确的外参标定,我们可以实现更准确的定位、姿态估计以及多传感器数据融合等功能,从而推动相关技术的发展和应用创新。

精度提升

一、拍摄棋盘格

为获得最佳效果,请使用至少10到20张包含校准图案的图像。 校准器至少需要三个图像。 尽量使用未压缩或压缩损失很小的图像格式(如png或bmp)。 为了更高的校准精度你需要:

  • 获取一部分你所关注的距离处的棋盘格图片,比如你要测量2米远的物体,那么请将棋盘放在距离相机2米左右的地方拍摄一部分图片

  • 棋盘表面和相机成像平面的夹角必须小于45度

不要修改图像,比如对其进行剪切

不要使用自动聚焦模式或改变图像的放大倍率

以相对于相机的不同方向拍摄棋盘图像

尽量采集各种不同的棋盘图像。镜头的畸变从图像中心径向增加,并且有时在图像各帧上表现不均匀, 为了获取图像的畸变信息,棋盘应当处在图像的各种不同边缘处

确保棋盘图案在左右两幅图像中都能被完整的显示

在每一对图像中尽量保持棋盘静止,也就是在同一时间拍摄。 若棋盘在两幅图像中发生了相对运动,会对标定精度产生负面影响

若想对远距离的重建获得更高的精度,需要将两个相机的距离调整的更大。

二、提升标定精度

添加或删除图像

添加图像:

  • 少于10张图像时
  • 棋盘没有覆盖足够的图像帧时
  • 棋盘与相机的相对方向变化不够多时

删除图像:

  • 删除具有较大重投影误差的图像
  • 删除太模糊的图像
  • 删除棋盘平面与相机平面夹角超过45度的图像

标定代码实现

import cv2
import numpy as np
import globdef main():# 参数设置criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)w, h = 11, 8  # 棋盘格内角点数量(亲自数)objp = np.zeros((w * h, 3), np.float32)objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)# 存储角点信息objpoints = []  # 三维世界坐标imgpoints = []  # 二维图像坐标# 加载并处理图像images = glob.glob('data/d2/*.jpg')for fname in images:img = cv2.imread(fname)# img = cv2.resize(img, (768, 1024))  # 统一图像大小gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# gray = cv2.GaussianBlur(gray, (11, 11), 0)  # 滤波处理# 寻找棋盘格角点ret, corners = cv2.findChessboardCorners(gray, (w, h), None)if ret:corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)  # 亚像素级角点检测m = [c[0] for c in corners]objpoints.append(objp)imgpoints.append(corners)# 可视化和保存结果cv2.drawChessboardCorners(img, (w, h), corners, True)cv2.imshow('Corners Found', img)cv2.waitKey(100)# 根据需要保存图像,这里以序号命名cv2.imwrite(f"result/mm_{len(imgpoints)}.jpg", img)else:print(f"Calibration failed for image: {fname}")cv2.destroyAllWindows()# 相机标定ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, (768, 1024), None, None)# 输出标定结果print("Calibration Error:", ret)print("Intrinsic Matrix:\n", mtx)print("Distortion Coefficients:\n", dist.ravel())# 如果需要,可以保存或进一步处理旋转向量和平移向量# print("Rotation Vectors:\n", rvecs)# print("Translation Vectors:\n", tvecs)if __name__ == '__main__':main()

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

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

相关文章

4.1. 马氏过程及其构造

马氏过程及其构造 1. 马氏过程与转移概率1.1. Markov过程1.2. 示例1.3. 四元函数(转移概率)2. 活动概率空间: P x , P μ P_x,P_\mu Px​,Pμ​2.1. 初始点为 x x x活动概率空间 P x P_x Px​2.2. 初始分布为 μ \mu μ的活动概率空间 P μ P_\mu Pμ​对于围棋, 如果某个时刻形…

极速解析,精准合规 — Ada,现代C++的URL解析器

Ada:用Ada,让URL解析变得轻而易举。- 精选真开源,释放新价值。 概览 Ada是一个用现代C编写的快速且符合WHATWG标准的URL解析库。它通过了WHATWG网站提供的全部规范测试,并在包括Windows、Linux、macOS在内的多个平台上表现卓越。…

Python机器学习分类算法(二)-- 决策树(Decision Tree)

决策树(Decision Tree)是一种基于树形结构的分类和回归方法,它主要用于在给定输入特征的情况下预测目标变量的值。以下是关于决策树的详细解释: 定义 决策树是一种直观的决策分析方法,通过构成树形结构来求取净现值的…

LeetCode 2288.价格减免:模拟

【LetMeFly】2288.价格减免:模拟 力扣题目链接:https://leetcode.cn/problems/apply-discount-to-prices/ 句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 $ 。如果单…

关于vue elementUi校验slot插槽中的表单项

项目场景:在父组件表单中使用子组件,并使用子组件插槽功能来管理父组件的单个表单项 重点提示:这里要明确一个概念,凡是在组件内插槽的内容都属于组件管理,因此,要校验父组件使用子组件的slot插槽展示表单…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽,大家好,我是木头左! 引言 编写一篇高质量的博客文章并非易事,尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言,为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

反射的原理和操作

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 在Java中,反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI(powered by LLM)和Headless BI(powered by 语义层)打造新一代的BI平台。这种融合确…

C++ 66 之 类模版

#include <iostream> #include <string> using namespace std;// 习惯性 < >中 类模板用class 普通的函数模板就用typename // template<class NAMETYPE, class AGETYPE> template<class NAMETYPE, class AGETYPE int> // 可以设置默认的类型值…

c语言单元测试构建

前言 查阅gtest、ceedling、unity、cmock等测试框架,在项目集成实践。 Ceedling安装和使用(放弃) 使用总结:Ceedling使用的确非常方便,但是由于toolchain的设置的文档说明和sample缺失,尝试了更新toolchain失败而告终。同时ceedling编译后需要在目标机器环境下运行才能生效…

【数据结构C++】表达式求值(多位数)课程设计

&#x1f4da;博客主页&#xff1a;Zhui_Yi_ &#x1f50d;&#xff1a;上期回顾&#xff1a;图 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f387;追当今朝天骄&#xff0c;忆顾往昔豪杰。 …

elementUI实现上传excel文件并传给后端

我们选择一个按钮来实现上传&#xff0c;点击上传按钮&#xff0c;可从本地选择文件上传&#xff0c;确定后传递给后端。 首先&#xff0c;封装一个按钮&#xff1a; <el-uploadstyle"display: inline-block"action"string":limit"1":file-li…

使用ASM为一个类增加属性工具类

使用ASM可以方便的访问和修改一个类&#xff0c;或者在JVM载入前动态更新一个类也是可以的&#xff0c;如下&#xff0c; 为一个类动态增加一个属性&#xff0c;类Student如下&#xff1a; public class Student {private int age;private String name;public int getAge() {…

【机器学习】第7章 集成学习(小重点,混之前章节出题但小题)

一、概念 1.集成学习&#xff0c;顾名思义&#xff0c;不是一个玩意&#xff0c;而是一堆玩意混合到一块。 &#xff08;1&#xff09;基本思想是先 生成一定数量基学习器&#xff0c;再采用集成策略 将这堆基学习器的预测结果组合起来&#xff0c;从而形成最终结论。 &#x…

第2天:变量与数据类型

学习目标 理解变量的概念和命名规则掌握Python中的基本数据类型学会进行数据类型转换 学习内容 1. 变量 变量是存储数据的容器&#xff0c;可以把数据保存在内存中供程序使用。在Python中&#xff0c;变量的声明和赋值非常简单&#xff0c;不需要像Java那样显式声明类型。 …

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式&#xff0c;已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候PDF文件内存会比较大&#xff0c;给我们的存储和传输带来了很大的不便。因此&#xff0c;学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…

【Python教程】压缩PDF文件大小

压缩 PDF 文件能有效减小文件大小并提高文件传输的效率&#xff0c;同时还能节省计算机存储空间。除了使用一些专业工具对PDF文件进行压缩&#xff0c;我们还可以通过 Python 来执行该操作&#xff0c;实现自动化、批量处理PDF文件。 本文将分享一个简单有效的使用 Python 压缩…

Python异常处理最佳实践与文件读取异常示例

Python异常处理最佳实践与文件读取异常示例 一、引言 在Python编程中&#xff0c;异常处理是一个至关重要的部分。它能够帮助我们识别和处理程序运行时出现的错误&#xff0c;确保程序的稳定性和可靠性。本文将介绍Python中处理异常的最佳实践&#xff0c;并通过一个文件读取…

【Qt6.3 基础教程 07】信号与槽:Qt编程的心脏

文章目录 前言信号与槽机制简介信号&#xff08;Signals&#xff09;槽&#xff08;Slots&#xff09; 如何使用信号与槽连接信号和槽创建自定义槽使用Lambda表达式 信号与槽的高级用法结论 前言 在任何现代图形用户界面(GUI)框架中&#xff0c;响应用户行为是最重要的功能之一…

js语法---理解防抖原理和实现方法

什么是防抖&#xff08;节流&#xff09; 在实际的网页交互中&#xff0c;如果一个事件高频率的触发&#xff0c;这会占用很多内存资源&#xff0c;但是实际上又并不需要监听触发如此多次这个事件&#xff08;比如说&#xff0c;在抢有限数量的优惠券时&#xff0c;用户往往会提…