视觉slam十四讲学习笔记(四)相机与图像

  • 理解理解针孔相机的模型、内参与径向畸变参数。
  • 理解一个空间点是如何投影到相机成像平面的。
  • 掌握OpenCV的图像存储与表达方式。
  • 学会基本的摄像头标定方法。

目录

前言

一、相机模型

1 针孔相机模型

2 畸变

单目相机的成像过程

3 双目相机模型

4 RGB-D 相机模型

二、图像

计算机中图像的表示

三、图像的存取与访问

1 安装OpenCV

2 存取与访问

总结


前言

前面介绍了“机器人如何表示自身位姿”的问题,部分地解释了 SLAM 经典模型中变量的含义和运动方程部分。本文要讨论“机器人如何观测外部世界”,也就是观测方程部分。而在以相机为主的视觉 SLAM 中,观测主要是指相机成像的过程。

哔哩哔哩课程链接:视觉SLAM十四讲ch5_哔哩哔哩_bilibili


一、相机模型

相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述。这个模型有很多种,其中最简单的称为针孔模型

针孔模型是很常用,而且有效的模型,它描述了一束光线通过针孔之后,在针孔背面投影成像的关系。在本文用一个简单的针孔相机模型来对这种映射关系进行建模。同时,由于相机镜头上的透镜的存在,会使得光线投影到成像平面的过程中会产生畸变。因此,使用针孔和畸变两个模型来描述整个投影过程。

先给出相机的针孔模型,再对透镜的畸变模型进行讲解。这两个模型能够把外部的三维点投影到相机内部成像平面,构成了相机的内参数

1 针孔相机模型

现在来对这个简单的针孔模型进行几何建模。设 O x y z 为相机坐标系,习惯上让 z 轴指向相机前方,x 向右,y 向下。O 为摄像机的光心,也是针孔模型中的针孔。现实世界的空间点 P,经过小孔 O 投影之后,落在物理成像平面 Ox y 上,成像点为 P 。设 P 的坐标为 [X, Y, Z] TP 为 [X, Y , Z] T,并且设物理成像平面到小孔的距离为 f(焦距)。那么,根据三角形相似关系,有:

其中负号表示成的像是倒立的。为了简化模型,我们把可以成像平面对称到相机前方,和三维空间点一起放在摄像机坐标系的同一侧,如下公式的样子所示。这样做可以把公 式中的负号去掉,使式子更加简洁:

真实成像平面,对称成像平面,归一化成像平面的图示如上图。

描述了点 P 和它的像之间的空间关系。不过,在相机中,我们最终获得的是一个个的像素,这需要在成像平面上对像进行采样和量化。为了描述传感器将感受到的光线转换成图像像素的过程,设在物理成像平面上固定着一个像素平面 o u v。在像素平面得到了 P 像素坐标[u, v] T

像素坐标系通常的定义方式是:原点 o 位于图像的左上角,u 轴向右与 x 轴平行,v轴向下与 y 轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。设像素坐标在 u 轴上缩放了 α 倍,在 v 上缩放了 β 倍。同时,原点平移了 [cx, cy] T。那么,P 的坐标与像素坐标 [u, v] T 的关系为:

并把 αf 合并成 fx,把 βf 合并成 fy,得:

其中,f 的单位为米,α, β 的单位为像素每米,所以fx, fy 的单位为像素。把该式写成矩阵形式,会更加简洁,不过左侧需要用到齐次坐标:

把中间的量组成的矩阵称为相机的内参数矩阵Camera IntrinsicsK。通常认为,相机的内参在出厂之后是固定的,不会在使用过程中发生变化。有的相机生产厂商会告诉你相机的内参,而有时需要自己确定相机的内参,也就是所谓的标定

除了内参之外,自然还有相对的外参。上面使用的是 P 在相机坐标系下的坐标。由于相机在运动,所以 P 的相机坐标应该是它的世界坐标(记为 Pw),根据相机的当前位姿,变换到相机坐标系下的结果。相机的位姿由它的旋转矩阵 R 和平移向量 t 来描述。那么有:

