从RealSense中提取完整的深度和彩色图像,并存在opencv中的Mat里

本文记录了学习调用Intel RealSense SDK并利用opencv处理图像的过程,强调理解代码、查找文档和解决问题的重要性。在使用RealSense获取深度和彩色图像时,发现深度图像存储为16位数据在8位数组中,需压缩到8位;彩色图像为YUY2格式,需转换为RGB。通过学习和实践,最终成功将图像保存在opencv的Mat中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天,简单的学习了如何调用别人函数,使用别人的代码,从开始的手足无措,到现在的胸有成竹(盲目的自信),想把这些总结起来,形成宝贵的经验教训,和大家分享。

1.使用别人的代码,可是要珍惜那几行人类的注释啊!
2.看完注释,了解了大概情况,从重点地方下手,找到最核心的代码,概括的了解写代码各自的意义(不必急需了解每一行代码的意义,抓住重点,节约时间)
3.对于不懂的函数但意义重大的函数,F12查看定义(对于vs),或者搜索开发者文档API。
4.如果碰到困难,饶了很多弯路,不要硬着头皮继续,这时候可能是思维的陷阱,休息一下,做点别的事情,再回过头来想,K.O.

有几个比较坑的地方
1.imshow必须碰到waitkey()才输出图像
2.深度信息,每个pixel是16位unsigned short类型,而竟然储存在8位byte的数组(指针)里,不知道为何这样做,我最后的处理方法是压缩到8位unsigned char中
3.彩色图像,默认是1080*1920的图像,但是,格式竟然是YUY2的,what ghost,还需要自己改成RGB格式的

直接分享源代码:

#include <pxcsensemanager.h>
#include <pxcsession.h>
#include "util_render.h"
#include <iostream>
#include <string>
#include <stdio.h>
<think>好的,我现在需要回答用户关于如何使用Intel RealSense SDK获取深度图并保存下来的问题。首先,用户是C++开发者,所以代码示例应该用C++。我需要考虑RealSense SDK的基本使用流程,包括初始化设备、配置管道、获取帧数据、处理深度帧以及保存为图像文件。 首先,用户需要安装RealSense SDK相应的库,比如librealsense2。然后,代码中应该包含必要的头文件,比如<librealsense2/rs.hpp>OpenCV的头文件,因为保存图像通常会用OpenCV的imwrite函数。不过,用户可能没有安装OpenCV,所以我也应该提供一个不依赖OpenCV的方法,比如直接处理数据并保存为PNG或PGM格式。 接下来,步骤应该是:创建管道,配置流(这只需要深度流),启动管道,等待帧数据,获取深度帧,然后处理帧数据。处理数据时,需要考虑深度数据的格式,通常是16位单通道,每个像素代表毫米单位的距离。保存时需要注意位深度,可能需要将数据转换为8位进行可视化,或者保持16位以保留原始数据。 对于保存部分,如果使用OpenCV的话,可以创建cv::Mat对象,将数据拷贝进去,然后用imwrite保存。如果不使用OpenCV,可以使用stb_image_write库或者直接写文件。这可能需要权衡,因为用户可能更熟悉OpenCV,但依赖第三方库可能不太方便。因此,在示例代码中,我应该提供两种方法,或者至少提到这两种可能性。 此外,异常处理也很重要,RealSenseAPI可能会抛出异常,所以需要用try-catch块来捕获可能的错误,比如没有设备连接或者帧数据获取失败。 最后,用户可能需要知道如何编译链接程序,所以需要提醒他们链接librealsense2可能的OpenCV库。同时,保存路径的问题,用户需要确保有写入权限,或者指定正确的文件路径。 现在,把这些思路整理成结构化的回答,包括步骤说明示例代码,同时解释每个部分的作用。然后提出相关问题,覆盖可能的后续疑问,比如配置其他流、点云处理、对齐深度彩色帧、实时显示等。</think><< 使用Intel RealSense SDK获取并保存深度图的步骤如下: 1. **环境配置**: 安装librealsense2库开发包(Windows可通过Intel官方安装包,Linux使用`apt-get install librealsense2-dev`) 2. **核心代码实现**: ```cpp #include <librealsense2/rs.hpp> #include <opencv2/opencv.hpp> // 用于图像保存 int main() try { // 创建管道对象 rs2::pipeline pipe; // 配置深度流参数(分辨率640x480,帧率30) rs2::config cfg; cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30); // 启动管道 pipe.start(cfg); // 等待下一帧数据(设置5000毫秒超时) rs2::frameset frames = pipe.wait_for_frames(5000); // 提取深度帧 rs2::depth_frame depth_frame = frames.get_depth_frame(); // 转换为OpenCV矩阵 cv::Mat depth_image( cv::Size(640, 480), CV_16UC1, (void*)depth_frame.get_data(), cv::Mat::AUTO_STEP ); // 保存为16位PNG(保留原始深度信息) cv::imwrite("depth_raw.png", depth_image); // 可选:转换为8位可视化(注意会损失精度) cv::Mat depth_visual; depth_image.convertTo(depth_visual, CV_8U, 255.0/65535); cv::imwrite("depth_visual.jpg", depth_visual); return EXIT_SUCCESS; } catch (const rs2::error & e) { std::cerr << "RealSense错误: " << e.what() << std::endl; return EXIT_FAILURE; } catch (const std::exception& e) { std::cerr << "常规错误: " << e.what() << std::endl; return EXIT_FAILURE; } ``` **关键点解释**: - `RS2_FORMAT_Z16`:深度图原始格式为16位无符号整数(单位:毫米) - `cv::Mat`构造:直接使用传感器内存数据,避免拷贝 - 双格式保存:PNG保留原始数据(后续处理用),JPG用于快速查看 - 异常处理:捕获设备断开、帧超时等异常 **编译指令示例**: ```bash g++ -std=c++11 depth_save.cpp -o depth_save \ -I/usr/local/include -L/usr/local/lib \ -lrealsense2 `pkg-config --libs --cflags opencv4` ``` **无OpenCV的替代方案**: 可使用libtiff或stb_image_write库直接写入16位文件: ```cpp #include <fstream> // 保存原始16位数据 std::ofstream raw_file("depth.raw", std::ios::binary); raw_file.write((char*)depth_frame.get_data(), depth_frame.get_data_size()); ```
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值