RealSence D455 读取深度流,获取深度值

发布时间 2023-12-09 23:56:59作者: 八爪鱼~

RealSence D455 摄像头的深度模式

使用C#、控制台程序操作,D455型号的摄像头。

  • 创建新的控制台项目,项目名称:RealSenceCameraD455_Test01,框架选择.net6.0。

  • Nuget搜索并安装:Intel.RealSenceWithNativeDll,此SDK是Intel的2代库。

  • 搭建项目

using Intel.RealSense;
using System.Diagnostics;
​
namespace RealSenseCameraD455_Test01
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //  RealSence上下文实例
            using var ctx = new Context();
​
            //  通过上下文,寻找本机中的RealSence摄像头
            var list = ctx.QueryDevices();
​
            if (list.Count <= 0)
            {
                Debug.WriteLine("相机设备数量为0!");
            }
​
            //  获取第一个摄像头实例
            Device camera = list[0];
​
            //  打印摄像头名称
            Console.WriteLine("摄像头名称:{0}", camera.Info[CameraInfo.Name]);
            //  打印摄像头序列号
            Console.WriteLine("摄像头序列号:{0}", camera.Info[CameraInfo.SerialNumber]);
            //  打印摄像头固件版本号
            Console.WriteLine("摄像头固件版本:{0}", camera.Info[CameraInfo.FirmwareVersion]);
            //  打印摄像头生产序列号          //  Device实例中的Info属性中还有其他一些摄像头的信息
            Console.WriteLine("摄像头生产序号:{0}", camera.Info[CameraInfo.ProductId]);
​
            //  用于配置摄像头(使用摄像头中的哪些功能)
            using var config = new Config();
​
            //  初始化流(此处初始化深度流,用于显示深度图像及被测物体的距离值)
            config.EnableStream(Intel.RealSense.Stream.Depth, 640, 480, Format.Z16, 30);
​
            //  创建管道实例,管道对象用于连接电脑与摄像头,数据通过管道输送至电脑
            using var pipeLine = new Pipeline(ctx);
​
            pipeLine.Start(config);
​
            while (true)
            {
                //  电脑端从管道等待获取所有的帧数据
                using var frames = pipeLine.WaitForFrames(1000);
​
                //  获取深度帧
                using var deepFrame = frames.DepthFrame;
​
                if(deepFrame != null)
                {
                    ushort[] depthData = new ushort[deepFrame.Width * deepFrame.Height];
                    deepFrame.CopyTo(depthData);
​
                    // 获取中心像素的深度值
                    int centerX = deepFrame.Width / 2;
                    int centerY = deepFrame.Height / 2;
                    int centerIndex = centerY * deepFrame.Width + centerX;
                    ushort depthValue = depthData[centerIndex];
​
                    // 在控制台中打印摄像头检测到目标物体的距离值
                    Console.WriteLine($"中心像素的深度值:{depthValue} 毫米");
                }
​
                Thread.Sleep(100);
            }
        }
    }
}

 

 

流程汇总

  1. 创建Context上下文实例,通过上下文查找目标摄像头

  2. 创建Config实例,达成使用此摄像头的目的。可以选择不同的模式(目的,或者组合使用)

    • Stream.Depth 深度模式

    • Stream.Color 彩色模式

    • Stream.Infrared 红外线模式

    • Stream.Accel 加速模式 accelerometer motion

    • Stream.Fisheye 鱼眼模式

    • Stream.Gyro 陀螺仪模式 gyroscope

    • Stream.Gpio 通过Gpio接口连接获取数据的模式

    • Stream.Pose Stream.Confidence 六个自由度的姿势数据

  3. 创建Pipeline管道实例,通过管道,使得摄像头与电脑建立联系,简化操作流程

  4. 通过PipeLine实例获取大量帧数据,处理这些帧数据,达到自己的目的