相机标定的原理

1.相机标定资料

这个视频是建议有一定基础的去看,详细介绍了整个标定的过程。

https://www.bilibili.com/video/BV1R7411m7ZQ/?spm_id_from=333.337.search-card.all.click&vd_source=c205d4d10f730a57820343328741984a

这个文章基础一点,可以先看

https://blog.csdn.net/sunshine_zoe/article/details/73457686

https://zhuanlan.zhihu.com/p/642155792?utm_id=0

在这里插入图片描述

2.案例分析

这里用sick的visionary 相机的sdk做分析

2.0基本参数定义

cxcy 就是图像坐标系下的原点在像素坐标系下的坐标,其中fx和fy表示每一列和每一行分别代表1mm多少个像素,即1mm=fx pix
k1k2是径向畸变的参数
f2c 是标定的z的起始位置,后面在介绍
在这里插入图片描述

class CameraParameters:""" This class gathers the main camera parameters. """def __init__(self, width=176, height=144,cam2worldMatrix=None,fx=146.5, fy=146.5, cx=84.4, cy=71.2,k1=0.326442, k2=0.219623,f2rc=0.0):self.cam2worldMatrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]self.width = widthself.height = heightif cam2worldMatrix:self.cam2worldMatrix = cam2worldMatrixself.fx = fxself.fy = fyself.cx = cxself.cy = cyself.k1 = k1self.k2 = k2self.f2rc = f2rc

2.1 visionary-s 双目

在这里插入图片描述
在这里插入图片描述

         # transform into camera coordinates (zc, xc, yc)#像素坐标系转为图像坐标系xp = (myCamParams.cx - col) / myCamParams.fxyp = (myCamParams.cy - row) / myCamParams.fy# coordinate system local to the imager# 图像坐标系转为相机坐标系 f=1 ,所以 xc=(xp*zc)/f #yc=(yp*zc)/fzc = distData[row][col]xc = xp * zcyc = yp * zc# convert to world coordinate system#相机坐标系转世界坐标系 ,因为矩阵m_c2w是一个单位矩阵。所以xyz还是原来的值xw = (m_c2w[0, 3] + zc * m_c2w[0, 2]  + yc * m_c2w[0, 1] + xc * m_c2w[0, 0])yw = (m_c2w[1, 3] + zc * m_c2w[1, 2]  + yc * m_c2w[1, 1] + xc * m_c2w[1, 0])zw = (m_c2w[2, 3] + zc * m_c2w[2, 2]  + yc * m_c2w[2, 1] + xc * m_c2w[2, 0])

2.2 visionary-tmini tof

  #calculate radial distortion# 像素坐标系转图像坐标系xp = (myCamParams.cx - col) / myCamParams.fxyp = (myCamParams.cy - row) / myCamParams.fy# 畸变校正r2 = (xp * xp + yp * yp)r4 = r2 * r2k = 1 + myCamParams.k1 * r2 + myCamParams.k2 * r4xd = xp * k # 畸变校正yd = yp * kd = distData[row][col]  #实际的距离值,不是z而是 np.sqrt(x*x + y*y + z*z)s0 = np.sqrt(xd*xd + yd*yd + 1) #  计算当前的坐标点在z=1的时候的d#  d/s0 就是实际的z值# 图像坐标系转相机坐标系 也是f=1  所以直接乘以z值xc = xd * d / s0yc = yd * d / s0zc = d / s0 - myCamParams.f2rc# convert to world coordinate systemxw = (m_c2w[0, 3] + zc * m_c2w[0, 2]  + yc * m_c2w[0, 1] + xc * m_c2w[0, 0])yw = (m_c2w[1, 3] + zc * m_c2w[1, 2]  + yc * m_c2w[1, 1] + xc * m_c2w[1, 0])zw = (m_c2w[2, 3] + zc * m_c2w[2, 2]  + yc * m_c2w[2, 1] + xc * m_c2w[2, 0])

3. 2D相机的手眼标定

看了上面的案例 ,我们发现相机的sdk只做了2个矩阵的计算。也就是把像素坐标转为实际的相机坐标。真正要使用的话还缺少 相机转为机器人、法兰盘、工作坐标系。其实这些都是上面文章所说的相机转世界坐标系。也就是需要求R T 旋转加平移。所以理论上我们只需要3个标定点就可以。

https://www.xjx100.cn/news/433771.html?action=onClick

3.1欧拉角

https://www.guyuehome.com/43450#2__148
在这里插入图片描述

https://blog.csdn.net/weixin_43134049/article/details/122826538?spm=1001.2014.3001.5501

4. 3D点云的手眼标定

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

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

相关文章

day24 java IO流 对象流 序列化与反序列化

对象流:ObjectInputStream 和 ObjectOutputStream 可以把内存中的数据(基本数据类型数据,对象的处理流)持久化起来。需要的时候可以还原成内存层面的数据。序列化:用ObjectOutputStream类保存基本类型数据或对象的机制…

