推荐后处理滤波列表

1. 快速开始

#include <libobsensor/ObSensor.hpp>

 

ob::Pipeline pipe;

auto device = pipe.getDevice();

 

// 第 1 步:获取目标 Sensor(以深度流为例)

auto sensor = device->getSensor(OB_SENSOR_DEPTH);

 

// 第 2 步:获取推荐 Filter 列表

auto filters = sensor->createRecommendedFilters();

 

// 第 3 步:检查是否有推荐 Filter

if(filters.empty()) {

    std::cout << "该 Sensor 不支持推荐后处理,直接使用原始帧即可。" << std::endl;

    return 0;

}

 

// 第 4 步:查看各 Filter 的初始启用状态

for(auto &filter : filters) {

    std::cout << filter->getName()

              << " : " << (filter->isEnabled() ? "enabled" : "disabled")

              << std::endl;

}

 

// 第 5 步:启动数据流

std::shared_ptr<ob::Config> config = std::make_shared<ob::Config>();

config->enableVideoStream(OB_STREAM_DEPTH);

pipe.start(config);

 

while(true) {

    auto frameSet = pipe.waitForFrameset(100);

    if(!frameSet) continue;

 

    auto depthFrame = frameSet->getFrame(OB_FRAME_DEPTH);

    if(!depthFrame) continue;

 

    // 第 6 步:依次应用启用的 Filter

    std::shared_ptr<ob::Frame> outFrame = depthFrame;

    for(auto &filter : filters) {

        if(filter->isEnabled()) {

            auto result = filter->process(outFrame);

            if(result) outFrame = result;

        }

    }

    // outFrame 是处理后的深度帧

}

⚠ 注意:推荐 Filter 列表与获取它的 Sensor 流类型绑定,只能处理对应类型的帧。例如从深度 Sensor 获取的推荐列表只能处理深度帧,传入其他类型帧会导致处理失败或返回 `nullptr`。

 

2. 查看、调整推荐列表

第一步:查看推荐 Filter 列表

auto filters = sensor->createRecommendedFilters();

std::cout << "推荐 Filter 列表(共 " << filters.size() << " 个):" << std::endl;

for(auto &filter : filters) {

    std::cout << "  - " << filter->getName()

              << "  [" << (filter->isEnabled() ? "enabled" : "disabled") << "]"

              << std::endl;

}

第二步:查看某个 Filter 的可调参数

确定目标 Filter 后,通过 getConfigSchemaVec() 查看它支持哪些参数及其范围、默认值:

字段

说明

name

参数名称

type

参数类型("int" / "float" / "bool")

min

最小值

max

最大值

step

步长

def

默认值

desc

参数描述

// 以 TemporalFilter 为例,查看其可调参数

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        for(auto &item : filter->getConfigSchemaVec()) {

            std::cout << "  " << item.name

                      << "  类型=" << item.type

                      << "  范围=[" << item.min << ", " << item.max << "]"

                      << "  步长=" << item.step

                      << "  默认=" << item.def

                      << std::endl;

        }

        break;

    }

}

第三步:读取当前参数值

getConfigSchemaVec() 返回的是参数的静态定义(范围、默认值),getConfigValue() 返回的是当前运行时实际生效的值。

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        double diffScale = filter->getConfigValue("diff_scale");

        double weight    = filter->getConfigValue("weight");

        std::cout << "diff_scale=" << diffScale

                  << "  weight=" << weight << std::endl;

        break;

    }

}

第四步:修改参数

方式一:通用方式(推荐)——适合运行时动态调整,无需关心 Filter 的具体类型:

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        filter->setConfigValue("diff_scale", 0.1);

        filter->setConfigValue("weight", 0.4);

        break;

    }

}

方式二:强类型方式——用 is<T>() 判断类型,as<T>() 转型为子类,调用专属 API,IDE 有补全:

for(auto &filter : filters) {

    if(filter->is<ob::TemporalFilter>()) {

        auto temporalFilter = filter->as<ob::TemporalFilter>();

        temporalFilter->setDiffScale(0.1f);

        temporalFilter->setWeight(0.4f);

    }

}

第五步:启用 / 禁用某个 Filter

for(auto &filter : filters) {

    if(filter->getName() == "TemporalFilter") {

        filter->enable(false);  // 临时禁用时序滤波

    }

}

注意事项

• 推荐列表中每个 Filter 的参数默认值是 SDK 针对当前连接设备的最优配置,直接使用通常可获得较好效果。

• 如需恢复默认值,重新调用 sensor->createRecommendedFilters() 即可,参数会重置为设备默认值。

 

3. 不同 Sensor 返回不同列表

⚠ 注意:推荐 Filter 列表与获取它的 Sensor 流类型绑定,列表中的 Filter 只能处理该 Sensor 对应流类型的帧。请确保传给 Filter 的帧类型与 Sensor 流类型一致。详情请参见 3.1 节注意事项。

不同流类型的 Sensor 返回不同的 Filter 列表:深度 Sensor 返回深度专用 Filter,彩色 Sensor 返回彩色专用 Filter。

// 深度流推荐 Filter

auto depthSensor  = device->getSensor(OB_SENSOR_DEPTH);

auto depthFilters = depthSensor->createRecommendedFilters();

 

// 彩色流推荐 Filter

auto colorSensor  = device->getSensor(OB_SENSOR_COLOR);

auto colorFilters = colorSensor->createRecommendedFilters();

不同设备型号返回的列表内容也不同。请务必通过 filter->getName() 按名称查找目标 Filter,不要用索引硬编码。

// 正确做法:按名称查找

for(auto &filter : filters) {

    if(filter->getName() == "ThresholdFilter") { /* ... */ }

}

 

// 错误做法:硬编码索引(不同设备顺序可能不同)

// auto thresholdFilter = filters[2];  // 不要这样用

推荐列表为空,说明该 Sensor 的数据流不支持推荐后处理,直接使用原始帧即可。


4. 对比与选择建议


直接创建 Filter

推荐 Filter 列表

上手难度

需了解各 Filter 用途和参数

无需了解细节,开箱即用

参数配置

手动设置,完全可控

设备最优默认值,按需微调

设备兼容

需自行确认当前设备是否支持目标 Filter

SDK   自动只返回当前设备支持的 Filter

Filter   选择

完全自主选择

由 SDK 根据设备型号决定

默认参数

需手动设置合适值

已是当前设备的最优配置

典型场景

产品定制、算法调优

快速集成、通用 Demo

 

选择建议

如果你是第一次使用,或者只是想快速看到效果,使用推荐 Filter 列表,几行代码即可跑通。

如果你需要选择特定的 Filter 组合,或者对参数有精确要求,使用直接创建 Filter

两种方式可以混合使用:先通过推荐列表了解设备支持哪些 Filter,再按需直接创建并精细调参。