全国服务热线:

15861139266

RGBD相机模型与图片处理,苏州机器视觉培训,苏州工业机器人培训,苏州上位机培训
发布时间:2024-03-14 10:30:01 点击次数:177

图像

1.png

灰度图

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

灰度图:一个像素的灰度可以用8 位整数记录,也就是一个0~255的值。


深度图

当我们要记录的信息更多时,一个字节就不够了。

在RGB-D相机的深度图中,记录了各个像素与相机之间的距离。这个距离通常是以毫米为单位,而RGB-D 相机的量程通常在十几米左右,超过了255。

人们会采用16 位整数(C++ 中的unsigned short)来记录深度图的信息,也就是位于0~65535 的值。换算成米的话,最大可以表示65 米,足够RGB-D 相机使用了。


彩色图

彩色图像的表示则需要通道(channel)的概念。在计算机中,我们用红色、绿色和蓝色这三种颜色的组合来表达任意一种色彩。于是对于每一个像素,就要记录其R、G、B 三个数值,每一个数值就称为一个通道。例如,最常见的彩色图像有三个通道,每个通道都由8 位整数表示。在这种规定下,一个像素占据24 位空间。

通道的数量、顺序都是可以自由定义的。在OpenCV 的彩色图像中,通道的默认顺序是B、G、R。也就是说,当我们得到一个24 位的像素时,前8 位表示蓝色数值,中间8 位为绿色,最后8 位

为红色。同理,亦可使用R、G、B 的顺序表示一个彩色图。如果还想表达图像的透明度,就使用R、G、B、A 四个通道。


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

彩色图像转换为灰度图像时,需要计算图像中每个像素有效的亮度值,其计算公式为:

Y = 0.299R + 0.578G + 0.114B


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


通过红外结构光(Structured Light)来测量像素距离的。例子有Kinect 1 代、Project Tango 1 代、Intel RealSense 等。


通过飞行时间法(Time-of-flight,ToF)原理测量像素距离的。例子有Kinect 2 代和一些现有的ToF 传感器等


RGBD相机原理图

1710383061.png

深度图的保存


那么如何从RGBD相机提取像素的深度信息呢?

下面是一个简单的小程序,可以显示像素的深度信息.


#include <iostream>

#include <fstream>

#include <opencv2/opencv.hpp>

using namespace std;


float depthscale = 1.0f/1000; //尺度因子,表示一个像素对应多少实际中的米

int main(int argc, char **argv)

{

    cv::Mat  depth = cv::imread("img.jpg");

    depth.convertTo(depth,CV_32FC1,depthscale); //这个转换很重要


    for (int v = 0; v < depth.rows; v++)

    {

        for (int u = 0; u < depth.cols; u++) {

            unsigned int d = depth.ptr<unsigned short>(v)[u]; // 深度值

            if (d == 0)

                continue; // 为0表示没有测量到

            else

            {

                cout<<d<<"";

                if(v%50==0||u%50==0)

                    cout<<endl;

            }

            

        }

    }

    return 0;

}

ConvertTo()函数

需要注意,其中的ConvertTo函数作用如下:

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

注意: 不是所有格式的Mat型数据都能被使用保存为图片,目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor()函数来进行转换。

convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。

而cvtColor()函数是负责转换不同通道的Mat,因为该函数的第4个参数就可以设置目的Mat数据的通道数(只是我们一般没有用到它,一般情况下这个函数是用来进行色彩空间转换的)。

另外也可以不用imwrite()函数来存图片数据,可以直接用通用的XML IO接口函数将数据存在XML或者YXML中。


具体含义,缩放并转换到另外一种数据类型:


dst:目的矩阵;


type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同;


scale:比例因子;


shift:将输入数组元素按比例缩放后添加的值;

dst(i)=src(i)xscale+(shift,shift,...)


立即咨询
  • 品质服务

    服务贴心周到

  • 快速响应

    全天24小时随时沟通

  • 专业服务

    授权率高,保密性强

  • 完善售后服务

    快速响应需求,及时性服务

直播课程
软件开发基础课程
上位机软件开发课
机器视觉软件开发课
专题课
联系方式
电话:15861139266
邮箱:75607082@qq.com
地址:苏州吴中区木渎镇尧峰路69号
关注我们

版权所有:江苏和讯自动化设备有限公司所有 备案号:苏ICP备2022010314号-1

技术支持: 易动力网络