You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Astra Pro获取深度数据遇NotImplementedException异常的解决问询

解决Astra Pro相机ColorBuffer抛NotImplementedException异常的方案

问题根源

核心问题是父类Buffer的设计不合理:它定义了只有DepthBuffer才需要的GetDepthAt抽象方法,还直接在父类逻辑中调用该方法(depthValue = GetDepthAt(320, 240)),给所有子类(包括ColorBuffer)强加了实现义务。单独显示深度图像时,只有DepthBuffer实例被创建,不会触发ColorBuffer的GetDepthAt;但同时显示彩色图像时,ColorBuffer实例被初始化,父类逻辑会调用它的GetDepthAt,导致抛出未实现异常。


具体解决方案

方案一:重构父类,拆分职责(推荐)

把深度相关逻辑从通用Buffer类中拆分,避免无关子类被迫实现不需要的方法:

  1. 构建两层父类结构:
    • 基础Buffer类:仅包含彩色、深度帧通用的属性/方法(如帧宽、帧高、像素格式等)。
    • 新增DepthBufferBase抽象类,继承Buffer,在其中定义GetDepthAt(int x, int y)抽象方法和DepthValue属性,将父类中调用GetDepthAt的逻辑移到这里。
  2. 让DepthBuffer继承DepthBufferBase并实现GetDepthAt;ColorBuffer直接继承基础Buffer类,无需处理深度相关逻辑。

示例代码结构:

// 通用基础Buffer类
public abstract class Buffer
{
    public int Width { get; protected set; }
    public int Height { get; protected set; }
    // 其他通用属性/方法
}

// 深度专用抽象父类
public abstract class DepthBufferBase : Buffer
{
    private float _depthValue;

    public float DepthValue
    {
        get
        {
            _depthValue = GetDepthAt(320, 240);
            return _depthValue;
        }
    }

    public abstract float GetDepthAt(int x, int y);
}

// 深度帧处理类
public class DepthBuffer : DepthBufferBase
{
    public override float GetDepthAt(int x, int y)
    {
        short nativeDepth = GetNativeDepthAt(x, y);
        return (float)nativeDepth;
    }

    private short GetNativeDepthAt(int x, int y)
    {
        // Astra相机原生深度获取逻辑
        return 0;
    }
}

// 彩色帧处理类
public class ColorBuffer : Buffer
{
    // 仅实现彩色帧相关逻辑
}

方案二:修改父类调用逻辑,避免跨子类强制调用

如果不想重构类结构,调整父类Buffer的逻辑,只让DepthBuffer维护深度值:

  1. 从父类Buffer中移除DepthValue属性和GetDepthAt的调用逻辑。
  2. 将深度值计算逻辑移到DepthBuffer内部单独维护。

示例代码修改:

public abstract class Buffer
{
    public int Width { get; protected set; }
    public int Height { get; protected set; }
    // 保留通用方法,移除深度相关内容
}

public class DepthBuffer : Buffer
{
    private float _depthValue;

    public float DepthValue
    {
        get
        {
            _depthValue = GetDepthAt(320, 240);
            return _depthValue;
        }
    }

    public float GetDepthAt(int x, int y)
    {
        short nativeDepth = GetNativeDepthAt(x, y);
        return (float)nativeDepth;
    }

    private short GetNativeDepthAt(int x, int y)
    {
        // 原生深度获取逻辑
        return 0;
    }
}

public class ColorBuffer : Buffer
{
    // 彩色帧处理逻辑,无需处理深度相关内容
}

方案三:临时规避(不推荐,仅应急用)

如果暂时无法重构代码,修改ColorBuffer的GetDepthAt方法返回合理默认值,同时确保UI逻辑不会从ColorBuffer实例读取DepthValue:

public class ColorBuffer : Buffer
{
    public override float GetDepthAt(int x, int y)
    {
        // 返回无效深度值,比如NaN表示无数据
        return float.NaN;
        // 或根据场景返回0
        // return 0f;
    }

    // 彩色帧处理逻辑
}

内容的提问来源于stack exchange,提问作者Chiruyo_Isaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:40:21