鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]
由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。
参考链接:
鱼眼镜头的成像原理到畸变矫正(完整版)
相机模型总结(针孔、鱼眼、全景)
三维空间中判断射线与平面是否相交
相机外参标定误差对目标测距的影响分析(待整理)
像素坐标转到世界坐标时相机坐标系中的Zc值求解
一文简要介绍鱼眼镜头/相机投影成像过程
一文详解分析鱼眼相机投影成像模型和畸变模型
相机模型-鱼眼模型(fisheye camera model)
SLAM 中常用的相机模型&畸变模型总结
最后两位大哥写的特别好,原理部分写的很详细也很全,我就不打算复制粘贴了,我从归一化坐标开始写,感谢大佬们的无私奉献!!
文章目录
- 1 投影过程
- 2 反投影过程
- 3 推导射线与地面交点
- 3.1 归一化相机坐标系下的射线:
- 3.2 射线在世界坐标系下的表示:
- 4 求解射线与地面交点
- 4.1 计算距离:
1 投影过程

2 反投影过程

我这里是像素坐标系转世界坐标系,对应着反投影过程,到第五步已经得到单位球面坐标系里的位置。
这里分两种方法:
- 根据 像素坐标转到世界坐标时相机坐标系中的Zc值求解 这位作者写的,先计算出Zc的值,再根据像素坐标算出世界坐标系的位置,作者也给出了python的代码,目前我觉得思路没啥问题。
- 推导从相机光心出发,通过像素点(u, v)的射线与地面的交点,解出交点,这个交点就是像素坐标系转到世界坐标系的位置。

很重要的几个知识点:
- 鱼眼相机成像模型近似为单位球面投影模型。根据投影函数的不同将鱼眼相机的设计模型大致分为等距投影模型、等立体角投影模型、正交投影模型和体视投影模型四种。相机的成像模型实际上表征的是成像的像高与入射角之间的映射关系。
- 不管是针孔相机模型,还是鱼眼相机模型,其成像过程都涉及到四个坐标系:世界坐标系、相机坐标系、图像物理坐标系、图像像素坐标系以及这四个坐标系间的转换。具体的成像原理请看参考文献,大佬们写的非常好。
- 鱼眼相机和针孔相机成像的不同之处: 在鱼眼模型中会将相机下的空间点, 先转换为归一化相机球面上,再从球面投影到平面上。针孔相机将空间点直接投影到平面上。
- 不管是鱼眼相机模型还是针孔相机模型(我目前接触过的两种相机,其他相机没仔细研究过), 假设在图像平面中有一个接地点的像素坐标P=(u, v), 将该点转换为归一化相机坐标系下的点Pc,由于Pc是归一化坐标,它实际上代表了从相机光心出发,通过像素点P=(u, v)的射线方向。这条射线与地平面 (Z=0) 的交点就是接地点的3D位置。[写到这里是不是很清楚了,看到了啥,射线方程啊,兄弟们!!所以要做的事情就是推导出这个交点,求解出交点,有了这个交点要测距的话就算出距离]
3 推导射线与地面交点
3.1 归一化相机坐标系下的射线:
设归一化坐标系下的射线方向向量为d,t 表示射线上的一点距离相机光心的标量,表示沿射线的距离,那么在归一化相机坐标系下,相机作为原点,所以射线的方程可以表示为:
Pc(t) = t * d
3.2 射线在世界坐标系下的表示:
将射线从相机坐标系转换到世界坐标系,R是相机旋转矩阵, T 是相机的平移向量:
Pw(t) = R * Pc(t) + T
4 求解射线与地面交点
射线与地面的交点在世界坐标系下的 Z 值为 0,因此:
Pw(t)(z) = 0 就是z为0
( R * Pc(t) + T)(z) = 0 就是把上面那个公式带了进来
( R * t * d + T)(z) = 0 那个Pc(t) 带了进来
t * (R * d)z + Tz = 0 这些都是可以立即推的
即射线方向向量在世界坐标系下的表示:dw = R * d
解出t:
t = − T z ( d w ) z t=-\frac{T_z}{(d_w)_z} t=−(dw)zTz = − z c d w , z =-\frac{z_c}{d_{w,z}} =−dw,zzc
现在有了射线方向dw和沿着射线的距离t,可以找到交点Pw:
P w = R ⋅ ( − T z ( d w ) z ⋅ d ) + T {P_w}=R \cdot (-\frac{T_z}{(d_w)_z} \cdot d) + T Pw=R⋅(−(dw)zTz⋅d)+T
P w = R ⋅ ( − z c d w , z ⋅ d ) + T {P_w}=R \cdot (-\frac{z_c}{d_{w,z}} \cdot d) + T Pw=R⋅(−dw,zzc⋅d)+T
4.1 计算距离:
最后,计算交点Pw与相机在 XY 平面上的投影距离。相机的位置是(xc, yc, zc),
d i s t = ( P w , x − T x ) 2 + ( P w , y − T y ) 2 dist= \sqrt{(P_{w,x} - T_x)^2 + (P_{w,y} - T_y)^2} dist=(Pw,x−Tx)2+(Pw,y−Ty)2
- 这个计算假设地面是平坦的,并且与 XY 平面对齐。在实际情况中,地面可能不完全平坦,或者与 XY 平面不是完全对齐的,需要额外的校正。
- 以上便是基于针孔相机模型的测距推导完整过程,基于这个过程可以用来研究相机外参参数对测距结果的具体影响。

