名仕亚洲|Home

    推荐后处理滤波列表

    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,再按需直接创建并精细调参。


    产品大图