在 Unity 中获取英特尔实感深度流

Posted

技术标签:

【中文标题】在 Unity 中获取英特尔实感深度流【英文标题】:Get Intel RealSense Depth Stream in Unity 【发布时间】:2018-06-20 10:17:03 【问题描述】:

我目前正在尝试将新 RealSense Generation(D435、SDK2)的深度流作为 Unity 中的 Texture2D。我可以轻松地将常规 RGB 流作为 WebCamTexture 访问,当我尝试获取深度流时,我收到此错误:

Could not connect pins - RenderStream()

Unity 识别深度相机,但无法显示。

我也尝试使用 Unity Wrapper 的预制件,但它们对我的项目并不适用。如果我使用预制件,我可以将数据获取到 R16 纹理。有谁知道,我如何在图像中的某个点获取深度信息(GetPixel() 不适用于 R16 纹理......)?我更喜欢获取 WebCamTexture 流,如果这不起作用,我必须以不同的方式保存信息...

【问题讨论】:

【参考方案1】:

我为获取深度数据所做的是创建自己的继承自 RawImage 的类。我使用我的自定义类作为深度渲染流的目标,并从我的类中的纹理组件中获取图像。

Binding to custom class

在我的例子中,我想将 16 位深度数据转换为 8 位 pr 通道 rgb pgn,以便我可以将其导出为灰度图像。这是我解析图像数据的方式:

byte[] input = texture.GetRawTextureData();
        //create array of pixels from texture 
        //remember to convert to texture2D first
    Color[] pixels = new Color[width*height];

    //converts R16 bytes to PNG32
    for(int i = 0; i < input.Length; i+=2)
    

        //combine bytes into 16bit number
        UInt16 num = System.BitConverter.ToUInt16(input, i);
        //turn into float with range 0->1
        float greyValue = (float)num / 2048.0f;

        alpha = 1.0f;

        //makes pixels outside measuring range invisible
        if (num >= 2048 || num <= 0)
            alpha = 0.0f;

        Color grey = new Color(greyValue, greyValue, greyValue, alpha);

            //set grey value of pixel based on float
        pixels.SetValue(grey, i/2);
    

要获取像素,您可以简单地访问新的像素数组。

【讨论】:

谢谢,这是一个非常棒的解决方案!我现在使用二维浮点数组,并在录制视频时将其保存到序列化列表中……对于实时解决方案,我只使用 DepthTexture.GetDistance 方法。您的解决方案很棒,用于可视化深度信息!

以上是关于在 Unity 中获取英特尔实感深度流的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 拼接 RGB 和深度(英特尔实感)

英特尔实感深度摄像头 D435i 噪音和土堆

英特尔® 实感™ SDK 2.0 上的英特尔实感 D435i 帧丢失

VS 2015 中的加速度计与英特尔实感

英特尔实感 C# 将流录制到文件

是否可以使用英特尔实感 SDK 在电影/3D 视频中进行人脸交换?