当前位置: 首页 > news >正文

机器视觉---Intel RealSense SDK 2.0 开发流程

ntel RealSense SDK 2.0的核心开发流程与其他深度相机类似围绕设备管理、数据流处理和高级功能集成三大模块展开。

tips:基于SDK的开发,目前可以高效利用AI搭建框架,然后针对具体的SDK去跳转查阅,将代码修改到正确,利用SDK自带的显示软件,查看不同初始化 滤波 等设置的效果,可以进行高效开发。

一、初始化与设备管理

1. 上下文创建

rs2::context是SDK的基础,负责管理所有设备资源和底层通信:

rs2::context ctx;  // 创建上下文,自动检测系统中的RealSense设备

2. 设备枚举与筛选

通过上下文获取设备列表并进行筛选:

rs2::device_list devices = ctx.query_devices();  // 获取所有连接的设备
if (devices.empty()) {throw std::runtime_error("未检测到RealSense设备");
}// 遍历设备并筛选目标设备
rs2::device target_device;
for (auto&& dev : devices) {// 可根据设备名称、序列号等筛选if (std::string(dev.get_info(RS2_CAMERA_INFO_NAME)) == "Intel RealSense D435") {target_device = dev;break;}
}

3. 设备信息查询

获取设备基本参数和能力:

// 设备基本信息
std::string name = target_device.get_info(RS2_CAMERA_INFO_NAME);
std::string serial = target_device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
std::string firmware = target_device.get_info(RS2_CAMERA_INFO_FIRMWARE_VERSION);// 传感器列表
std::vector<rs2::sensor> sensors = target_device.query_sensors();
for (auto&& sensor : sensors) {// 传感器类型判断(深度、彩色、IMU等)if (sensor.is<rs2::depth_sensor>()) {// 处理深度传感器}
}

二、数据流配置与启动

1. 管道创建

rs2::pipeline是处理数据流的核心接口,简化了设备控制流程:

rs2::pipeline pipe(ctx);  // 绑定上下文创建管道

2. 流配置

使用rs2::config配置需要启用的数据流参数:

rs2::config cfg;// 配置深度流:分辨率640x480,格式Z16,帧率30fps
cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);
// 配置彩色流:分辨率1280x720,格式RGB8,帧率30fps
cfg.enable_stream(RS2_STREAM_COLOR, 1280, 720, RS2_FORMAT_RGB8, 30);// 可选:从录制文件读取(替代实时设备)
// cfg.enable_device_from_file("recording.bag");// 可选:录制到文件
// cfg.enable_record_to_file("output.bag");

3. 启动管道

应用配置并启动数据流:

// 启动管道并获取配置文件
rs2::pipeline_profile profile = pipe.start(cfg);// 从配置文件中获取实际启用的流信息
auto depth_stream = profile.get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>();
int depth_width = depth_stream.width();
int depth_height = depth_stream.height();

三、帧捕获与处理

1. 帧获取

通过管道获取同步的帧集合:

// 方法1:阻塞等待新帧(超时时间5000ms)
rs2::frameset frames = pipe.wait_for_frames(5000);// 方法2:非阻塞获取(适合实时性要求高的场景)
if (rs2::frameset fs; pipe.poll_for_frames(&fs)) {// 处理帧数据
}

2. 帧类型提取

从帧集合中提取特定类型的帧:

// 获取深度帧
rs2::depth_frame depth_frame = frames.get_depth_frame();
// 获取彩色帧
rs2::video_frame color_frame = frames.get_color_frame();// 检查帧有效性
if (!depth_frame || !color_frame) {continue;  // 无效帧则跳过
}

3. 帧数据访问

获取帧的基本信息和原始数据:

// 深度帧数据访问
uint16_t* depth_data = (uint16_t*)depth_frame.get_data();
int depth_stride = depth_frame.get_stride_in_bytes() / sizeof(uint16_t);
float center_distance = depth_frame.get_distance(width/2, height/2);  // 获取中心点距离// 彩色帧数据访问
uint8_t* color_data = (uint8_t*)color_frame.get_data();
int color_stride = color_frame.get_stride_in_bytes();

四、高级功能集成

配置详细的操作参考SDK和开发工具 Depth Quality Tool for RealSense Cameras 、RealSense Viewer的实际效果进行修改

1. 帧对齐

将深度帧与彩色帧对齐(基于相机内参):

// 创建对齐器(对齐到彩色流)
rs2::align align(RS2_STREAM_COLOR);// 处理帧集合,获取对齐后的帧
rs2::frameset aligned_frames = align.process(frames);
rs2::depth_frame aligned_depth = aligned_frames.get_depth_frame();  // 已对齐的深度帧

2. 深度数据滤波

应用滤波算法优化深度数据:

// 创建滤波器链
rs2::decimation_filter dec_filter;  // 降采样,减少数据量
rs2::spatial_filter spat_filter;    // 空间滤波,平滑深度数据
rs2::temporal_filter temp_filter;   // 时间滤波,利用帧间相关性// 配置滤波器参数
spat_filter.set_option(RS2_OPTION_HOLES_FILL, 2);  // 填充空洞// 应用滤波
rs2::frame filtered = dec_filter.process(aligned_depth);
filtered = spat_filter.process(filtered);
filtered = temp_filter.process(filtered);

3. 点云生成

将深度数据转换为3D点云:

