快速创建一个后处理滤波

1. 快速开始

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 ...

}

 

2. 串联多个 Filter

多个 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 是经过完整处理链后的点云帧

 

3. 其他常用接口

// 关闭 Filter

filter->enable(false);

// 开启 Filter

filter->enable(true);

 

// 查询当前是否启用

bool enabled = filter->isEnabled();