第一步,當(dāng)然是包含頭文件啦
#include <librealsense2/rs.hpp>
#include<librealsense2/rsutil.h>
第二步,初始化RealSense相機(jī)的上下文,能查看多個(gè)相機(jī),以及相機(jī)的狀態(tài)和信息。
auto devs = ctx.query_devices(); // Get device list
int device_num = devs.size();
std::cout << "獲取相機(jī)設(shè)備號(hào):" << device_num << std::endl; // Device amount
第三步,創(chuàng)建數(shù)據(jù)管道和數(shù)據(jù)流參數(shù)文件,對(duì)數(shù)據(jù)流參數(shù)進(jìn)行設(shè)置,包括啟動(dòng)深度流還是彩色流,分辨率等。
//創(chuàng)建數(shù)據(jù)管道和參數(shù)文件
rs2::pipeline pipe;
rs2::config cfg;
cfg.enable_stream(RS2_STREAM_DEPTH,640,480,RS2_FORMAT_Z16,30);
cfg.enable_stream(RS2_STREAM_COLOR,640,480,RS2_FORMAT_BGR8,30);
????????在使用Intel RealSense相機(jī)進(jìn)行編程時(shí),首先需要?jiǎng)?chuàng)建一個(gè)rs2::pipeline
對(duì)象,并使用該對(duì)象啟動(dòng)相機(jī)的數(shù)據(jù)流。在啟動(dòng)數(shù)據(jù)流后,相機(jī)將根據(jù)配置的參數(shù)生成相應(yīng)的數(shù)據(jù)流,例如深度、彩色或紅外流,并將這些數(shù)據(jù)傳輸?shù)接?jì)算機(jī)中。
-
RS2_STREAM_DEPTH
:指定啟用的流類(lèi)型為深度流,即獲取相機(jī)輸出的深度圖像。 -
640
和480
:指定深度圖像的分辨率為640x480。 -
RS2_FORMAT_Z16
:指定深度圖像的像素格式為Z16,即每個(gè)像素用16位整數(shù)表示深度值。 -
30
:指定深度流的幀率為30幀
第四步,創(chuàng)建設(shè)備和一個(gè)流配置的組合,給接口提供訪(fǎng)問(wèn)流配置,設(shè)別信息和相應(yīng)傳感器的選項(xiàng)。
最最重要的是,我們能通過(guò)該接口直接拿到相機(jī)的內(nèi)參。
//start()函數(shù)返回?cái)?shù)據(jù)管道的profile
rs2::pipeline_profile profile = pipe.start(cfg);
????????在獲取數(shù)據(jù)流之前,需要首先通過(guò)調(diào)用rs2::pipeline::start()
方法啟動(dòng)數(shù)據(jù)流,并使用返回的rs2::pipeline_profile
對(duì)象來(lái)訪(fǎng)問(wèn)流的配置和設(shè)備信息。通過(guò)rs2::pipeline_profile
對(duì)象可以獲取相機(jī)的設(shè)備序列號(hào)、固件版本、傳感器列表以及每個(gè)傳感器的選項(xiàng)和特性。同時(shí),還可以通過(guò)rs2::pipeline_profile
對(duì)象訪(fǎng)問(wèn)深度流、彩色流或其他流的分辨率、幀速率、格式等配置參數(shù),以便進(jìn)行后續(xù)的數(shù)據(jù)處理和分析。
獲取深度圖內(nèi)參,
//獲取內(nèi)參
auto stream = profile.get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>();
const auto intrinsics = stream.get_intrinsics();
先獲取深度流的視頻流配置信息,以便進(jìn)一步使用這些信息對(duì)深度數(shù)據(jù)進(jìn)行處理和分析,比如獲取深度內(nèi)參。
具體而言,程序首先調(diào)用rs2::pipeline_profile::get_stream()
方法獲取深度流的流配置信息,然后使用as<rs2::video_stream_profile>()
方法將其轉(zhuǎn)換為rs2::video_stream_profile
類(lèi)型的對(duì)象。這樣可以方便地訪(fǎng)問(wèn)深度流的分辨率、內(nèi)參,幀率、像素格式等配置參數(shù)。
RealSense相機(jī)的內(nèi)參包括深度圖內(nèi)參和彩色圖內(nèi)參,下面給出一個(gè)獲取兩種內(nèi)參的簡(jiǎn)單示例:
rs2::config cfg;
cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);
rs2::pipeline pipe;
auto profile = pipe.start(cfg).get_active_profile();
auto depth_stream = profile.get_stream(RS2_STREAM_DEPTH).as<rs2::video_stream_profile>();
auto depth_intrinsics = depth_stream.get_intrinsics();
auto color_stream = profile.get_stream(RS2_STREAM_COLOR).as<rs2::video_stream_profile>();
auto color_intrinsics = color_stream.get_intrinsics();
這里回到我們的代碼中來(lái),stream.get_intrinsics();函數(shù)獲取深度內(nèi)參,內(nèi)參矩陣是相機(jī)的重要參數(shù)之一,描述了相機(jī)的內(nèi)部幾何結(jié)構(gòu),包括相機(jī)的焦距、主點(diǎn)位置和像素尺寸等信息。在計(jì)算深度圖像和三維點(diǎn)云時(shí),需要使用深度相機(jī)的內(nèi)參矩陣對(duì)深度值進(jìn)行校正和轉(zhuǎn)換,以得到準(zhǔn)確的三維坐標(biāo)。
rs2::align align_to_color(RS2_STREAM_COLOR);
rs2::frameset frameset;
rs2::align
類(lèi)是一個(gè)幫助類(lèi),用于將不同傳感器的幀對(duì)齊,以便于將它們組合在一起進(jìn)行處理。在該程序中,通過(guò)RS2_STREAM_COLOR
參數(shù)指定將深度幀對(duì)齊到彩色幀。這樣,對(duì)齊后的深度幀和彩色幀具有相同的時(shí)間戳和空間參考系,可以方便地進(jìn)行聯(lián)合處理。
rs2::frameset
類(lèi)是一個(gè)幀集合類(lèi),用于獲取一組關(guān)聯(lián)的幀。在該程序中,rs2::frameset
對(duì)象用于存儲(chǔ)從相機(jī)獲取的多個(gè)幀,包括彩色圖像、深度圖像、紅外圖像等。通過(guò)獲取這些幀,可以進(jìn)行基于深度數(shù)據(jù)的三維重建、物體檢測(cè)、姿態(tài)估計(jì)等應(yīng)用。同時(shí),通過(guò)使用幀集合類(lèi),還可以實(shí)現(xiàn)多幀數(shù)據(jù)的同步采集、保存和回放等功能。
將深度幀對(duì)齊到彩色幀和將彩色幀對(duì)齊到深度幀的區(qū)別:
將深度幀對(duì)齊到彩色幀的操作是一種常見(jiàn)的操作,目的是將深度數(shù)據(jù)和彩色圖像在時(shí)間和空間上進(jìn)行對(duì)齊,以便于將它們組合在一起進(jìn)行處理。由于深度相機(jī)和彩色相機(jī)采集數(shù)據(jù)的方式不同,因此在時(shí)間和空間上可能存在一定的偏差。通過(guò)對(duì)齊后,可以得到時(shí)間戳和空間參考系完全一致的深度幀和彩色幀,從而方便地進(jìn)行聯(lián)合處理。在實(shí)際應(yīng)用中,將深度幀對(duì)齊到彩色幀通常更為常見(jiàn),因?yàn)椴噬珗D像通常具有更高的分辨率和更豐富的信息,可以提供更準(zhǔn)確的場(chǎng)景信息,有助于深度信息的校正和增強(qiáng)。
將彩色幀對(duì)齊到深度幀的操作相對(duì)較少見(jiàn),通常在需要進(jìn)行基于深度數(shù)據(jù)的像素級(jí)別處理時(shí)使用。由于深度圖像和彩色圖像的分辨率和采集方式不同,因此在像素級(jí)別的處理中可能會(huì)出現(xiàn)誤差。通過(guò)將彩色幀對(duì)齊到深度幀,可以根據(jù)深度數(shù)據(jù)對(duì)彩色圖像進(jìn)行校正,從而提高像素級(jí)別處理的精度。例如,在進(jìn)行虛擬現(xiàn)實(shí)應(yīng)用時(shí),需要將虛擬物體的圖像合成到真實(shí)場(chǎng)景中。此時(shí),需要根據(jù)深度圖像的信息將虛擬物體正確地投影到真實(shí)場(chǎng)景中,從而實(shí)現(xiàn)逼真的效果。為了實(shí)現(xiàn)此目的,需要將彩色圖像對(duì)齊到深度圖像。
第五步,通過(guò)創(chuàng)建的管道獲取數(shù)據(jù)流。
frameset = pipe.wait_for_frames();
frameset = align_to_color.process(frameset);
可以說(shuō)前面四不全部是準(zhǔn)備工作。到第五步才相機(jī)開(kāi)始正式工作。
這段代碼是使用RealSense相機(jī)的C++ API獲取深度和彩色圖像,并將深度幀對(duì)齊到彩色幀。具體來(lái)說(shuō),代碼分為兩個(gè)步驟:
-
pipe.wait_for_frames()
:等待獲取一幀包含深度和彩色圖像的幀集。 -
align_to_color.process(frameset)
:將獲取到的深度幀對(duì)齊到彩色幀,返回一個(gè)包含對(duì)齊后深度和彩色幀的新幀集。
拿到對(duì)齊后的視頻流后,需要從里面拿到對(duì)齊后的深度流和彩色流,并獲取
rs2::video_frame color_frame = frameset.get_color_frame();
rs2::depth_frame depth_frame = frameset.get_depth_frame();
// 獲取彩色圖像寬
const int w = color_frame.as<rs2::video_frame>().get_width();
const int h = color_frame.as<rs2::video_frame>().get_height();
為了方便對(duì)圖像進(jìn)行處理,需要將彩色幀轉(zhuǎn)成成OpenCV中的cv::Mat
格式,這里轉(zhuǎn)換,需要注意一下,因?yàn)閛pencv的存在,opencv中,它默認(rèn)讀取和顯示圖像時(shí)的通道順序是BGR而不是RGB,因此還需要進(jìn)行格式轉(zhuǎn)換。
cv::Mat frame(cv::Size(w, h), CV_8UC3, (void*)color_frame.get_data(), cv::Mat::AUTO_STEP);
cv::cvtColor(frame, frame, cv::COLOR_RGB2BGR);
-
創(chuàng)建一個(gè)OpenCV中的
cv::Mat
對(duì)象,用于存儲(chǔ)彩色幀的像素?cái)?shù)據(jù)。其中,cv::Size(w, h)
指定了圖像的寬度和高度,CV_8UC3
表示圖像的數(shù)據(jù)類(lèi)型為8位無(wú)符號(hào)整數(shù),3個(gè)通道,color_frame.get_data()
返回彩色幀的數(shù)據(jù)指針,cv::Mat::AUTO_STEP
表示自動(dòng)計(jì)算每行像素的字節(jié)數(shù),從而得到圖像數(shù)據(jù)的步長(zhǎng)(stride)。 -
將RealSense相機(jī)獲取的彩色幀數(shù)據(jù)存儲(chǔ)到
cv::Mat
對(duì)象中。由于RealSense相機(jī)獲取的彩色幀數(shù)據(jù)格式為RGB8,而OpenCV中的cv::Mat
默認(rèn)使用BGR8格式,因此需要進(jìn)行顏色通道的交換,即將R通道和B通道的數(shù)據(jù)交換位置。這可以通過(guò)OpenCV提供的cv::cvtColor()
函數(shù)實(shí)現(xiàn),具體代碼如下:
到這里圖像已經(jīng)準(zhǔn)備好了,你可以把它用起來(lái)了,做比如yolov5目標(biāo)檢測(cè)等,目標(biāo)檢測(cè)得到結(jié)果后,為了結(jié)果用起來(lái),還需要進(jìn)行像素坐標(biāo)系到現(xiàn)實(shí)坐標(biāo)系的轉(zhuǎn)換,Yolov5等算法直接輸出的位置結(jié)果是基于像素坐標(biāo)系的,不能直接使用,需要進(jìn)行轉(zhuǎn)換。
第六步,使用rs2_deproject_pixel_to_point函數(shù)進(jìn)行坐標(biāo)系轉(zhuǎn)換
rs2_deproject_pixel_to_point
函數(shù)是RealSense C++ API中用于將像素坐標(biāo)投影為相機(jī)坐標(biāo)系中的3D點(diǎn)的函數(shù)。使用該函數(shù)需要提供相機(jī)內(nèi)參和深度值,函數(shù)原型如下:
rs2_deproject_pixel_to_point(float* out, const rs2_intrinsics *intrin, const float pixel[2], float depth);
其中,out
是一個(gè)指向包含3D點(diǎn)坐標(biāo)的float型數(shù)組的指針;intrin
是一個(gè)指向相機(jī)內(nèi)參結(jié)構(gòu)體的指針;pixel
是一個(gè)包含像素坐標(biāo)(x,y)的float型數(shù)組,depth
是深度值。
下面是一個(gè)使用rs2_deproject_pixel_to_point
函數(shù)的示例:
// 創(chuàng)建一個(gè)深度幀和一個(gè)內(nèi)參結(jié)構(gòu)體
rs2::depth_frame depth_frame = frames.get_depth_frame();
rs2::video_stream_profile depth_profile = depth_frame.get_profile().as<rs2::video_stream_profile>();
rs2_intrinsics intrin = depth_profile.get_intrinsics();
// 獲取深度值和像素坐標(biāo)
float depth_value = depth_frame.get_distance(x, y);
float pixel[2] = { (float)x, (float)y };
// 將像素坐標(biāo)投影到3D坐標(biāo)
float point[3];
rs2_deproject_pixel_to_point(point, &intrin, pixel, depth_value);
該示例中,我們首先獲取深度幀和內(nèi)參結(jié)構(gòu)體,然后從深度幀中獲取深度值和像素坐標(biāo)。最后,我們調(diào)用rs2_deproject_pixel_to_point
函數(shù)將像素坐標(biāo)投影到3D坐標(biāo),并將結(jié)果保存在point
數(shù)組中。
rs2_deproject_pixel_to_point函數(shù)的輸出結(jié)果是一個(gè)包含三個(gè)浮點(diǎn)數(shù)的數(shù)組,表示像素點(diǎn)在3D空間中的坐標(biāo)。如果需要打印輸出這個(gè)結(jié)果,可以使用以下代碼:
float point[3];
rs2_deproject_pixel_to_point(point, &intrinsics, pixel, depth);
std::cout << "Point in 3D space: (" << point[0] << ", " << point[1] << ", " << point[2] << ")" << std::endl;
其中,intrinsics
是相機(jī)的內(nèi)參矩陣,pixel
是待轉(zhuǎn)換的像素坐標(biāo),depth
是對(duì)應(yīng)像素點(diǎn)的深度值。以上代碼將輸出格式為(x, y, z)
的點(diǎn)坐標(biāo)。請(qǐng)注意,打印輸出結(jié)果前需要先確保rs2_deproject_pixel_to_point函數(shù)的返回值為true,表示轉(zhuǎn)換成功。
函數(shù)的輸出結(jié)果是一個(gè)點(diǎn)在3D空間中的坐標(biāo)。具體而言,該函數(shù)接收一個(gè)像素坐標(biāo)和對(duì)應(yīng)的深度值作為輸入,然后使用相機(jī)的內(nèi)參矩陣對(duì)這個(gè)像素點(diǎn)進(jìn)行反投影,得到該點(diǎn)在相機(jī)坐標(biāo)系下的坐標(biāo)。最后,根據(jù)相機(jī)坐標(biāo)系和世界坐標(biāo)系之間的轉(zhuǎn)換關(guān)系,將相機(jī)坐標(biāo)系下的坐標(biāo)轉(zhuǎn)換為世界坐標(biāo)系下的坐標(biāo)。
因此,rs2_deproject_pixel_to_point
函數(shù)的輸出結(jié)果是一個(gè)三維坐標(biāo),包含x、y和z三個(gè)分量,表示該點(diǎn)在3D空間中的位置。該點(diǎn)的坐標(biāo)可以用一個(gè)浮點(diǎn)數(shù)數(shù)組來(lái)表示。
這里我簡(jiǎn)單總結(jié)一下,rs2_deproject_pixel_to_point函數(shù)中,第一個(gè)參數(shù)是我們需要的,我們需要自己創(chuàng)建一個(gè)float 類(lèi)型的數(shù)組去接收坐標(biāo)系轉(zhuǎn)換的結(jié)果,我這里當(dāng)時(shí)很郁悶,不知道怎么拿到轉(zhuǎn)換后的坐標(biāo)值,直接創(chuàng)建一個(gè)數(shù)組區(qū)接收就好了。
后面三個(gè)參數(shù)我們都可以通過(guò)相機(jī)的api拿到,這里說(shuō)嗎如何拿到最后一個(gè)參數(shù),深度值。
我們可以通過(guò)depth_frame.get_distance()
函數(shù)獲取像素坐標(biāo)對(duì)應(yīng)的深度值,get_distance函數(shù)的輸入值是某點(diǎn)的x,y的像素坐標(biāo),可以自己區(qū)看realsense的官方文檔,
這里具體說(shuō)下get_sditance函數(shù):首先得知道深度值是什么意思?
深度值全程是深度距離(Depth Distance),通常是指物體表面到深度傳感器(比如深度相機(jī),激光雷達(dá))之間的距離,我們這里用到的是深度傳感器是深度相機(jī),因此深度相機(jī)的深度距離指的是相機(jī)到物體表面的距離,也被稱(chēng)為相機(jī)拍攝的圖像中每個(gè)像素點(diǎn)與深度相機(jī)之間的距離.注意:此深度距離值非真實(shí)世界下,物體和相機(jī)的距離.
在深度相機(jī)的深度圖像中,每個(gè)像素的深度值是以16位無(wú)符號(hào)整數(shù)(uint16_t)的形式存儲(chǔ)的,以表示該像素與深度相機(jī)之間的距離。get_sditance函數(shù)
獲取某一個(gè)像素點(diǎn)(x,y)的深度值,并將其存儲(chǔ)在uint16_t型變量et_sditance函數(shù)的輸出值
depth_value中,然而,這個(gè)深度值(depth_value)本身的單位只是相機(jī)內(nèi)部使用的一種規(guī)范化的無(wú)量綱單位。為了獲得真實(shí)的距離,可以使用get_depth_scale函數(shù),獲取了深度傳感器的深度比例尺,以將深度值轉(zhuǎn)換為實(shí)際距離。depth_scale表示深度值與實(shí)際距離的比例關(guān)系,是一個(gè)浮點(diǎn)數(shù)(float)值,具體根據(jù)深度傳感器的實(shí)際規(guī)格而定。例如,對(duì)于Realsense D435深度相機(jī),其默認(rèn)的深度比例尺為0.001米(即1毫米)/深度值。另外,代碼中還使用get_option函數(shù)獲取深度傳感器的深度偏移值(即單位深度值對(duì)應(yīng)的真實(shí)距離),將其存儲(chǔ)在float型變量depth_offset中。這個(gè)距離值通常以米為單位,因此深度距離distance可根據(jù)以下公式計(jì)算:
distance = depth_value * depth_scale + depth_offset
其中,depth_value是從深度相機(jī)的深度圖像中獲取的像素深度值,depth_scale是深度比例尺,depth_offset是深度偏移值,將他們分別相乘和相加,即可得到實(shí)際的距離(distance)。
下面是使用get_distance函數(shù)的簡(jiǎn)單示例:
#include <librealsense2/rs.hpp>
#include <opencv2/opencv.hpp>
// 獲取深度圖像某個(gè)像素的深度值
float get_distance(const rs2::depth_frame& depth_frame, int x, int y)
{
float depth = depth_frame.get_distance(x, y);
if (depth == 0) {
return -1; // 無(wú)效深度值
}
return depth;
}
int main()
{
// 配置RealSense相機(jī)
rs2::pipeline pipe;
rs2::config cfg;
cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);
pipe.start(cfg);
// 循環(huán)讀取深度圖像并獲取某個(gè)像素的深度值
while (true) {
rs2::frameset frames = pipe.wait_for_frames();
rs2::depth_frame depth_frame = frames.get_depth_frame();
// 讀取深度值
int x = 320; // 像素坐標(biāo)x
int y = 240; // 像素坐標(biāo)y
float distance = get_distance(depth_frame, x, y);
if (distance > 0) {
std::cout << "Depth at (" << x << ", " << y << ") is " << distance << " meters." << std::endl;
}
// 顯示深度圖像
cv::Mat depth_image(cv::Size(640, 480), CV_16UC1, (void*)depth_frame.get_data(), cv::Mat::AUTO_STEP);
cv::Mat depth_image_show;
depth_image.convertTo(depth_image_show, CV_8U, 255.0 / 1000);
cv::imshow("Depth Image", depth_image_show);
char c = cv::waitKey(1);
if (c == 'q' || c == 27) {
break;
}
}
pipe.stop();
return 0;
}
下面是使用get_depth_scale函數(shù)和get_distance函數(shù)的示例代碼
#include <librealsense2/rs.hpp>
#include <iostream>
int main()
{
rs2::pipeline pipe;
rs2::config cfg;
rs2::frameset frames;
rs2::frame depth_frame;
// 配置相機(jī)
cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);
pipe.start(cfg);
// 獲取深度幀
frames = pipe.wait_for_frames();
depth_frame = frames.get_depth_frame();
// 獲取像素點(diǎn)深度值和距離值
int x = 320;
int y = 240;
uint16_t depth_value = depth_frame.get_distance(x, y);
float depth_scale = pipe.get_active_profile().get_device().first<rs2::depth_sensor>().get_depth_scale();
float depth_offset = pipe.get_active_profile().get_device().first<rs2::depth_sensor>().get_option(RS2_OPTION_DEPTH_UNITS);
float distance = (depth_value * depth_scale) + depth_offset;
// 輸出距離值
std::cout << "Distance to object: " << distance << " meters" << std::endl;
return 0;
}
第七步,實(shí)際應(yīng)用
下面我會(huì)用C++給出一段示例代碼,也是我自己寫(xiě)的和使用的代碼,沒(méi)有問(wèn)題。
#include <librealsense2/rs.hpp>
#include <librealsense2/rsutil.h>
int main()
{
// 相機(jī)參數(shù)配置
rs2::pipeline pipe;
rs2::config cfg;
cfg.enable_stream(RS2_STREAM_DEPTH, 1280, 720, RS2_FORMAT_Z16, 30);
cfg.enable_stream(RS2_STREAM_COLOR, 1280, 720, RS2_FORMAT_BGR8, 30);
rs2::pipeline_profile profile = pipe.start(cfg);
rs2::align align_to_color(RS2_STREAM_COLOR); // 創(chuàng)建深度流和彩色流對(duì)齊的實(shí)例化對(duì)象
while(true)
{
rs2::frameset frameset = pipe.wait_for_frames();
auto aligned_frameset = align_to_color.process(frameset); // 實(shí)際進(jìn)行流對(duì)齊
// 基于對(duì)齊的混合流獲取深度流和彩色流,進(jìn)而獲取流對(duì)齊后的深度內(nèi)參
rs2::video_frame color_stream = aligned_frameset.get_color_frame();
rs2::depth_frame aligned_depth_stream = aligned_frameset.get_depth_frame();
rs2::video_stream_profile depth_stream_profile =
aligned_depth_stream.get_profile().as<rs2::video_stream_profile>();
const auto depth_intrinsics = depth_stream_profile.get_intrinsics(); //獲取對(duì)齊后的深度內(nèi)參
// 獲取彩色圖像寬
const int w = color_stream.as<rs2::video_frame>().get_width();
const int h = color_stream.as<rs2::video_frame>().get_height();
// 獲取圖像中心像素點(diǎn)
float u = 0.5;
float v = 0.5;
int c = w * u;
int r = h * v;
float pixe_center[2];
pixe_center[0] = c;
pixe_center[1] = r;
// 像素坐標(biāo)系轉(zhuǎn)換到相機(jī)坐標(biāo)系
float pixed_center_depth_value = aligned_depth_stream.get_distance(pixe_center[0],pixe_center[1]);
rs2_deproject_pixel_to_point(point_in_color_coordinates, &depth_intrinsics, pixe_center, pixed_center_depth_value);
std::cout << "像素中心在在彩色相機(jī)坐標(biāo)系下的X坐標(biāo)" << point_in_color_coordinates[0] << "Y坐標(biāo)系" << point_in_color_coordinates[1] << "Z坐標(biāo)" << point_in_color_coordinates[2] << endl;
}
}
上述代碼有三個(gè)注意點(diǎn),1.流對(duì)齊;2.深度內(nèi)參的獲??;3.get_distance函數(shù)的使用;4.rs2_deproject_pixel_to_point函數(shù)的使用。
1.流對(duì)齊
流對(duì)齊盡量選擇將深度流對(duì)齊彩色流,精度更高
2.深度內(nèi)參
如果要轉(zhuǎn)坐標(biāo)系,深度內(nèi)參在流對(duì)齊之后獲取,才是正確的做法,不然精度不高
3.get_distance函數(shù)
獲取深度時(shí),也要選擇對(duì)齊后的深度流
4.rs2_deproject_pixel_to_point函數(shù)
該函數(shù)最終將坐標(biāo)系轉(zhuǎn)換到了相機(jī)的彩色相機(jī)坐標(biāo)系下
彩色相機(jī)坐標(biāo)系如下,這張圖是我從realsense的官方github倉(cāng)庫(kù)里摘下來(lái)的,真的花了很多時(shí)間
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-588778.html
這篇文章,我來(lái)來(lái)回回修改好幾遍了呀,花了很多時(shí)間,看完有幫助的友友們,給我點(diǎn)贊啊,點(diǎn)贊讓我快樂(lè),哈哈哈,希望對(duì)大家有所幫助。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-588778.html
到了這里,關(guān)于C++ api調(diào)用realsense d435相機(jī),將坐標(biāo)轉(zhuǎn)換到相機(jī)坐標(biāo)系的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!