相机的位姿 R, t 又称为相机的外参数(Camera Extrinsics)。相比于不变的内参,外参会随着相机运动发生改变,同时也是 SLAM中待估计的目标,代表着机器人的轨迹。上式两侧都是齐次坐标。因为齐次坐标乘上非零常数后表达同样的含义,所以可以简单地把 Z 去掉:

可以看到,右侧的 T Pw 表示把一个世界坐标系下的齐次坐标,变换到相机坐标系下。为了使它与 K 相乘,需要取它的前三维组成向量——因为 T Pw 最后一维为 1。此时,对于这个三维向量,还可以按照齐次坐标的方式,把最后一维进行归一化处理,得到了 P 在相机归一化平面上的投影:

这时 Pc 可以看成一个二维的齐次坐标,称为归一化坐标。它位于相机前方 z = 1 处的平面上。该平面称为归一化平面。由于 Pc 经过内参之后就得到了像素坐标,所以可以把像素坐标 [u, v] T,看成对归一化平面上的点进行量化测量的结果。

2 畸变

为了获得好的成像效果,在相机的前方加了透镜。透镜的加入对成像过程中光线的传播会产生新的影响: 一是透镜自身的形状对光线传播的影响,二是在机械组装过程中,透镜和成像平面不可能完全平行,这也会使得光线穿过透镜投影到成像面时的位置发生变化。

由透镜形状引起的畸变称之为径向畸变。在针孔模型中,一条直线投影到像素平面上还是一条直线。可是,在实际拍摄的照片中,摄像机的透镜往往使得真实环境中的一条直线在图片中变成了曲线。越靠近图像的边缘,这种现象越明显。由于实际加工制作的透镜往往是中心对称的,这使得不规则的畸变通常径向对称。它们主要分为两大类,桶形畸变和枕形畸变,如图所示。

桶形畸变是由于图像放大率随着离光轴的距离增加而减小,而枕形畸变却恰好相反。在这两种畸变中,穿过图像中心和光轴有交点的直线还能保持形状不变。

除了透镜的形状会引入径向畸变外,在相机的组装过程中由于不能使得透镜和成像面严格平行也会引入切向畸变

在相机成像过程中,由于镜头等因素会引起畸变,因此需要进行畸变校正以得到图像中物体的真实位置。畸变通常可以通过畸变模型进行建模,其中五个畸变系数是指径向畸变和切向畸变的参数。

  1. 径向畸变(Radial Distortion): 这是由于镜头非理想形状引起的畸变。径向畸变通常分为两个方面:正径向畸变和负径向畸变。正径向畸变使图像中心附近的点向外弯曲,而负径向畸变则使其向内弯曲。

  2. 切向畸变(Tangential Distortion): 切向畸变是由于镜头和图像平面之间的不平行引起的。这种畸变使图像中的物体看起来被挤压或拉伸。

畸变模型一般可以用以下公式表示:

其中,xcorrected​,ycorrected​ 是校正后的像素坐标,x,y 是原始的像素坐标,k1​,k2​,k5​ 是径向畸变系数,p1​,p2​ 是切向畸变系数,r2=x2+y2。

这些参数通过相机标定的过程来获取,标定通常使用一组已知空间坐标的点和对应的图像坐标点。标定后,这些畸变系数就能用于校正图像中的点位置,使其更准确地映射到空间坐标系。

相机畸变的纠正:

这个过程通常由图像处理库或相机标定工具提供的函数来实现。在OpenCV中,undistort函数用于畸变校正。确保在使用这些函数之前进行相机标定以获取畸变系数。

单目相机的成像过程

双目相机模型

