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

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM