使用D435i的心得
首先提供几个官方的路径:
1.Realsense SDK 2.0 Win10 安装程序网址
https://github.com/IntelRealSense/librealsense/releases/tag/v2.11.0
2.Realsense 官方文档集合
https://software.intel.com/en-us/realsense/documentation
3.Realsense SDK 2.0 API编程示例(很实用的API讲解)
https://github.com/IntelRealSense/librealsense/wiki/API-How-To
4.Realsense D415/D435 SDK示例程序
https://github.com/IntelRealSense/librealsense
5.Realsense交流社区
https://communities.intel.com/community/tech/realsense
记录使用过程。。
1)安装:
首先是SDK安装 ,一路默认安装就行,默认安装的路径是 C:\Program Files (x86)\Intel RealSense SDK 2.0
包含目录
C:\Program Files (x86)\Intel RealSense SDK 2.0\include\librealsense2
C:\Program Files (x86)\Intel RealSense SDK 2.0\include\librealsense2\h
C:\Program Files (x86)\Intel RealSense SDK 2.0\include\librealsense2\hpp
库目录
C:\Program Files (x86)\Intel RealSense SDK 2.0\lib\x86
C:\Program Files (x86)\Intel RealSense SDK 2.0\lib\x64
附加依赖项
realsense2.lib(重要);也可以添加现有的属性表! C:\Program Files (x86)\Intel RealSense SDK 2.0
版本使用Debug x64,,
2)SDK介绍
这两个是深度相机和RGB相机选项
从上至下,一次是分辨率、帧率、深度视差图、左相机图像、右相机图像
激光散斑编码
工作原理:双目+散斑
红外Projector投射静态的红外散斑,两个红外相机采集两张红外图像,图像处理芯片通过处理芯片通过两张红外图像匹配计算出视差图,在生成深度图。
Depth Visualization,这一栏中,两个滚动条控制的是相机的显示深度范围。默认是0到6米。
分辨率跟帧率
相机的分辨率与帧率不是可以随便选择的。有些选项不支持
这是不同分辨率下的帧率对比。可以选用
程序中 双目部分图像压缩格式仅支持 Y8 Y16 。
3)使用过程
我把realsense d435 的调用打包成了类,根据也是官方提供的库,内部含有注释。
主要使用的是相机部分,未使用陀螺仪以及IMU。
1.彩色图的 分辨率 帧率 图像压缩格式
相机的对比度 曝光值 色度 饱和度 清晰度 各种组合,相机一共提供了193种 我程序里写了方便队里用的那一部分,就比如它的默认图像压缩格式是RGB但是opencv显示得时候是BGR这就造成了图像颜色通道顺序不对,这样的类别本身没有意义。
/*彩色图像用的枚举 Color 压缩格式 分辨率 帧率*/ typedef enum _RealSenseColorType { COLOR_Y16_1920x1080_30Hz, COLOR_BGR8_1920x1080_30Hz, COLOR_Y16_1920x1080_15Hz, COLOR_BGR8_1920x1080_15Hz, COLOR_Y16_1920x1080_6Hz, COLOR_BGR8_1 。。。 。。。 。。。 。。。 COLOR_BGR8_320x180_60Hz, COLOR_Y16_320x180_30Hz, COLOR_BGR8_320x180_30Hz, COLOR_Y16_320x180_6Hz, COLOR_BGR8_320x180_6Hz, } RealSenseColorType;
2.深度图的 分辨率 帧率 图像压缩格式。
激光强度 曝光值 (对于两个捕获红外图像的相机 没有色度 清晰度 饱和度 对比度)深度图也有对应的枚举 相机提供的全都写上了
实际上还可以调用两个红外相机 我程序里并没有写出来 因为我只能打开左边的,但是单独打开它又没什么用我也就没写 双目加深度图一共96种组合 这里仅列出是深度图像的。
/*深度图像用的枚举 DEPTH 压缩格式 分辨率 帧率*/ typedef enum _RealSenseDepthType { DEPTH_Z16_1280x720_30HZ, DEPTH_Z16_1280x720_15HZ, DEPTH_Z16_1280x720_6HZ, 。。。 。。。 。。。 。。。 DEPTH_Z16_480x270_6HZ, DEPTH_Z16_424x240_90HZ, DEPTH_Z16_424x240_60HZ, DEPTH_Z16_424x240_30HZ, DEPTH_Z16_424x240_15HZ, DEPTH_Z16_424x240_6HZ } RealSenseDepthType;
3.其他函数
这个函数用于调整相机的属性 比如 对比度、曝光、饱和度、色度,具体要调整哪个跳进去看这个枚举。
/* 这个枚举用来控制D435的一些属性 例如曝光 亮度 白平衡等等 顺序是根据设备列表写出的,这里的顺序和数值均不可更改 */ typedef enum _ControlD435 { ENABLE = 0, // 启用 DISABLE, // 禁用 COLOR_Backlight_Compensation = 0, // 启用/禁用 背光补偿 默认禁用 COLOR_Brightness, // 彩色图像亮度 默认 0 范围(-64,64) COLOR_Contrast, // 彩色图像对比度 默认 50 范围(0,100) COLOR_Exposure, // 控制彩色相机的曝光时间。设置任何值将禁用自动曝光 // 默认 156 范围(39,10000) COLOR_Gain, // 彩色图像增益 默认 64 范围(0,128) COLOR_Gamma, // 彩色图像伽马设置 默认 300 范围(100,500) COLOR_Hue, // 彩色图像色调 默认 0 范围(-180,180) COLOR_Saturation, // 彩色图像饱和度设置 默认 64 范围(0,100) COLOR_Sharpness, // 彩色图像清晰度设置 默认 50 范围(0,100) COLOR_White_Balance, // 控制白色的彩色图像平衡。设置任何值将禁用自动白平衡 // 默认 4600 范围(2800,6500) COLOR_Enable_Auto_Exposure, // 启用/禁用 自动曝光 默认启用 COLOR_Enable_Auto_White_Balance, // 启用/禁用 自动白平衡 默认启用 COLOR_Frames_Queue_Size = 19, // 在给定的时间内,你可以持有最多的帧数。增加这个数字将减少帧数,但增加延迟,反之亦然 // 默认 16 COLOR_Power_Line_Frequency = 22, // 电力线频率 默认 Disalbe 其它值 50HZ,60HZ,Auto COLOR_Auto_Exposure_Priority = 30,// 自动曝光时限制曝光时间以保持恒定的FPS速率 // 默认 1 // 从这里断开 后面立体视觉有关的控制组件从100开始 使它有别于彩色相机 Stereo_Module = 99, STEREO_Exposure = 103, // 立体成像仪图像曝光 默认 8500 范围(20,166000) STEREO_Gain = 104, // 立体成像仪图像增益 默认 16 范围(16,248) STEREO_Enable_Auto_Exposure = 110, // 启用/禁用 自动曝光 默认启用 STEREO_Visual_Preset = 112, // 高级模式预置 STEREO_Laser_Power, // 手动激光功率为兆瓦。仅当激光功率模式设置为手动时才适用 // 默认 150 范围(0,360) STEREO_Emitter_Enabled = 118, // DS5投影仪的功率,0表示投影仪关闭,1指投影仪开启,2指自动投影仪模式 STEREO_Frames_Queue_Size, // 在给定的时间内,你可以持有最多的帧数。增加这个数字将减少帧数,但增加延迟,反之亦然 STEREO_Error_Polling_Enabled = 124, // 启用/禁用 摄像机内部错误轮询 默认启用 STEREO_Output_Trigger_Enabled = 126,// 从相机到外部设备每帧生成一次触发器 默认禁用 STEREO_Depth_Units = 128, // 由单个深度单元表示的米数 STEREO_Stereo_Baseline = 140, // 立体成像仪间毫米距离 }ControlD435;
开头是COLOR的是控制彩色相机的,,STEREO开头的是是控制双目相机的 ,后面的注释解释这些枚举的作用还有取值范围,枚举的顺序是根据官方库里的枚举写的顺序千万不要更改。
获取某一点的三维坐标。
#include <opencv2/opencv.hpp> #include "RealSenseD435.h" using namespace cv; int main() { RealSenseD435 d435; d435.depthInit(DEPTH_Z16_640x480_90HZ); d435.start(); Mat depth_color; Point3D _point3d; while (1) { // 数据更新 d435.updateFrame(); // 更新帧数据 d435.updateDepth(); // 更新深度流数据 // 获取彩色深度图 d435.get_depth_color_map(depth_color); // 更新实际坐标 d435.get_Coordinate(); // 获取图像中某一点对应的三维坐标 d435.point2D_to_Point3D(Point(depth_color.cols / 3,depth_color.rows / 3), _point3d); cout << "D: " << _point3d.D << endl; cout << "H: " << _point3d.H << endl; cout << "W: " << _point3d.W << endl << endl; imshow("depth_color", depth_color); char c = waitKey(1); if (c == 27)break; } }
可以根据着三个实际坐标分别合成图像
#include <opencv2/opencv.hpp> #include "RealSenseD435.h" using namespace cv; #define HEIGHT 240 #define WIDTH 424 int main() { RealSenseD435 d435; d435.depthInit(DEPTH_Z16_424x240_90HZ); d435.start(); Point3D _point3d; int i, j; Mat mapH = Mat::zeros(HEIGHT, WIDTH, CV_16SC1); Mat mapW = Mat::zeros(HEIGHT, WIDTH, CV_16SC1); Mat mapD = Mat::zeros(HEIGHT, WIDTH, CV_16UC1); while (1) { // 数据更新 d435.updateFrame(); // 更新帧数据 d435.updateColor(); d435.updateDepth(); // 更新深度流数据 // 更新实际坐标 d435.get_Coordinate(); static short *dataW, *dataH; unsigned short *dataD; static Point3D point3D; //将空间坐标点分别保存到不同矩阵上 for (i = 0; i < HEIGHT; i++) { dataW = mapW.ptr<short>(i); dataH = mapH.ptr<short>(i); dataD = mapD.ptr<unsigned short>(i); for (j = 0; j < WIDTH; j++) { // 提取图像上二维点对应的三维坐标 d435.point2D_to_Point3D(Point2i{ j,i }, point3D); dataW[j] = point3D.W; dataH[j] = point3D.H; dataD[j] = point3D.D; } } imshow("mapW", mapW); imshow("mapH", mapH); imshow("mapD", mapD); char c = waitKey(1); if (c == 27)break; } }