3.相机标定原理及代码实现(opencv)

1.相机标定原理

        相机参数的确定过程就叫做相机标定。

1.1 四大坐标系及关系

(1)像素坐标系(单位:像素(pixel))

        像素坐标系是指相机拍到的图片的坐标系,以图片的左上角为坐标原点,坐标表示为

(2)图像坐标系(单位:mm)

        以CCD 图像平面的中心为坐标原点,X轴和Y 轴分别平行于图像平面的两条垂直边。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。表示为:,其 x 轴和 y 轴分别与像素坐标系的 u 轴,v 轴平行。图像上任意一个像素在两个坐标系的映射关系为:

        其中,单个像素在 x 轴和 y 轴的实际物理距离为 dx 和 dy,将上式转换成齐次方程式为(像素坐标系与图像坐标系之间的转换关系):

(3)相机坐标系(单位:mm)

        图像坐标系虽建立起图像与现实世界的物理关系,但这只是二维关系,因此,需要建立与三维世界相关的相机坐标系。图像坐标系是相机坐标系的某一平面,相机坐标系 的x轴和y轴与图像坐标系对应轴平行,两个坐标系间的距离就是相机的焦距f。其以相机光心为坐标原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,光轴为z轴,可以用(𝑋c, 𝑌c, 𝑍c )来表示。

        我们可以通过两个正的相似三角形可以得到图像坐标系和相机坐标系的关系:

        用齐次坐标系和矩阵表示上述关系:

(4)世界(大地)坐标系(单位:mm)

        相机坐标系是以相机为中心的描述现实世界的三维坐标系。在现实空间中,存在无数坐标系可以描述三维空间,为了确定三维空间点的具体位置,需要确定唯一一个基准坐标系来表述空间,这就是世界坐标系,用(𝑋w, 𝑌w, 𝑍w)来表示。

        其中,R 为 3×3 单位正交矩阵,表示了坐标系的旋转操作;t 为三维平移向量,代表了坐标系的平移操作;0 表示三维零向量。

(5) 四个坐标系之间的关系总结

        由上面前4步可以知道,四个坐标系的关系如下:

1.2 相机标定

        相机标定就是要通过一定的方法对特定图像(棋盘格角点检测)计算出这个相机本身的一些参数,包扩:内参矩阵A,外参矩阵[R|T]、畸变系数[k1,k2,k3,,p1,p2,]。内参矩阵各元素意义:一个像素的物理尺寸dx和dy,焦距f ,图像物理坐标的扭曲因子gama,图像原点相对于光心成像点的纵横偏移量cx和cy(像素为单位)。外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。畸变系数:包括相机的径向畸变系数k1,k2,k3,和相机的切向畸变系数p1,p2,。需要的器材:一个黑白棋盘格的标定板,一个相机拍摄的不同角度或距离的棋盘格图像至少三张以上。

        相机的标定是根据像素坐标系与世界坐标系的关系,利用一定的约束条件,来求解相机的内外参数以及畸变系数的过程。

        传统的标定方法一般以棋盘格作为参照物,其中每个棋盘格的大小,尺寸以及棋盘格的数量都是已知的。标定过程就是,将棋盘格的顶点与图像上的对应点建立对应关系,利用棋盘格的已知信息来求得相机模型的内外参数和畸变系数。这种标定方法通常有张正友标定法和 Tasi 两步标定法等。这种方法容易受到标定物的制作精度的影响,但精度仍比另一种方法高。

张正友标定法

        张正友标定法的基本步骤是:在不同角度下,对标定参考物(棋盘格)进行拍摄,然后提取出棋盘格的顶点,接着解析出相机的畸变系数和内外参数,最后再根据极大似然估计,对参数进行优化。

        其中,M1为相机内参矩阵。

        设单应性矩阵 H 满足