双目相机是一种具有两个摄像头的系统,模拟人类双眼视觉以获得深度信息。双目相机模型可以基于摄像头之间的几何关系、相机参数和成像原理进行分类。以下是一些常见的双目相机模型:

  • 平行轴双目模型(Parallel Stereo Model): 在平行轴双目模型中,两个摄像头的光轴是平行的,即两个摄像头处于相同的水平平面上。这种模型简化了几何关系,使得深度估计更容易,但在实际中较少见。

  • 共轴双目模型(Coaxial Stereo Model): 在共轴双目模型中,两个摄像头的光轴是共轴的,即两个摄像头位于同一光学轴上。这种模型常用于一些特殊应用,如显微镜等。

  • 基线双目模型(Baseline Stereo Model): 基线是指两个摄像头之间的距离。在基线双目模型中,基线的大小会直接影响深度估计的精度。通常,基线越长,深度信息的精度越高,但相应的计算开销也会增加。

  • 非共面双目模型(Non-Coplanar Stereo Model): 在非共面双目模型中,两个摄像头的光心不在同一平面上。这种情况下,深度估计可能需要考虑额外的几何变换。

  • 鱼眼双目模型(Fisheye Stereo Model): 有时候,双目系统使用鱼眼镜头,使得摄像头能够捕捉更广阔的视野。在这种情况下,通常需要特殊的几何模型来处理图像畸变。

像素点可能存在的位置:

双目相机的成像模型如下图所示。OL, OR 为左右光圈中心,蓝色框为成像平面,f 为焦距。uL uR 为成像平面的坐标。请注意按照图中坐标定义,uR 应该是负数,所以图中标出的距离为 uR

通过同步采集左右相机的图像,计算图像间视差,来估计每一个像素的深度。

双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目,但主流双目都是做成左右的。在左右双目的相机中,可以把两个相机都看作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于 x 轴上。它们的距离称为双目相机的基线Baseline, 记作 b),是双目的重要参数。

考虑一个空间点 P,它在左眼和右眼各成一像,记作 PL, PR。由于相机基线的存在,这两个成像位置是不同的。理想情况下,由于左右相机只有在 x 轴上有位移,因此P 的像也只在 x 轴(对应图像的 u 轴)上有差异。记它在左侧的坐标为 uL,右侧坐标为 uR。那么,它们的几何关系如图5-6右侧所示。根据三角形 P PL PR P OL OR的相似关系,有:

这里 d 为左右图的横坐标之差,称为视差Disparity)。根据视差,可以估计一个像素离相机的距离。视差与距离成反比:视差越大,距离越近。同时,由于视差最小为一个像素,于是双目的深度存在一个理论上的最大值,由 fb 确定。我们看到,当基线越长时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。

虽然由视差计算深度的公式很简洁,但视差 d 本身的计算却比较困难。需要确切地知道左眼图像某个像素出现在右眼图像的哪一个位置(即对应关系),这件事亦属于“人类觉得容易而计算机觉得困难”的事务。当想计算每个像素的深度时,其计算量与精度都将成为问题,而且只有在图像纹理变化丰富的地方才能计算视差。由于计算量的原因,双目深度估计仍需要使用 GPU FPGA 来计算。

RGB-D 相机模型

RGB-D相机是一类同时提供RGB(彩色)和深度信息的相机。这些相机可以在计算机视觉和机器人领域中发挥重要作用,因为深度信息可以用于三维场景理解和物体感知。以下是一些常见的RGB-D相机:

  • Microsoft Kinect系列: Kinect是一系列由微软推出的RGB-D相机。最早的Kinect for Xbox 360和后来的Kinect for Windows都包含了深度传感器,它们使用结构光技术进行深度测量。

  • Intel RealSense系列: Intel RealSense相机是一系列集成了RGB和深度传感器的产品。它们使用多种深度技术,包括飞行时间(Time-of-Flight)和结构光。

  • Asus Xtion系列: Asus Xtion相机是与Kinect类似的RGB-D相机,使用结构光技术来获取深度信息。

  • Occipital Structure Sensor: Structure Sensor是一款针对iOS设备的RGB-D相机,可以附加到iPad或iPhone上,提供深度信息。

  • Orbbec Astra系列: Orbbec Astra是一系列RGB-D相机,使用飞行时间技术,适用于各种计算机视觉和机器人应用。