总结:
- 别人也做了实验验证误差部分,我没做实验我也不贴别人的结论了。
- 很长时间内,我都不明白为啥我算出来的3D位置总是有问题,我拿到的3D位置跟激光雷达给出来的误差那么多,我一直觉得我的射线方程部分没写错,就今天我才知道我错哪里了。Pw的方程那边一定要写对,我就是解 t 的时候代码里少了负号,死活找不到原因,死活觉得我的理论没问题啊。真的是哪哪都对,就是结果不对。非常确定自己的理论没问题就去看看自己写的代码,一行一行看,没准有惊喜。
相关文章:
鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]
由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。 参考链接: 鱼眼镜头的成像原理到畸变矫正(完整版) 相机模型总结(针孔、鱼眼、全景) 三维…...
谈谈Python中的列表、元组、字典和集合的主要区别和用法
谈谈Python中的列表、元组、字典和集合的主要区别和用法 Python是一种功能强大且易于学习的编程语言,它提供了多种数据结构来支持各种编程需求。其中,列表(list)、元组(tuple)、字典(dictionar…...
【WPF应用24】C#中的Image控件详解与应用示例
在C#应用程序开发中,图像显示是一个常见的需求。无论是创建图形界面还是处理图像数据,System.Windows.Controls.Image控件都是实现这一目标的重要工具。本文将详细介绍Image控件的功能、用法、优化技巧以及一些实际应用示例,帮助开发者更好地…...
CTF题型 php://filter特殊编码绕过小汇总
CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议,它允许你读取经过过滤器处理的数据流…...
【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】
目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正…...
网络编程的学习1
网络编程 在网络通信协议下,不同计算机上运行的程序,进行数据传输。 三要素 ip:设备在网络中的地址,是唯一的标识。 ipv4:采取32位地址长度,分成4组。 ipv6:采用128位地址长度,分成8组。 …...
spark log4j日志文件动态参数读取
需要在log4j xml文件中设置动态参数,并支持spark任务在集群模式下,动态参数读取正常; 1.log4j配置文件 log4j2.xml <?xml version"1.0" encoding"UTF-8"?> <Configuration status"info" name&quo…...
设计模式,装修模式,Php代码演示,优缺点,注意事项
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许动态地向一个现有对象添加新的功能或行为,而不改变其原始结构。在 PHP 中,可以使用类的继承和组合来实现装饰模式。下面是一个简单的 PHP 装饰模式示例代码&am…...
ubuntu下vscode ctrl+tab松开ctrl后不自动选中文件
vscode用ctrltab切换文件时,松开ctrl键后会自动选中切换的文件。 但是在ubuntu下发现有时不能自动选中切换的文件,需要再次按enter键才能打开文件。 经过测试发现解决方法有两个: 方法1:确认wayland状态,关闭wayland…...
【云开发笔记No.19】关于中台架构(1)
在云开发领域,中台架构是一种至关重要的组织架构,它为企业提供了一种灵活且高效的方式来应对市场的快速变化。下面将详细阐述中台架构的定义、起源、定位和价值。 中台架构的定义 中台架构是指在企业信息系统中,将业务流程、数据和应用系统…...
对于提高Web安全,WAF能有什么作用
数字化时代,网络安全已经成为了一个不可忽视的重要议题。网络攻击事件频发,各种安全隐患层出不穷,如何有效地保护我们的网络空间,确保信息安全,已成为一项迫切的任务。而Web应用防火墙,正是守护网络安全的一…...
Go 源码之 gin 框架
Go 源码之 gin 框架 go源码之gin - Jxy 博客 一、总结 gin.New()初始化一个实例:gin.engine,该实例实现了http.Handler接口。实现了ServeHTTP方法 注册路由、注册中间件,调用addRoute将路由和中间件注册到 methodTree 前缀树(节…...
BM19 寻找峰值(二分查找)
import java.util.*; public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param nums int整型一维数组 * return int整型*/public int findPeakElement (int[] nums) {// write code hereint lef…...
4.数组和切片【go】
数组是具有固定数量的元素的序列,而切片是对数组的一个连续片段的引用。切片是Go中常用的数据结构 数组(Array) 数组是一个具有固定长度且元素类型相同的序列。在Go中,数组的长度是其类型的一部分,因此[5]int和[10]int是不同的数组类型。数组的长度在声明时必须指定,并…...
Abaqus周期性边界代表体单元Random Sphere RVE 3D (Mesh)插件
插件介绍 Random Sphere RVE 3D (Mesh) - AbyssFish 插件可在Abaqus生成三维具备周期性边界条件(Periodic Boundary Conditions, PBC)的随机球体骨料及骨料-水泥界面过渡区(Interfacial Transition Zone, ITZ)模型。即采用周期性代表性体积单元法(Periodic Representative Vol…...
家庭记账本(源码+文档)
家庭记账本系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明含有功能项目截图客户端我的界面图表明细添加账单登录页明细注册页个人资料 后台管理用户管理后台登录页分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参…...
深度学习评价指标(1):目标检测的评价指标
1. 简述 在计算机视觉/深度学习领域,每一个方向都有属于自己的评价指标。通常在评估一个模型时,只需要计算出相应的评价指标,便可以评估算法的性能。同时,所谓SOTA,皆是基于某一评价指标进行的评估。 接下来࿰…...
jmeter性能压测的标准和实战中会遇到的问题
1.性能标准建议 CPU 使用率:不超过 70% 内存使用率:不超过 70% 磁盘:%util到达80%严重繁忙 (os.disIO.filesystem.writeKbPS 每秒写入的千字节) 响应时间:95%的响应时间不超过8000ms 事务成功率:…...
6-82 求链式线性表的倒数第K项
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。 输出格式: 输出倒数第K个位置上的数据。如果这个位置不存在,输出错误…...
CDH集群hive初始化元数据库失败
oracle数据库操作: 报错如下:命令 (Validate Hive Metastore schema (237)) 已失败 截图如下: 后台日志部分摘录: WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