,其中 λ 是尺度因子,由 于𝑟1和𝑟2正交,所以可得以下约束条件:

        由以上两式可以看出,ℎ1和ℎ2是可以通过单应性求解出来的,所以要求解的参数就变成 𝑀1矩阵中的未知的 5 个参数,可以通过三个单应性矩阵来求解这 5 个参数,三个单应性矩阵可以通过三张对同一标定板不同角度和高度的照片获得

        相机内参为:

        相机外参为:

        上述推导的结果都是在理想情况下得到的,没有任何噪声和干扰,但噪声是无法避免的。因此,在实际标定中,还需要使用极大似然法来对参数进行优化。 至此,单目相机就标定完成,但对于双目视觉系统,不仅要对每个相机进行标定,同时还要明确相机间的相互关系,因此还要对双目相机进行进一步的标定,即求取相机间的旋转矩阵和平移向量。

        由第一式可知左右相机的对应关系,由第二式和第三式可知,只需要知道每个相机的外参数,就可以求得双目相机的旋转矩阵和平移向量。

2.相机标定代码

        在这里我们用pycharm进行相机标定,用到了opencv库,所以在标定前需要安装好pycharm和opencv库。具体操作可以参照博客OpenCV-Python 相机标定入门详细教程 + 实例_opencv相机标定实例python-CSDN博客。

       首先进入 [2]一个开源的视觉机械臂项目:hta0下载标定代码(代码路径:hta0-horizontal-robot-arm - GitCode)。

        然后根据以上博客的步骤操作即可(已经写的很详细)。

        另外的代码实现也可以参考博客OpenCV学习笔记与代码示例(三):张氏标定法标定相机原理及函数详解-CSDN博客。主要是c++的实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工厂人员定位系统介绍及解决方案

着现代工业不断发展,工厂人员定位系统已经广泛的用于各个大型工厂,这主要是因为UWB人员定位系统功能性非常强大,发挥着更加全面的功能优势,满足了不同厂区对工作环境的管理。而它的出现,将人员定位系统达到了更加精准的…

CISCN2024 RE 后两道 wp 复现

5. gdb_debug 其实逻辑还是挺简单的,当时没认真做 伪代码还算清晰 几个循环的加密之后判断密文 难点是前面有随机数参与加密,不过可以猜测随机数是不变的。 第一段加密 flag异或一组随机数,这里可以在异或的位置下条件断点,用…

windows信息收集和提权

目录 手动收集 工具收集 windows本地内核提权 本地提权 根据windows去找需要的exp进行利用 提权后结合mimikatz使用 msf提权 简单提权 生成后门 上线 BypassUAC绕过UAC提权 msf带的bypassuac模块可以尝试提权 Bypassuac提权命令操作 提权成功 ​local_exploi…

【python】随机森林预测汽车销售

目录 引言 1. 数据收集与预处理 2. 划分数据集 3. 构建随机森林模型 4. 模型训练 5. 模型评估 6. 模型调优 数据集 代码及结果 独热编码 随机森林模型训练 特征重要性图 混淆矩阵 ROC曲线 引言 随机森林(Random Forest)是一种集成学习方法…

全网最炸裂的5款SD涩涩模型!身体真的是越来越不好了!建议收藏,晚上自己偷偷打开看!

很多人说,**自从学了SD后,身体一天不如一天了。**今天就再接再厉,给大家推荐5个涩涩的模型。 【身材调节器】 顾名思义,这个lora可以帮你在出图时凹出想要的S型曲线。出图效果的大小由lora的权重来设定,权重越小越贫穷…

本地开发微信小程序,使用巴比达内网穿透

在微信小程序开发的热潮中,开发者常面临的一个挑战是如何在复杂的网络环境下测试和调试内网环境中的服务。巴比达正为这一难题提供了一条解决方案,极大简化了微信小程序与内网服务器之间通信的流程,加速了开发迭代周期。 以往,开…

3D渲染模型是白色的?问题出在以下6点,教你快速解决!

你的3D模型渲染出来是不是黑色、白色、粉色或者扭曲的? 出现这种情况很有可能是你的贴图纹理丢失或损坏! 幸运的是,有一些常见的方法可以解决此问题并恢复纹理。在本文中,小编将分享如何排查和解决不同方案下的纹理问题。通常问…

小红书的大模型有点「怂」

