当前位置: 首页 > news >正文

鱼眼相机的测距流程及误差分析[像素坐标系到空间一点以及测距和误差分析]

由于最近在整理单目测距的内容,顺手也总结下鱼眼相机的测距流程和误差分析,如果有错误,还请不吝赐教。

参考链接:
鱼眼镜头的成像原理到畸变矫正(完整版)
相机模型总结(针孔、鱼眼、全景)
三维空间中判断射线与平面是否相交
相机外参标定误差对目标测距的影响分析(待整理)
像素坐标转到世界坐标时相机坐标系中的Zc值求解
一文简要介绍鱼眼镜头/相机投影成像过程
一文详解分析鱼眼相机投影成像模型和畸变模型
相机模型-鱼眼模型(fisheye camera model)
SLAM 中常用的相机模型&畸变模型总结

最后两位大哥写的特别好,原理部分写的很详细也很全,我就不打算复制粘贴了,我从归一化坐标开始写,感谢大佬们的无私奉献!!

文章目录

  • 1 投影过程
  • 2 反投影过程
  • 3 推导射线与地面交点
    • 3.1 归一化相机坐标系下的射线:
    • 3.2 射线在世界坐标系下的表示:
  • 4 求解射线与地面交点
    • 4.1 计算距离:

1 投影过程

在这里插入图片描述

2 反投影过程

在这里插入图片描述
我这里是像素坐标系转世界坐标系,对应着反投影过程,到第五步已经得到单位球面坐标系里的位置。

这里分两种方法:

  1. 根据 像素坐标转到世界坐标时相机坐标系中的Zc值求解 这位作者写的,先计算出Zc的值,再根据像素坐标算出世界坐标系的位置,作者也给出了python的代码,目前我觉得思路没啥问题。
  2. 推导从相机光心出发,通过像素点(u, v)的射线与地面的交点,解出交点,这个交点就是像素坐标系转到世界坐标系的位置。

在这里插入图片描述

很重要的几个知识点:

  1. 鱼眼相机成像模型近似为单位球面投影模型。根据投影函数的不同将鱼眼相机的设计模型大致分为等距投影模型、等立体角投影模型、正交投影模型和体视投影模型四种。相机的成像模型实际上表征的是成像的像高与入射角之间的映射关系。
  2. 不管是针孔相机模型,还是鱼眼相机模型,其成像过程都涉及到四个坐标系:世界坐标系、相机坐标系、图像物理坐标系、图像像素坐标系以及这四个坐标系间的转换。具体的成像原理请看参考文献,大佬们写的非常好。
  3. 鱼眼相机和针孔相机成像的不同之处: 在鱼眼模型中会将相机下的空间点, 先转换为归一化相机球面上,再从球面投影到平面上。针孔相机将空间点直接投影到平面上。
  4. 不管是鱼眼相机模型还是针孔相机模型(我目前接触过的两种相机,其他相机没仔细研究过), 假设在图像平面中有一个接地点的像素坐标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)zTzd)+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,zzcd)+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,xTx)2+(Pw,yTy)2

  1. 这个计算假设地面是平坦的,并且与 XY 平面对齐。在实际情况中,地面可能不完全平坦,或者与 XY 平面不是完全对齐的,需要额外的校正。
  2. 以上便是基于针孔相机模型的测距推导完整过程,基于这个过程可以用来研究相机外参参数对测距结果的具体影响。
    在这里插入图片描述

总结:

  1. 别人也做了实验验证误差部分,我没做实验我也不贴别人的结论了。
  2. 很长时间内,我都不明白为啥我算出来的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下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正&#xf…...

网络编程的学习1

网络编程 在网络通信协议下,不同计算机上运行的程序,进行数据传输。 三要素 ip:设备在网络中的地址,是唯一的标识。 ipv4:采取32位地址长度,分成4组。 ipv6:采用128位地址长度,分成8组。 …...

spark log4j日志文件动态参数读取

需要在log4j xml文件中设置动态参数&#xff0c;并支持spark任务在集群模式下&#xff0c;动态参数读取正常&#xff1b; 1.log4j配置文件 log4j2.xml <?xml version"1.0" encoding"UTF-8"?> <Configuration status"info" name&quo…...

设计模式,装修模式,Php代码演示,优缺点,注意事项

装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许动态地向一个现有对象添加新的功能或行为&#xff0c;而不改变其原始结构。在 PHP 中&#xff0c;可以使用类的继承和组合来实现装饰模式。下面是一个简单的 PHP 装饰模式示例代码&am…...

ubuntu下vscode ctrl+tab松开ctrl后不自动选中文件

vscode用ctrltab切换文件时&#xff0c;松开ctrl键后会自动选中切换的文件。 但是在ubuntu下发现有时不能自动选中切换的文件&#xff0c;需要再次按enter键才能打开文件。 经过测试发现解决方法有两个&#xff1a; 方法1&#xff1a;确认wayland状态&#xff0c;关闭wayland…...

【云开发笔记No.19】关于中台架构(1)

在云开发领域&#xff0c;中台架构是一种至关重要的组织架构&#xff0c;它为企业提供了一种灵活且高效的方式来应对市场的快速变化。下面将详细阐述中台架构的定义、起源、定位和价值。 中台架构的定义 中台架构是指在企业信息系统中&#xff0c;将业务流程、数据和应用系统…...

对于提高Web安全,WAF能有什么作用

数字化时代&#xff0c;网络安全已经成为了一个不可忽视的重要议题。网络攻击事件频发&#xff0c;各种安全隐患层出不穷&#xff0c;如何有效地保护我们的网络空间&#xff0c;确保信息安全&#xff0c;已成为一项迫切的任务。而Web应用防火墙&#xff0c;正是守护网络安全的一…...

Go 源码之 gin 框架

Go 源码之 gin 框架 go源码之gin - Jxy 博客 一、总结 gin.New()初始化一个实例&#xff1a;gin.engine&#xff0c;该实例实现了http.Handler接口。实现了ServeHTTP方法 注册路由、注册中间件&#xff0c;调用addRoute将路由和中间件注册到 methodTree 前缀树&#xff08;节…...

BM19 寻找峰值(二分查找)

import java.util.*; public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * 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…...

家庭记账本(源码+文档)

家庭记账本系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端我的界面图表明细添加账单登录页明细注册页个人资料 后台管理用户管理后台登录页分类管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参…...

深度学习评价指标(1):目标检测的评价指标

1. 简述 在计算机视觉/深度学习领域&#xff0c;每一个方向都有属于自己的评价指标。通常在评估一个模型时&#xff0c;只需要计算出相应的评价指标&#xff0c;便可以评估算法的性能。同时&#xff0c;所谓SOTA&#xff0c;皆是基于某一评价指标进行的评估。 接下来&#xff0…...

jmeter性能压测的标准和实战中会遇到的问题

1.性能标准建议 CPU 使用率&#xff1a;不超过 70% 内存使用率&#xff1a;不超过 70% 磁盘&#xff1a;%util到达80%严重繁忙 &#xff08;os.disIO.filesystem.writeKbPS 每秒写入的千字节&#xff09; 响应时间&#xff1a;95%的响应时间不超过8000ms 事务成功率&#xff1a…...

6-82 求链式线性表的倒数第K项

给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。 输出格式: 输出倒数第K个位置上的数据。如果这个位置不存在,输出错误…...

CDH集群hive初始化元数据库失败

oracle数据库操作&#xff1a; 报错如下&#xff1a;命令 (Validate Hive Metastore schema (237)) 已失败 截图如下&#xff1a; 后台日志部分摘录&#xff1a; WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...