国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ api調(diào)用realsense d435相機(jī),將坐標(biāo)轉(zhuǎn)換到相機(jī)坐標(biāo)系

這篇具有很好參考價(jià)值的文章主要介紹了C++ api調(diào)用realsense d435相機(jī),將坐標(biāo)轉(zhuǎn)換到相機(jī)坐標(biāo)系。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

第一步,當(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ī)輸出的深度圖像。
  • 640480:指定深度圖像的分辨率為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è)步驟:

  1. pipe.wait_for_frames():等待獲取一幀包含深度和彩色圖像的幀集。
  2. 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);
  1. 創(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)。

  2. 將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í)間

c++ realsense,RealSense相機(jī),c++

?

這篇文章,我來(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Ubuntu 20.04 Intel RealSense D435i 相機(jī)標(biāo)定教程

    Ubuntu 20.04 Intel RealSense D435i 相機(jī)標(biāo)定教程

    報(bào)錯(cuò):sumpixel_test.cpp:2:10: fatal error: backward.hpp: 沒(méi)有那個(gè)文件或目錄,將sumpixel_test.cpp中# include \\\"backward.hpp\\\"改為:#include “code_utils/backward.hpp”。 報(bào)錯(cuò) 創(chuàng)建rs_imu_calibration.launch 找到realsense-ros包,進(jìn)入/catkin_ws/src/realsense2_camera/launch(路徑僅供參考),復(fù)制其中的rs_camera.launch,并重

    2024年01月16日
    瀏覽(58)
  • realsense D435i 實(shí)現(xiàn)外部時(shí)鐘觸發(fā)硬件同步多相機(jī)數(shù)據(jù)采集

    realsense D435i 實(shí)現(xiàn)外部時(shí)鐘觸發(fā)硬件同步多相機(jī)數(shù)據(jù)采集

    最近有一個(gè)調(diào)試D435i相機(jī)的工作,需要使得三個(gè)相機(jī)能夠完成硬件觸發(fā)的同步,具體來(lái)說(shuō),就是有一個(gè)固定頻率的外部脈沖信號(hào),使得三個(gè)相機(jī)能夠根據(jù)外部脈沖信號(hào)的硬件觸發(fā)完成雙目圖片、深度圖片、彩色圖片、IMU數(shù)據(jù)的實(shí)時(shí)響應(yīng)采集,因?yàn)橥獠棵}沖信號(hào)是通過(guò)一個(gè)精確

    2024年01月16日
    瀏覽(301)
  • Intel RealSense D435i深度相機(jī)通過(guò)點(diǎn)云獲取圖片中任意點(diǎn)三維信息(python實(shí)現(xiàn))

    Intel RealSense D435i深度相機(jī)通過(guò)點(diǎn)云獲取圖片中任意點(diǎn)三維信息(python實(shí)現(xiàn))

    此時(shí)效果(左側(cè)RGB圖,右側(cè)深度圖)(過(guò)近時(shí)深度信息幾乎顯示不出來(lái)) ?按下p鍵暫停畫(huà)面 按下s鍵保存圖片 按下r鍵讀取剛才保存的圖片,并通過(guò)image_sliced文件將圖片裁剪到自己需要的范圍 image_sliced.py 按下g鍵進(jìn)行圖像處理,判斷方向,并將三維信息顯示在圖片上 image_pro

    2023年04月08日
    瀏覽(42)
  • ubuntu18.04安裝Realsense D435i相機(jī)SDK及realsense-ros記錄,為后期運(yùn)行yolo v5作準(zhǔn)備

    ubuntu18.04安裝Realsense D435i相機(jī)SDK及realsense-ros記錄,為后期運(yùn)行yolo v5作準(zhǔn)備

    寫(xiě)在前面 :一定要注意各個(gè)版本之間的匹配問(wèn)題,否則會(huì)報(bào)各種錯(cuò)誤。 例如ROS版本和librealsense SDK版本之間的對(duì)應(yīng)關(guān)系,以及realsense-ros(Wrapper)與librealsense SDK之間的對(duì)應(yīng)關(guān)系 。 系統(tǒng):ubuntu18.04 ros: melodic 附上Intel? RealSense github網(wǎng)站: https://github.com/IntelRealSense 以及安裝教程

    2024年02月05日
    瀏覽(26)
  • Ubuntu18.04安裝配置使用Intel RealSense D435i深度相機(jī)以及在ROS環(huán)境下配置

    Ubuntu18.04安裝配置使用Intel RealSense D435i深度相機(jī)以及在ROS環(huán)境下配置

    最近因?yàn)閷W(xué)習(xí)開(kāi)發(fā)需要,要開(kāi)始接觸一些視覺(jué)相關(guān)的內(nèi)容,拿到了一個(gè)Inter 的D435i深度相機(jī),記錄一下在Ubuntu18環(huán)境下配置SDK 包的歷程 注意 : Intel官方最新版的librealsense版本與ROS1的ROS Wrapper是 版本不一致的 ,且ROS Wrapper支持的是較低版本的SDK ,具體可以去網(wǎng)站查看 如果完全

    2024年02月07日
    瀏覽(42)
  • (已修正精度 1mm左右)Realsense d435i深度相機(jī)+Aruco+棋盤(pán)格+OpenCV手眼標(biāo)定全過(guò)程記錄

    (已修正精度 1mm左右)Realsense d435i深度相機(jī)+Aruco+棋盤(pán)格+OpenCV手眼標(biāo)定全過(guò)程記錄

    最近幫別人做了個(gè)手眼標(biāo)定,然后我標(biāo)定完了大概精度能到1mm左右。所以原文中誤差10mm可能是當(dāng)時(shí)那個(gè)臂本身的坐標(biāo)系有問(wèn)題。然后用的代碼改成了基于python的,放在下面。 新來(lái)的小伙伴可以只參考前面的代碼就可以完成標(biāo)定了。 有問(wèn)題的話(huà)可以留言,一起交流~ 手眼標(biāo)定

    2024年02月04日
    瀏覽(48)
  • 【深度相機(jī)D435i】Windows+Ubuntu下調(diào)用D435i利用Python讀取、保存RGB、Depth圖片

    【深度相機(jī)D435i】Windows+Ubuntu下調(diào)用D435i利用Python讀取、保存RGB、Depth圖片

    最近組里面的項(xiàng)目需要用到D435i深度相機(jī)采集深度圖片,所以記錄一下在Windows+Ubuntu的環(huán)境下使用D435i深度相機(jī)的流程,以及如何利用python讀取、保存常見(jiàn)的RGB、Depth圖片。 D435i 在小巧外形中采用英特爾模塊和視覺(jué)處理器,是一個(gè)功能強(qiáng)大的一體產(chǎn)品,可與可定制軟件配合使用

    2024年02月02日
    瀏覽(36)
  • 相機(jī)坐標(biāo)系、像素坐標(biāo)系轉(zhuǎn)換

    相機(jī)內(nèi)參矩陣是相機(jī)的重要參數(shù)之一,它描述了相機(jī)光學(xué)系統(tǒng)的內(nèi)部性質(zhì),例如焦距、光學(xué)中心和圖像畸變等信息。在計(jì)算機(jī)視覺(jué)和圖形學(xué)中,相機(jī)內(nèi)參矩陣通常用于將圖像坐標(biāo)系中的像素坐標(biāo)轉(zhuǎn)換為相機(jī)坐標(biāo)系中的三維坐標(biāo),或者將相機(jī)坐標(biāo)系中的三維坐標(biāo)投影到圖像坐標(biāo)

    2024年02月13日
    瀏覽(25)
  • 圖像坐標(biāo)系如何轉(zhuǎn)換到相機(jī)坐標(biāo)系。

    圖像坐標(biāo)系如何轉(zhuǎn)換到相機(jī)坐標(biāo)系。

    問(wèn)題描述:圖像坐標(biāo)系如何轉(zhuǎn)換到相機(jī)坐標(biāo)系。 問(wèn)題解答: 圖像坐標(biāo)系的定義: 圖像坐標(biāo)系是用于描述數(shù)字圖像中像素位置的坐標(biāo)系。圖像坐標(biāo)系的原點(diǎn)是相機(jī)光軸與成像平面的交點(diǎn)。X軸沿著成像平面的水平方向正向,Y軸沿著成像平面的垂直方向正向。 相機(jī)坐標(biāo)系的定義

    2024年02月04日
    瀏覽(20)
  • 世界坐標(biāo)系、相機(jī)坐標(biāo)系和圖像坐標(biāo)系的轉(zhuǎn)換

    世界坐標(biāo)系、相機(jī)坐標(biāo)系和圖像坐標(biāo)系的轉(zhuǎn)換

    之前只是停留在會(huì)用的階段,一直沒(méi)去讀懂計(jì)算的原理,今天通讀了大佬的文章,寫(xiě)的言簡(jiǎn)意賅,感謝感謝~~特此記錄一下,僅用作個(gè)人筆記 貼鏈接,十分感謝~ https://blog.csdn.net/weixin_44278406/article/details/112986651 https://blog.csdn.net/guyuealian/article/details/104184551 將三維物體轉(zhuǎn)換成照

    2023年04月15日
    瀏覽(35)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包