鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]
由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。
参考链接:
鱼眼镜头的成像原理到畸变矫正(完整版)
相机模型总结(针孔、鱼眼、全景)
三维空间中判断射线与平面是否相交
相机外参标定误差对目标测距的影响分析(待整理)
像素坐标转到世界坐标时相机坐标系中的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…...
PC市场转型:从性能竞赛到价值回归的产业变革
1. 市场格局的深层演变:从“性能至上”到“够用就好”如果你在2012年前后关注过PC市场,应该能清晰地感受到一股寒流。那几年,行业里最热门的话题不再是英特尔又发布了多快的处理器,或者英伟达的显卡性能提升了多少百分比ÿ…...
从HackRF到USRP B210:我的SDR设备升级之路与真实体验对比
从HackRF到USRP B210:我的SDR设备升级之路与真实体验对比 作为一个长期沉迷于软件定义无线电(SDR)技术的爱好者,设备的选择往往决定了探索的边界。从最初的HackRF One到如今的USRP B210,这段升级旅程不仅是对硬件性能的…...
Unity中Spine混合模式插槽的Shader实现与优化
1. Spine混合模式插槽的核心问题解析 当你把Spine动画导入Unity后,发现角色颜色变得灰蒙蒙的,就像蒙了一层雾。这种情况在游戏开发中特别常见,尤其是当美术同学在Spine编辑器中精心调制的渐变效果,到了Unity里却完全走样。问题的根…...
Cloudflare + PlanetScale:在边缘运行全栈应用,数据库也不例外
全栈开发者面对的一道老难题 Cloudflare Workers 解决了计算层的全球分发问题——你的代码跑在 Cloudflare 遍布全球的 300 多个数据中心里,离用户近,启动快,不需要管理任何服务器。 但数据不一样。 数据库天然是"有状态的"&#x…...
Google Maps路线优化突遭瓶颈?Gemini大模型如何将平均行程时间压缩23.6%(2024Q2实测数据)
更多请点击: https://intelliparadigm.com 第一章:Google Maps路线优化突遭瓶颈?Gemini大模型如何将平均行程时间压缩23.6%(2024Q2实测数据) 当Google Maps在高并发城市网格中遭遇动态交通建模失准、实时事件响应延迟…...
BIOS里找不到SSD硬盘?Win10启动失败?可能是ESP引导分区‘隐身’了,手把手教你用PE盘和DiskGenius把它找回来
BIOS里找不到SSD硬盘?Win10启动失败?可能是ESP引导分区‘隐身’了 最近遇到一个奇怪的故障:明明SSD硬盘在PE系统里能正常识别,但BIOS启动项里却死活找不到它。系统反复提示"reboot and select proper boot device"&…...
别再只调参了!搞懂MaxPool2D的padding=‘same‘和‘valid‘,让你的CNN模型效果立竿见影
别再只调参了!搞懂MaxPool2D的paddingsame和valid,让你的CNN模型效果立竿见影 在构建卷积神经网络(CNN)时,许多开发者习惯性地将注意力集中在卷积核大小、激活函数选择等显性参数上,却常常忽略池化层中padd…...
CANN/asc-devkit FreeAllEvent API文档
FreeAllEvent 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.c…...
Arm Musca-B1芯片I/O多路复用器架构与配置详解
1. Arm Musca-B1测试芯片I/O多路复用器架构解析I/O多路复用器(IOMUX)是现代嵌入式系统中实现引脚功能复用的核心模块。在Arm Musca-B1测试芯片中,这一设计允许单个物理引脚通过寄存器配置动态切换多种功能信号路径。这种架构设计显著提升了芯…...
04 - 运行 rocrtst 第一个测试
本文档帮助你成功运行 rocrtst 的第一个测试,并掌握各种运行方式。 1. 运行前检查清单 在运行测试之前,确认以下条件: # ✅ 1. rocrtst64 已构建并安装 ls $ROCM_PREFIX/bin/rocrtst64# ✅ 2. GPU kernel 已编译(检查你的 GPU …...
