【视觉SLAM:四、相机与图像】
相机模型
相机模型是计算机视觉中的重要内容,用于描述真实相机如何将三维世界投影到二维图像平面。以下从多个角度介绍常见的相机模型。
针孔相机模型
针孔相机模型是最简单的相机模型,用数学公式描述从三维世界到二维图像平面的映射关系。核心公式如下: s [ u v 1 ] = K [ R t ] [ X Y Z 1 ] s\begin{bmatrix}u\\v\\1\end{bmatrix}=\mathbf{K}\begin{bmatrix}\mathbf{R}&\mathbf{t}\end{bmatrix}\begin{bmatrix}X\\Y\\Z\\1\end{bmatrix} s uv1 =K[Rt] XYZ1
- 参数解释:
- (X,Y,Z) 是世界坐标系中的三维点。
- (u,v) 是图像坐标系中的像素坐标。
- R∈SO(3) 和 𝑡 描述相机的旋转和平移(即相机位姿)。
- K 是相机的内参矩阵,包含焦距和主点坐标。
- s 是尺度因子,表示物体在相机坐标系中的深度。
- 优点:
- 精确描述了相机的透视投影特性。
- 局限性:
- 忽略了真实相机中的畸变现象。
畸变模型
真实相机镜头存在一定的畸变,常见畸变包括:
- 径向畸变:由镜头曲率引起,导致直线变成弯曲。
- 表达公式: p d = p u ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \mathbf{p}_d=\mathbf{p}_u(1+k_1r^2+k_2r^4+k_3r^6) pd=pu(1+k1r2+k2r4+k3r6)
其中 𝑟 是未畸变点 p u \mathbf{p}_u pu到光轴的距离。 - 切向畸变:由于镜头与成像平面不完全平行引起。
- 表达公式:
x d = x u + [ 2 p 1 x u y u + p 2 ( r 2 + 2 x u 2 ) ] x_d=x_u+[2p_1x_uy_u+p_2(r^2+2x_u^2)] xd=xu+[2p1xuyu+p2(r2+2xu2)]
y d = y u + [ p 1 ( r 2 + 2 y u 2 ) + 2 p 2 x u y u ] y_d=y_u+[p_1(r^2+2y_u^2)+2p_2x_uy_u] yd=yu+[p1(r2+2yu2)+2p2xuyu]
通过校正畸变,可以将畸变的图像点恢复到针孔相机模型中。
- 表达公式:
双目相机模型
双目相机系统由两个相机组成,用于通过视差恢复三维点的深度信息。
- 几何关系:
- 两个相机之间的相对位置和姿态由旋转矩阵
- 深度计算:
Z = f ⋅ b d Z=\frac{f\cdot b}{d} Z=df⋅b
其中:- 𝑍 是3D点的深度。
- 𝑓 是相机焦距。
- 𝑏 是基线长度(两个相机的距离)。
- 𝑑 是视差(两个相机对应点的像素差)。
双目相机常用于三维场景重建。
RGB-D相机模型
RGB-D相机结合了传统的RGB图像和深度信息,直接提供每个像素的深度值 𝑍。
- 深度值与3D点的计算:
[ X Y Z ] = Z ⋅ K − 1 [ u v 1 ] \begin{bmatrix}X\\Y\\Z\end{bmatrix}=Z\cdot\mathbf{K}^{-1}\begin{bmatrix}u\\v\\1\end{bmatrix} XYZ =Z⋅K−1 uv1
其中 (𝑢,𝑣) 是像素坐标,𝐾 是相机内参。 - 优点:
- 能直接获取场景深度,避免了双目相机的匹配误差。
- 常见设备:
- Kinect、Realsense、Lidar等。
图像
图像的基本定义
- 图像是对真实场景的二维采样,由像素组成,每个像素存储场景的亮度或颜色信息。
- 图像的基本形式:
- 灰度图像:每个像素存储亮度值。
- 彩色图像:每个像素存储RGB三个通道的颜色值。
图像坐标系
- 像素坐标系:以像素点为单位,左上角为原点,坐标为 (𝑢,𝑣)。
- 图像坐标系:以图像中心为原点,单位为像素。
计算机中的图像
图像的存储
- 在计算机中,图像以矩阵的形式存储:
I = [ I ( 0 , 0 ) I ( 0 , 1 ) ⋯ I ( 0 , n ) I ( 1 , 0 ) I ( 1 , 1 ) ⋯ I ( 1 , n ) ⋮ ⋮ ⋱ ⋮ I ( m , 0 ) I ( m , 1 ) ⋯ I ( m , n ) ] \mathbf{I}=\begin{bmatrix}I(0,0)&I(0,1)&\cdots&I(0,n)\\I(1,0)&I(1,1)&\cdots&I(1,n)\\\vdots&\vdots&\ddots&\vdots\\I(m,0)&I(m,1)&\cdots&I(m,n)\end{bmatrix} I= I(0,0)I(1,0)⋮I(m,0)I(0,1)I(1,1)⋮I(m,1)⋯⋯⋱⋯I(0,n)I(1,n)⋮I(m,n)
每个 𝐼(𝑢,𝑣) 表示像素的亮度或颜色值。
图像的处理
- 图像处理包括滤波、边缘检测、特征提取等。
- 在视觉SLAM中,图像处理是特征点提取和匹配的基础。
3D视觉
双目视觉
- 双目视觉通过两个相机的配合,计算场景的深度信息。
- 核心原理:
- 使用极线约束和视差进行三角测量。
- 双目视觉的应用:
- 3D场景重建。
- 目标检测与深度估计。
RGB-D视觉
- RGB-D视觉直接提供深度信息,常用于室内场景的三维建模。
- 优势:
- 数据采集速度快。
- 深度信息精确,无需匹配。
- 缺点:
- 深度传感器对光线和环境敏感。
总结
相机与图像是计算机视觉的核心组成部分。从针孔相机模型到RGB-D相机模型,从二维图像的表示到三维视觉的场景重建,都离不开对相机模型的理解与应用。结合这些模型,可以实现从图像到三维世界的感知与表达,为计算机视觉和SLAM任务奠定了理论基础。
相关文章:
【视觉SLAM:四、相机与图像】
相机模型 相机模型是计算机视觉中的重要内容,用于描述真实相机如何将三维世界投影到二维图像平面。以下从多个角度介绍常见的相机模型。 针孔相机模型 针孔相机模型是最简单的相机模型,用数学公式描述从三维世界到二维图像平面的映射关系。核心公式如…...

