首先提供幾個官方的路徑:
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; } }