鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]
由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。
参考链接:
鱼眼镜头的成像原理到畸变矫正(完整版)
相机模型总结(针孔、鱼眼、全景)
三维空间中判断射线与平面是否相交
相机外参标定误差对目标测距的影响分析(待整理)
像素坐标转到世界坐标时相机坐标系中的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…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