如何利用无线路由器实现水泵房远程监测管理
水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面,如果水泵站发生异常,往往会对生产生活造成诸多损失,甚至引发安全事故。因此,建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前,我国大…...

使用ArcGIS Pro自带的Notebook计算多个遥感指数
在之前的分享中,我们介绍了如何使用ArcPy将GEE下载的遥感影像转为单波段文件。基于前面创建的单波段文件,我们可以一次性计算多种遥感指数,例如NDVI、EVI、NDSI等。我这里直接在ArcGIS Pro中自带的Notebook进行的运行。如下图所示,…...

宝塔-firefox(Docker应用)-构建自己的Web浏览器
安装基础软件 宝塔中安装firefox(Docker应用) 。宝塔中需要先安装docker及docker-composefirefox配置安装 点击firefox应用,选择【安装配置】点击右边绿色按钮,进行安装,这一步等待docker-compose根据你的配置初始化docker应用 等待安装 …...

OpenCV-Python实战(8)——图像变换
一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…...

存储进阶笔记(二):Linux 存储栈:从 Device Mapper、LVM 到文件系统(2024)
记录一些平时接触到的存储知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用。 存储进阶笔记(一):硬件基础:HDD/SDD、JBOD、RAID 等(2024) 存储进阶笔记&am…...
Linux(Centos 7.6)基础命令/常用命令说明
1.目录相关命令 命令命令说明pwd用于显示/打印当前目录位置。ls/ll 列出当前目录下的文件或者目录,ll是ls -l的别名,ls仅显示名称,ll会显示详细的目录文件信息。 cd目录切换,常见用法有,cd /切换到根目录,…...

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环
本文目录 一、知识点1. PID是什么?2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID(用于位置环)(1)公式(2)代码使用代码 2. 增量式…...

【Goland】怎么执行 go mod download
1、终端的执行 go mod tidy 2、终端执行不行的话,就可以通过右击go.mod文件来执行; 3、也可以按住Ctrl点击这个包安装;...
服务器主机测试网络
测试命令 speedtest-cli sudo yum install python-pip pip install speedtest-cli # 默认连接国外被拒绝,用阿里云 pip install -i https://mirrors.aliyun.com/pypi/web/simple --trusted-host mirrors.aliyun.com speedtest-cli Collecting speedtest-cliDownlo…...

【JMeter详解】
JMeter详解 Apache JMeter 是一个开源的、100%纯Java应用程序,设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源(如静态文件、Servlets、Perl脚本、Java对象、数据…...
Maven Wrapper 报错“未找到有效的 Maven 安装”
1. 检查 Maven Wrapper 配置: 确保你的项目中包含 .mvn/wrapper/maven-wrapper.properties 文件。 检查该文件中的 distributionUrl 属性,确保它指向一个有效的 Maven 发行版 URL。 2.确认 Maven Wrapper 脚本存在: 在项目根目录下&#x…...

如何通过 360 驱动大师检查自己电脑上的显卡信息
在深入探讨如何查看显卡信息之前,首先需要了解显卡的基本概念。显卡(Graphics Processing Unit, GPU),是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能,显卡通常被分为两类: 集成显卡&…...
C++并发:线程管控
1 线程基本管控 每个C程序都含有至少一个线程,即运行main()的线程,它由C运行时系统启动。随后程序可以发起更多线程,它们以别的函数作为入口。这些新线程连同起始线程并发运行。当main()返回时,程序就会退出;同样&…...
C++ 设计模式:策略模式(Strategy Pattern)
链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 观察者模式 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以…...

SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法
SpringBoot的版本控制是怎么做的 starter版本控制 SpringBoot的核心父依赖,下面导入的所有starter依赖都不需要指定版本,版本默认和spring-boot-starter-parent的parent版本一致; xxxstarter内部jar包依赖的版本管理,starter自…...
爬虫的工作原理
摘要: 本文详细阐述了爬虫的工作原理,从其基本概念出发,深入探讨了爬虫的主要组成部分,包括URL管理器、网页下载器、网页解析器和数据存储模块等。同时,分析了爬虫的抓取策略,如深度优先、广度优先等&#…...

你了解DNS吗?
你了解DNS吗? 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 介绍 …...
利用JavaScript实现顺序九宫格抽奖
顺序九宫格思路: 1.先获取抽奖按钮,方便给按钮绑定点击事件2.初始化下标k0,用于表示当前选中的索引下标,后续滚动起来会一直刷新3.获取大div盒子4.获取盒子里所有div元素,充当一个数组,后续可以通过下标来访问每个小div࿰…...

音视频入门知识(四):封装篇
⭐四、封装篇 H264封装成mp4、flv等格式,那为什么需要封装? h264也能播放,但是按照帧率进行播放,可能不准 ★FLV **FLV(Flash Video)**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

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

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...