以 ThresholdFilter 为例,3 步完成一次后处理:
#include <libobsensor/ObSensor.hpp>
// 第 1 步:创建 Filter
auto thresholdFilter = std::make_shared<ob::ThresholdFilter>();
// 第 2 步:设置参数(只保留 300mm~3000mm 范围内的深度值)
thresholdFilter->setValueRange(300, 3000);
// 第 3 步:处理帧(depthFrame 来自 Pipeline 获取的 FrameSet)
auto outFrame = thresholdFilter->process(depthFrame);
if(outFrame) {
auto processedDepth = outFrame->as<ob::DepthFrame>();
// 使用 processedDepth ...
}
多个 Filter 可以依次串联,将上一个 Filter 的输出作为下一个 Filter 的输入。
串联顺序(深度流)
格式转换(FormatConvertFilter)
→ 降采样(DecimationFilter)
→ 序列筛选(SequenceIdFilter)
→ 阈值过滤(ThresholdFilter)
→ 降噪(EdgeNoiseRemovalFilter/FalsePositiveFilter/
MgcNoiseRemovalFilter/LutNoiseRemovalFilter)
→ 空间平滑(SpatialAdvancedFilter/SpatialFastFilter/
SpatialModerateFilter)
→ 时序平滑(TemporalFilter)
→ 填孔(HoleFillingFilter)
→ 软件对齐(Align)
→ 点云(PointCloudFilter)
⚠ 注意:斜杠(/)表示同一阶段可选其一,根据设备型号和场景需求选择。使用时保持各 Filter 的相对顺序不变,调整顺序可能产生非预期的效果。
代码示例(以阈值过滤 → 降噪 → 空间平滑 → 软件对齐 → 点云为例):
auto thresholdFilter = std::make_shared<ob::ThresholdFilter>();
thresholdFilter->setValueRange(300, 3000);
thresholdFilter->enable(true);
auto edgeFilter = std::make_shared<ob::EdgeNoiseRemovalFilter>();
edgeFilter->enable(true);
auto spatialFilter = std::make_shared<ob::SpatialAdvancedFilter>();
spatialFilter->enable(true);
auto alignFilter = std::make_shared<ob::Align>(OB_STREAM_COLOR);
alignFilter->enable(true);
auto pointCloudFilter = std::make_shared<ob::PointCloudFilter>();
pointCloudFilter->setCreatePointFormat(OB_FORMAT_RGB_POINT);
pointCloudFilter->enable(true);
// 每帧处理应在独立线程中进行,不要在获取帧数据的线程或回调线程中直接调用
if(!frameSet) return;
auto depthFrame = frameSet->getFrame(OB_FRAME_DEPTH);
auto colorFrame = frameSet->getFrame(OB_FRAME_COLOR);
if(!depthFrame || !colorFrame) return;
std::shared_ptr<ob::Frame> outFrame = frameSet;
for(auto &filter : std::vector<std::shared_ptr<ob::Filter>>{
thresholdFilter, edgeFilter, spatialFilter,
alignFilter, pointCloudFilter}) {
if(outFrame) {
outFrame = filter->process(outFrame);
}
}
// outFrame 是经过完整处理链后的点云帧
// 关闭 Filter
filter->enable(false);
// 开启 Filter
filter->enable(true);
// 查询当前是否启用
bool enabled = filter->isEnabled();