使用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;
	}
}

  

  

 

posted @ 2021-07-23 15:31  LyAsano  阅读(2431)  评论(0编辑  收藏  举报