#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`。
第一步:查看推荐 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() 即可,参数会重置为设备默认值。
⚠ 注意:推荐 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 的数据流不支持推荐后处理,直接使用原始帧即可。
直接创建 Filter | 推荐 Filter 列表 | |
上手难度 | 需了解各 Filter 用途和参数 | 无需了解细节,开箱即用 |
参数配置 | 手动设置,完全可控 | 设备最优默认值,按需微调 |
设备兼容 | 需自行确认当前设备是否支持目标 Filter | SDK 自动只返回当前设备支持的 Filter |
Filter 选择 | 完全自主选择 | 由 SDK 根据设备型号决定 |
默认参数 | 需手动设置合适值 | 已是当前设备的最优配置 |
典型场景 | 产品定制、算法调优 | 快速集成、通用 Demo |
选择建议
• 如果你是第一次使用,或者只是想快速看到效果,使用推荐 Filter 列表,几行代码即可跑通。
• 如果你需要选择特定的 Filter 组合,或者对参数有精确要求,使用直接创建 Filter。
• 两种方式可以混合使用:先通过推荐列表了解设备支持哪些 Filter,再按需直接创建并精细调参。