抖圈|Home

    快速创建一个后处理滤波

    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();

     

    产品大图