大模型发展至今,各个公司都根据自己的业务发布了各自的大模型。而小红书作为种草类产品的代表,自研的大模型一直引而不发,还在内测阶段。 AI以及自研大模型的持续火热,让以原创内容为主导的小红书坐不住了。 近期,据多…

本周六!上海场新能源汽车数据基础设施专场 Meetup 来了

本周六下午 14:30 新能源汽车数据基础设施专场 Meetup 在上海,点击链接报名 🎁 到场有机会获得 Greptime 和 AutoMQ 的精美文创周边哦~ 🔮 会后还有观众问答 & 抽奖环节等你来把神秘礼物带回家~ 🧁 更…

傅里叶级数的3D表示 包括源码

傅里叶级数的3D表示 包括源码 flyfish 傅里叶级数的基本形式 : y ( t ) ∑ n 1 , 3 , 5 , … N 4 A n π sin ⁡ ( n π T t ) y(t) \sum_{n1,3,5,\ldots}^{N} \frac{4A}{n\pi} \sin\left(\frac{n\pi}{T} t\right) y(t)n1,3,5,…∑N​nπ4A​sin(Tnπ​t) 其中&…

WPF/C#:在WPF中如何实现依赖注入

前言 本文通过 WPF Gallery 这个项目学习依赖注入的相关概念与如何在WPF中进行依赖注入。 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现控制反转(Inversion of Control&#xff0…

Apache Hadoop完全分布式集群搭建指南

Hadoop发行版本较多,Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称CDH)收费版本通常用于生产环境,这里用开源免费的Apache Hadoop原始版本。 下载:Apache Hadoop 版本下载&#x…

华盈生物-PhenoCycler-超多靶标揭示组织空间位置和互作关系

华盈生物获得美国Akoya公司认证的PhenoCycler-Fusion(原CODEX)空间单细胞蛋白组技术服务商,并进入该技术的全球CRO服务提供者网络:CRO Service Providers | Akoya Biosciences为科研工作者提供为更具有精准医学特色的服务&#xf…

Failed to start mysql.service:Unit mysql.service not found(100%成功解决问题)

问题:在ubuntu中安装mysql后,启动mysql报错 你能看到我这篇文章,是非常幸运的! 安装mysql-server: 然后启动mysql报错: 那要怎么处理呢?easy,跟着下面的步骤操作就好了 首先,先卸…

算法训练营day28--134. 加油站 +135. 分发糖果+860.柠檬水找零+406.根据身高重建队列

一、 134. 加油站 题目链接:https://leetcode.cn/problems/gas-station/ 文章讲解:https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 视频讲解:https://www.bilibili.com/video/BV1jA411r7WX 1.1 初见思路 得模拟分析出…

php快速入门

前言 php是一门脚本语言,可以访问服务器,对数据库增删查改(后台/后端语言) 后台语言:php,java,c,c,python等等 注意:php是操作服务器,不能直接在…

教学神器大比拼:SmartEDA、Multisim、Proteus,谁是你的最佳选择?

随着科技的飞速发展,教学工具也在不断升级。在电子设计自动化(EDA)和电路仿真领域,SmartEDA、Multisim和Proteus三款软件备受关注。那么,对于广大教育工作者和学生们来说,这三者之间该如何选择呢&#xff1…

goaccess分析json格式日志

一.安装使用yum安装,yum install goaccess 二.主要介绍格式问题 1.nginx日志格式如下: log_format main escapejson {"time_local":"$time_local", "remote_addr":"$remote_addr", "r…

解决鸿蒙开发中克隆项目无法签名问题

文章目录 问题描述问题分析解决方案 问题描述 在一个风和日丽的早晨,这是我学习鸿蒙开发的第四天,把文档过了一遍的我准备看看别人的项目学习一下,于是就用git去clone了一个大佬的开源项目,在签名的时候遇到了问题: h…

docker 上传镜像到hub仓库

要将 Docker 镜像上传到 Docker Hub,你需要按照以下步骤操作: 登录 Docker Hub 首先,你需要登录到 Docker Hub。打开终端并运行以下命令:docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…