使用Astra Pro获取深度数据遇NotImplementedException异常的解决问询
解决Astra Pro相机ColorBuffer抛NotImplementedException异常的方案
问题根源
核心问题是父类Buffer的设计不合理:它定义了只有DepthBuffer才需要的GetDepthAt抽象方法,还直接在父类逻辑中调用该方法(depthValue = GetDepthAt(320, 240)),给所有子类(包括ColorBuffer)强加了实现义务。单独显示深度图像时,只有DepthBuffer实例被创建,不会触发ColorBuffer的GetDepthAt;但同时显示彩色图像时,ColorBuffer实例被初始化,父类逻辑会调用它的GetDepthAt,导致抛出未实现异常。
具体解决方案
方案一:重构父类,拆分职责(推荐)
把深度相关逻辑从通用Buffer类中拆分,避免无关子类被迫实现不需要的方法:
- 构建两层父类结构:
- 基础
Buffer类:仅包含彩色、深度帧通用的属性/方法(如帧宽、帧高、像素格式等)。 - 新增
DepthBufferBase抽象类,继承Buffer,在其中定义GetDepthAt(int x, int y)抽象方法和DepthValue属性,将父类中调用GetDepthAt的逻辑移到这里。
- 基础
- 让
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维护深度值:
- 从父类
Buffer中移除DepthValue属性和GetDepthAt的调用逻辑。 - 将深度值计算逻辑移到
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
相关产品推荐
相关产品推荐

