当前位置:首页 > 工业园区 >rgbd相机原理(rgb—d相机)

rgbd相机原理(rgb—d相机)

图像

rgbd相机原理(rgb—d相机)

灰度图

灰度是描述灰度图像内容的最直接的视觉特征。指的是黑白图像中点的颜色深度,一般范围为0255,其中255为白色,0为黑色,因此黑白图像也称为灰度图像。灰度图像矩阵元素的值通常为[0,255],因此其数据类型一般为8位无符号整数,也就是人们通常所说的256级灰度。灰度图像:像素的灰度可以用8位整数来记录,其值为0到255之间的值。

深度图

当我们想要记录更多信息时,一个字节是不够的。在RGB-D相机的深度图中,记录了每个像素与相机之间的距离。这个距离通常以毫米为单位来衡量,而RGB-D相机的范围通常在十米左右,超过255。人们会使用16位整数(C++中的无符号短整型)来记录深度图信息,它是一个介于0和65535。转换为米时,最多可以表示65米,这对于RGB-D相机来说已经足够了。

彩色图

彩色图像的表示需要通道的概念。在计算机中,我们使用红、绿、蓝三种颜色的组合来表示任何颜色。所以对于每个像素点,必须记录它的R、G、B三个值,每个值称为一个通道。例如,最常见的彩色图像具有三个通道,每个通道由一个8 位整数表示。在此规范下,一个像素占用24 位空间。通道的数量和顺序可以自由定义。在OpenCV的彩色图像中,通道的默认顺序是B、G、R。也就是说,当我们得到一个24位像素时,前8位代表蓝色值,中间8位代表绿色值,最后8位代表绿色值。 8位代表红色值。同理,彩色图像也可以用R、G、B的顺序来表示。如果还想表达图像的透明度,就用R、G、B、A这四个通道。

RGB彩色图与灰度图之间的转换

将彩色图像转换为灰度图像时,需要计算图像中每个像素的有效亮度值。计算公式为:Y=0.299R+0.578G+0.114B

双目相机使用视差来计算深度。 RGBD相机可以主动测量每个像素的深度。

使用红外结构光测量像素距离。示例包括Kinect 第一代、Project Tango 第一代、Intel RealSense 等。

像素距离是通过飞行时间(ToF)原理测量的。例子包括第二代Kinect和一些现有的ToF传感器等。

RGBD相机原理图

深度图保存

那么如何从RGBD相机中提取像素的深度信息呢?下面是一个简单的小程序,用于显示像素的深度信息。

#include #include #include 使用命名空间std;float 深度刻度=1.0f/1000; //比例因子,表示一个像素对应多少实际米int main(int argc, char **argv){ cv:Mat height=cv:imread(' img.jpg');深度.convertTo(深度,CV_32FC1,深度刻度); //这个转换非常重要for (int v=0; v height.rows; v++) { for (int u=0; u height.cols; u++) { unsigned int d=height.ptr(v)[u] ; //深度值if (d==0) continue; //0表示不测量else { cout

ConvertTo()函数

请注意,ConvertTo 函数如下:

img: 图像数据源,其类型为Mat。

请注意, 并非所有格式的Mat 类型数据都可以使用并保存为图像。目前OpenCV仅支持单通道和3通道图像,而此时深度要求为8bit和16bit无符号(即CV_16U),因此不支持其他一些数据类型,例如float等。 Mat类型数据的深度和通道数不满足上述要求,需要使用convertTo()函数和cvtColor()函数进行转换。

ConvertTo()函数负责转换不同数据类型的Mats,即它可以将类似float的Mat转换为imwrite()函数可接受的类型。

cvtColor()函数负责转换不同通道的Mats,因为这个函数的第四个参数可以设置目标Mat数据的通道数(但是我们一般不会使用它,一般情况下这个函数是用来执行色彩空间转换。转换)。

另外,还可以使用imwrite()函数来保存图像数据。您可以直接使用通用的XML IO接口函数将数据存储为XML或YXML。

具体含义、缩放以及转换为另一种数据类型:

dst:目标矩阵;

type:所需的输出矩阵类型,或更具体地说,输出矩阵的深度。如果为负值(通常为-1),则输出矩阵与输入矩阵类型相同;

scale: 比例因子;

shift:对输入数组元素进行缩放后添加的值;

dst(i)=src(i)xscale+(移位,移位,)

审稿人:李茜

最新资讯

推荐资讯