【YOLOv8改进[注意力]】YOLOv8添加DAT(Vision Transformer with Deformable Attention)助力涨点

目录 一 DAT 二 YOLOv8添加DAT助力涨点 1 总体修改 2 配置文件 3 训练 其他 一 DAT 官方论文地址:https://openaccess.thecvf.com/content/CVPR2022/papers/Xia_Vision_Transformer_With_Deformable_Attention_CVPR_2022_paper.pdf Transformers最近在各种视…

python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

轻松搭建llama3Web 交互界面 - Ollama + Open WebUI

Ubuntu下安装:(官网:Download Ollama on Linux) curl -fsSL https://ollama.com/install.sh | sh 就运行起来ollama了,不放心可以用ollama serve查看一下 ollama run llama3 就可以跑起来了, 那么我们肯…

信息物理系统技术概述_1.概念和实现

1.信息物理系统的概念 1.1信息物理系统的来源 信息物理系统(Cyber-Physical Systems,CPS)这一术语,最早由美国国家航天局于1992年提出,到2006年,美国国家科学基金会科学家海伦 •吉尔在国际上第一个关于信…

端口转发与端口映射区别

端口映射和端口转发是两种不同的网络技术,用于实现服务器或设备之间的通信。 端口映射是将一台设备(通常是路由器或防火墙)的公共IP地址和端口映射到内部网络中的另一台设备的特定IP地址和端口上。当外部网络上的请求到达公共IP地址和端口时…

【SAP ME 12】SAP NWDS(eclipse)下载、安装,配置

1、下载 1.1、描述 1.2、下载 2、安装 3、配置 3.1、域名映射

windows10环境下conda迁移到linux环境

网上给出的方案错误百出,记录一下正确方案。 1 创建yaml文件 创建到终端所在路径下 conda activate 环境名 conda env export --no-build >环境名.yaml2 新操作系统中创建新的conda环境 conda env create -f 环境名.yaml3 删除不兼容的包 终端报错 Could n…

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

我的一些 35+ 前同事的现状

大家好,我是坤哥,好久不见,今天简单和大家聊一下我目前观察到的前同事的现状 今年和一些前同事简单聊过,他们的现状如下: A: 去新西兰做 iOS 开发快 10 年了,马上就要拿到永久居留证了,他说在新…

(六)小案例银行家应用程序-删除账号-findindex方法

findindex方法和find方法非常类似,只不过findindex顾名思义,他返回的是index; ● 下面我们使用删除账号的功能来学习一下findindex的 ● 当用户登录成功之后,可以在下方输入自己的用户名和密码,然后提交&#xff0c…

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

Redis入门到通关之Redis数据结构-String篇

文章目录 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。 博客特色: 在我的…

HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

上一节笔者给大家讲解了 JS 引擎解释执行到 import 语句的加载流程,总结起来就是利用 dlopen() 方法的加载特性向 NativeModuleManager 内部的链接尾部添加一个 NativeModule,没有阅读过上节文章的小伙伴,笔者强烈建议阅读一下,本…

如何定义带参数的EventHandler?

简述 事件调用的所有方法都需要两个参数:object sender,EventArgs e。该事件使用这两个参数调用方法,因此我们不能直接添加自定义参数。 比如下面这段代码,我们想在 MessageBox 中显示字符串 s ,这必然是不成。 priv…

初识《list》及手搓模拟《list》

目录 前言: 1. list的介绍及使用 list的介绍: list的使用: 1、list的构造​编辑 2、list iterator的使用 3、list capacity 4、list element access 5、list modifiers 2.list的模拟实现 1、关于迭代器: 2、迭代器类的…

ScriptableObject数据容器讲解

概述 是Unity提供的一个用于创建可重用的数据容器或逻辑的基类。 ScriptableObject 是继承自 UnityEngine.Object 的一个类,但与普通的 MonoBehaviour 不同,它不能附加到GameObject上作为组件。 相反,ScriptableObject 通常用于存储和管理…

操作系统的作用

操作系统的作用 硬件资源管理 进程管理:操作系统负责创建、调度、同步、通信和销毁进程,即管理多个程序的并发执行。通过进程调度算法,它决定哪个进程在何时获得处理器执行时间,实现多任务处理和资源共享,确保系统响应性和公平性。…

ThingsBoard实战教程(七):模拟设备遥测

tb做为一个多租户的物联网平台,文档也很齐全。后端使用的是java语言编写的,可以用swagger来导出文档。tb的所有服务都可以通过接口来看到。接口主要分为两部分,一部分是设备API,另一部分是用于服务端API。 在我们启动tb之后,可以通过http://ip +port/swagger-ui.html 来…

linux,从零安装nginx,并且部署vue应用程序

前言:系统使用龙蜥(8.5)的最小化安装,服务器安装这里不在赘述。 nginx 的版本:1.22.0 软件已经放在系统/home/software/ 一、安装nginx 进入路径/home/software/ 1》执行命令:rpm -ivh nginx-1.22.0-1.el7…