rs2::pointcloud pc;
rs2::points points;// 将点云与彩色帧关联(获取颜色信息)
pc.map_to(color_frame);
// 从深度帧计算点云
points = pc.calculate(aligned_depth);// 访问点云数据
auto vertices = points.get_vertices();  // 点坐标数组
auto tex_coords = points.get_texture_coordinates();  // 纹理坐标

五、资源释放与错误处理

1. 停止

pipe.stop();  // 停止管道,释放设备资源

2. 错误处理机制

try {// SDK操作代码
}
catch (const rs2::error& e) {std::cerr << "SDK错误: " << e.what() << " (" << e.get_failed_function() << ")" << std::endl;
}
catch (const std::exception& e) {std::cerr << "系统错误: " << e.what() << std::endl;
}

核心流程示例代码

#include <librealsense2/rs.hpp>
#include <iostream>
#include <vector>int main() {try {// 1. 初始化上下文rs2::context ctx;auto devices = ctx.query_devices();if (devices.empty()) {throw std::runtime_error("未找到RealSense设备");}std::cout << "找到设备: " << devices[0].get_info(RS2_CAMERA_INFO_NAME) << std::endl;// 2. 创建并配置管道rs2::pipeline pipe(ctx);rs2::config cfg;// 配置流参数cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_RGB8, 30);// 3. 启动管道rs2::pipeline_profile profile = pipe.start(cfg);// 获取流配置信息auto depth_profile = profile.get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>();auto color_profile = profile.get_stream(RS2_STREAM_COLOR).as<rs2::video_stream_profile>();std::cout << "深度流: " << depth_profile.width() << "x" << depth_profile.height() << std::endl;std::cout << "彩色流: " << color_profile.width() << "x" << color_profile.height() << std::endl;// 4. 初始化辅助工具rs2::align align(RS2_STREAM_COLOR);  // 帧对齐器rs2::spatial_filter spat_filter;     // 空间滤波器// 5. 主循环:捕获并处理帧const int MAX_FRAMES = 100;for (int i = 0; i < MAX_FRAMES; ++i) {// 获取帧集合rs2::frameset frames = pipe.wait_for_frames();// 帧对齐auto aligned_frames = align.process(frames);rs2::depth_frame depth = aligned_frames.get_depth_frame();rs2::video_frame color = aligned_frames.get_color_frame();// 深度滤波rs2::frame filtered_depth = spat_filter.process(depth);// 计算中心点距离float distance = depth.get_distance(depth_profile.width()/2, depth_profile.height()/2);std::cout << "\r第" << i+1 << "帧 - 中心距离: " << distance << "米" << std::flush;}// 6. 停止管道pipe.stop();std::cout << "\n程序正常结束" << std::endl;} catch (const rs2::error& e) {std::cerr << "\nSDK错误: " << e.what() << std::endl;return EXIT_FAILURE;} catch (const std::exception& e) {std::cerr << "\n错误: " << e.what() << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}

核心流程关键点

  1. 上下文与管道rs2::context是设备管理基础,rs2::pipeline是数据流处理的核心接口
  2. 流配置原则:需根据设备能力设置合理的分辨率、格式和帧率组合
  3. 帧同步机制rs2::frameset保证多流数据的时间同步
  4. 数据处理流程:原始帧 → 对齐 → 滤波 → 应用(点云/测量等)
  5. 资源管理:确保管道正确停止以释放设备资源
http://www.dtcms.com/a/568633.html

相关文章:

  • 【AI基础篇】Transformer架构深度解析与前沿应用
  • QuickNacos
  • 用Python来学微积分30-微分方程初步
  • Opencv(七) : 图像颜色替换
  • Skywalking运维之路(Skywalking服务搭建)
  • 网站开发及建设赔偿条款中国最牛的十大企业
  • 广州全运会即将开幕,获得文远知行自动驾驶技术支持
  • 在智能制造语境下理解ISA-95、IIoT和UNS
  • 网站建设 服务器 预算报价清单企业展厅设计公司虎
  • 算法学习入门---前缀和(C++)
  • 一键生成系统架构图
  • 2025国产MOM系统全景透视:谁在领跑智能制造新赛道?
  • 系统架构设计师备考第64天——网络构建关键技术
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十五讲)
  • 网站备案个人可以做吗thinkphp cms开源系统
  • 一般电脑网站建设及运营多少钱中国最新军事新闻报道
  • Elasticsearch+Logstash+Filebeat+Kibana部署[7.17.3版本]
  • Elasticsearch单机部署全指南
  • 前端实战开发(三):Vue+Pinia中三大核心问题解决方案!!!
  • 从零开始:开发一个仓颉三方库的完整实战
  • 本机 MongoDB 注册系统服务、启用security认证
  • Nginx代理配置的“双斜杠陷阱“:从IP到域名的完整排查与解决指南
  • 三水容桂网站制作天眼查企业信息查询平台
  • HarmonyOS鸿蒙开发:Swiper组件实现精美轮播图
  • 互联网大厂前端面试实录:HTML5、ES6、Vue/React、工程化与性能优化全覆盖
  • 宣威网站建设公司做钓鱼网站要什么工具
  • VBA中类的解读及应用第二十九讲: 最简单的类属性建立
  • 金蝶用友数据分析:奥威BI解锁ERP智能决策新纪元
  • 用Python做数据分析之数据表清洗
  • AI+CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析