目前的 RGB-D 相机按原理可分为两大类:

  • 1. 通过红外结构光Structured Light)来测量像素距离的。例子有 Kinect 1 代、ProjectTango 1 代、Intel RealSense 等;
  • 2. 通过飞行时间法Time-of-flight, ToF)原理测量像素距离的。例子有 Kinect 2 代和一些现有的 ToF 传感器等。

无论是结构光还是 ToF,RGB-D 相机都需要向探测目标发射一束光线(通常是红外光)。在结构光原理中,相机根据返回的结构光图案,计算物体离自身的距离。而在 ToF中,相机向目标发射脉冲光,然后根据发送到返回之间的光束飞行时间,确定物体离自身的距离。ToF 原理和激光传感器十分相似,不过激光是通过逐点扫描来获取距离,而 ToF相机则可以获得整个图像的像素深度,这也正是 RGB-D 相机的特点。所以,如果把一个 RGB-D 相机拆开,通常会发现除了普通的摄像头之外,至少会有一个发射器和一个接收器。

在测量深度之后,RGB-D 相机通常按照生产时的各个相机摆放位置,自己完成深度与彩色图像素之间的配对,输出一一对应的彩色图和深度图。可以在同一个图像位置,读取到色彩信息和距离信息,计算像素的 3D 相机坐标,生成点云(Point Cloud)。对RGB-D 数据,既可以在图像层面进行处理,亦可在点云层面处理。

RGB-D 相机能够实时地测量每个像素点的距离。但是,由于这种发射-接受的测量方式,使得它使用范围比较受限。用红外进行深度值测量的 RGB-D 相机,容易受到日光或其他传感器发射的红外光干扰,因此不能在室外使用,同时使用多个时也会相互干扰。对于透射材质的物体,因为接受不到反射光,所以无法测量这些点的位置。此外,RGB-D 相机在成本、功耗方面,都有一些劣势。

二、图像

相机加上镜头,把三维世界中的信息转换成了一个由像素组成的照片,随后存储在计算机中,作为后续处理的数据来源。在数学中,图像可以用一个矩阵来描述;而在计算机中,它们占据一段连续的磁盘或内存空间,可以用二维数组来表示。这样一来,程序就不必区别它们处理的是一个数值矩阵,还是有实际意义的图像了。

计算机中图像的表示

计算机中图像的表示通常使用像素(Pixel)的矩阵或张量来表达。图像可以是灰度图像(单通道)或彩色图像(多通道)。以下是两种常见的图像表示方式:

灰度图像表示:

  • 单通道矩阵: 灰度图像由一个二维矩阵表示,其中每个元素代表图像中对应位置的像素值。像素值通常在0到255的范围内,表示灰度强度。

  • 灰度图像张量: 在深度学习中,灰度图像也可以表示为三维张量,其中第三个维度的大小为1。这种表示形式更适用于与多通道彩色图像的处理方式一致。

彩色图像表示:

  • 三通道矩阵: 彩色图像通常由三个独立的二维矩阵(红、绿、蓝通道)组成,每个矩阵表示相应通道的像素值。这种表示方式称为RGB(Red, Green, Blue)表示。

  • 彩色图像张量: 彩色图像可以表示为三维张量,其中最后一个维度的大小为3,分别对应于红、绿、蓝通道。在深度学习中,张量表示更为普遍。

其他表示方式:

  • HSV表示: 除了RGB表示外,还可以使用HSV(Hue, Saturation, Value)或其他颜色空间表示图像,具体颜色空间的选择取决于应用需求。

  • 浮点数表示: 在一些应用中,像素值可能以浮点数表示,表示更为丰富的信息,例如在图像处理中的滤波操作。

程序中的访问形式:

unsigned char pixel = image[y][x];

图像的表示方式取决于应用场景和任务,不同的表示方式适用于不同的计算机视觉和图像处理应用。在深度学习中,通常使用张量表示,并且神经网络的输入层被设计为接受相应的图像张量。

三、图像的存取与访问

1 安装OpenCV

在 ubuntu 下,可以选择从源代码安装只安装库文件两种方式:

  • 从源代码安装,是指从 OpenCV 网站下载所有的 OpenCV 源代码。并在你的机器上编译安装,以便使用。好处是可以选择的版本比较丰富,而且能看到源代码,不过需要花费一些编译时间;
  • 只安装库文件,是指通过 Ubuntu 来安装由 Ubuntu 社区人员已经编译好的库文件,这样你就无需重新编译一遍。

由于我的openCV版本是4.8.1,所以我修改了cmakelist.txt

2 存取与访问

然后就是熟悉的步骤

./imageBasics ./ubuntu.png
图像宽为1200,高为674,通道数为3
遍历图像用时:0.00727802 秒。


总结

以上就是今天要讲的内容,本文包括相机与图像的基本概念。并通过一个演示程序,来理解在 OpenCV 中,图像存取与访问其中的像素的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/387614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LEETCODE 315. 计算右侧小于当前元素的个数(归并)

class Solution { public: // 将count声明为publicvector<int> count; vector<int> indexs,tmp;public:vector<int> countSmaller(vector<int>& nums) {//归并int left0;int rightnums.size()-1;//计数// vector<int> count(nums.size()); …

【MATLAB】PSO_BP神经网络回归预测(多输入多输出)算法原理

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO-BP神经网络回归预测&#xff08;多输入多输出&#xff09;算法是一种结合粒子群优化算法&#xff08;PSO&#xff09;和反向传播&#xff08;BP&#xff09;神经网络的混合算法。该算…

CSS之选择器、优先级、继承

1.CSS选择器 常用的选择器 <body><div class"parent"><div id"one" style"background: blue" class"child">1<div class"one_one">11</div><div style"background-color: blueviole…

vue3 Element Plus 基于webstorm练习

提要 vue是前端框架&#xff0c;Elemen是组件库。前端框架和组件库的区别与联系 nodejs 脚本语言需要一个解析器才能运行&#xff0c;JavaScript是脚本语言&#xff0c;在不同的位置有不一样的解析器&#xff0c;如写入html的js语言&#xff0c;浏览器是它的解析器角色。而对…

浅谈业务场景中缓存的使用

业务场景中缓存的使用 一、背景二、缓存分类1.本地缓存2.分布式缓存 三、缓存读写模式1.读请求2.写请求 四、缓存穿透1.缓存空对象2.请求校验3.请求来源限制4.布隆过滤器 五、缓存击穿1.改变过期时间2.串行访问数据库 六、缓存雪崩1.避免集中过期2.提前更新缓存 七、缓存与数据…

TMGM公司官网介绍

TMGM主要提供外汇、贵金属、原油、股指等CFD产品&#xff0c;客户可以根据个人的交易习惯选择其中一种或多种进行投资。具体来说&#xff0c;TMGM的金融产品包括但不限于货币对、黄金、原油、股票指数等。此外&#xff0c;TMGM还提供多种账户类型以满足不同客户的交易需求。 请…

error MSB8008: 指定的平台工具集(v143)未安装或无效。请确保选择受支持的 PlatformToolset 值解决办法

右击解决方案&#xff0c;选择属性 将工具集为143的修改为其他&#xff0c;如图 重新编译即可运行

DDC技术:AIGC网络的革命性解决方案

2023年&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术将蓬勃发展&#xff0c;其中ChatGPT作为一个典型案例&#xff0c;在文本生成、代码开发和诗歌创作等多个领域引起行业变革。DDC技术对改变网络格局具有创新和突破性意义&#xff0c;很大程度上提升了效率和…

Python 读取pdf文件

Python 实现读取pdf文件简单示例。 安装命令 需要安装操作pdf的三方类库&#xff0c;命令如下&#xff1a; pip install pdfminer3K 安装过程如下&#xff1a; 引入类库 需要引入很多的类库。 示例如下&#xff1a; import sys import importlib importlib.reload(sys)fr…

汽车零部件制造业MES系统解决方案

一、​汽车零部件行业现状 随着全球汽车产业不断升级&#xff0c;汽车零部件市场竞争日趋激烈&#xff0c;从上游的钢铁、塑料、橡胶等生产到下游的主机厂配套制造&#xff0c;均已成为全球各国汽车制造大佬战略目标调整的焦点&#xff0c;其意欲在汽车零部件行业快速开疆扩土&…

蓝牙BLE学习-GAP

1.概述 GAP层&#xff08;Generic access profile-通用访问配置文件&#xff09;。GAP是对LL层payload&#xff08;有效数据包&#xff09;如何进行解析的两种方式的一种&#xff0c;而且也是最简单的一种。GAP简单的对LL payload进行一些规范和定义&#xff0c;因此GAP能实现的…

Compose高级别API动画指南

前文讲了Compose中的低级别API动画&#xff0c;与之对应的&#xff0c;还有高级别API动画&#xff0c;同样也符合Material-Design规范。所有高级别动画 API 都是在低级别动画 API 的基础上构建而成&#xff0c;其对应关系如图&#xff1a; 接下来就对其高级别API逐个分析&…

【王道数据结构】【chapter5树与二叉树】【P159t12】

设一棵二叉树的结点结构为(LLINK,INFO,RLINK)&#xff0c;ROOT为指向该二叉树根结点的指针&#xff0c;p和q分别为指向该二叉树中任意两个节点的指针&#xff0c;试编写算法ANCESTOR(ROOT,p,q,r)&#xff0c;找到p和q的最近公共祖先结点r #include <iostream> #include &…

Linux第54步_根文件系统第1步_编译busybox并安装_然后添加“根文件系统”的库

学习编译busybox&#xff0c;并安装&#xff0c;然后添加“根文件系统”的库。有人说busybox构建根文件系统&#xff0c;只适合学习&#xff0c;不适合做项目。 1、了解ubuntu的根文件系统 根文件系统的目录名为“/”&#xff0c;就是一个斜杠。 1)、输入“cd /回车”&…

算法学习——LeetCode力扣二叉树篇7

算法学习——LeetCode力扣二叉树篇7 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点…

加速创新如何先从创意管理开始?

文章详细介绍了什么是创意管理以及它在组织中的重要性和最佳实践。创意管理是指在组织内捕捉、组织、评估和实施创意的过程。它通过建立一个结构化的系统&#xff0c;从员工、客户或其他利益相关者那里收集创意&#xff0c;并系统地审查和选择最有前景的创意进行进一步的开发或…

《区块链公链数据分析简易速速上手小册》第8章:实战案例研究(2024 最新版)

文章目录 8.1 案例分析&#xff1a;投资决策支持8.1.1 基础知识8.1.2 重点案例&#xff1a;股票市场趋势预测准备工作实现步骤步骤1: 加载和准备数据步骤2: 特征工程步骤3: 训练模型步骤4: 评估模型 结论 8.1.3 拓展案例 1&#xff1a;基于情感分析的投资策略准备工作实现步骤步…

【王道数据结构】【chapter5树与二叉树】【P159t14】

设有一棵满二叉树&#xff08;所有结点值均不同&#xff09;&#xff0c;已知其先序序列为pre&#xff0c;设计一个算法求其后序序列post #include <iostream> #include <stack> #include <queue> #include<string.h> typedef struct treenode{char da…

读十堂极简人工智能课笔记02_选对路径与犯错

1. 符号人工智能 1.1. 在符号处理中&#xff0c;单词被当成遵循一套规则、互相关联的符号 1.2. 符号人工智能让计算机能用单词来思考 1.3. 符号人工智能是最早、最成功的人工智能形式之一 1.4. 20世纪初的时候&#xff0c;伯特兰罗素、库尔特哥德尔和大卫希尔伯特等数学家就…

训练深度学习模型的过程

深度学习的训练过程是指通过大量的数据来调整神经网络的参数&#xff0c;以使其能够对输入数据进行准确的预测或分类. 训练神经网络的步骤 损失函数&#xff08;Loss Function&#xff09;是一个性能指标&#xff0c;反映神经网络生成接近期望值的值的程度。 损失函数直观上就…