視覺SLAM(3) RGBD相機的點雲資料生成

2021-10-07 20:29:53 字數 3396 閱讀 6202

本節展示了如何將rgbd的深度及影象資訊轉換為點雲資料的過程,轉換的公式需要一定的相機模型的基礎知識,可以參考高翔的《視覺slam十四講》,這裡以奧比的一款相機為例,理論都比較簡單,理解起來並不困難,這裡直接貼上**:

#include

#include

#include

#include

#include

#include

//pcl

#include

#include

#include

#include

#include

#include

using

namespace std;

sensor_msgs::camerainfo camerainfo;

eigen::matrix3f m_k;

std::string depth_topic_;

std::string rgb_topic_;

std::string camera_info_topic_;

std::string rgbd_frame_id_;

ros::publisher pc_publisher;

const

float camera_factor =

0.001

;void

converttodepthpointcloud

(const cv::mat &depth_pic)

//注入點雲

pcl::pointxyzrgb point;

point.z=

double

(d)*camera_factor;

point.x=

((n-camerainfo.k.at(

2))*point.z/camerainfo.k.at(

0));

point.y=

((m-camerainfo.k.at(

5))*point.z/camerainfo.k.at(

4));

point.b=depth_pic.data[m*depth_pic.step+n*depth_pic.

channels()

+0];

point.g=depth_pic.data[m*depth_pic.step+n*depth_pic.

channels()

+1];

point.r=depth_pic.data[m*depth_pic.step+n*depth_pic.

channels()

+2];

cloud-

>points.

push_back

(point);}

} cloud-

>height=1;

cloud-

>width=cloud-

>points.

size()

; cloud-

>is_dense=

false

; pcl::

torosmsg

(*cloud,pub_pointcloud)

; pub_pointcloud.header.frame_id=rgbd_frame_id_;

pub_pointcloud.header.stamp=ros::time::

now();

pc_publisher.

publish

(pub_pointcloud);}

void

pointcloudcallback

(const sensor_msgs::imageconstptr& _depthimage,

const sensor_msgs::imageconstptr& _rgbimage)

catch

(cv_bridge::exception& ex)

trycatch

(cv_bridge::exception &ex)

converttodepthpointcloud

(depthimage-

>image);}

intmain

(int argc,

char

** ar**)

catch

(std::exception ex)

message_filters::subscriber<:image>

depth_sub

(nh, depth_topic_,1)

; message_filters::subscriber<:image>

rgb_sub

(nh, rgb_topic_,1)

; message_filters::synchronizer

sync

(syncpolicy(10

),depth_sub,rgb_sub)

; sync.

registercallback

(boost::

bind

(&pointcloudcallback,_1,_2));

pc_publisher=nh.advertise<:pointcloud2>

("rgbd_pointcloud",1

);ros::

spin()

;}

對應的launc**件:

"prefix" value=

"/camera"

/>

"image_listener" pkg=

"rgbd2pc" type=

"image_listener" output=

"screen"

>

"depth_topic" value=

"$(arg prefix)/depth/image_raw"

/>

"camera_info_topic" value=

"$(arg prefix)/depth/camera_info"

/>

"rgb_topic" value=

"$(arg prefix)/rgb/image_raw"

/>

"rgbd_frame_id" value=

"camera_depth_optical_frame"

/>

<

/node>

<

/launch>

結果:

學會了這裡的方法,以後拿到realsense、奧比也、樂視等rgbd相機,稍微理解一下,直接轉就可以了。

視覺SLAM筆記(44) RGB D 的直接法

現在演示如何使用稀疏的直接法 為了保持程式簡單,使用 rgb d 資料而非單目資料,這樣可以省略掉單目的深度恢復部分 基於特徵點的深度恢復已經在 視覺slam筆記 34 三角測量 介紹過了 而基於塊匹配的深度恢復將在後面介紹 所以這裡考慮 rgb d 上的稀疏直接法vo visual odometr...

3D相機如何獲取基於立體視覺的3D資料

本文概述了使用立體相機獲取深度感知的主要處理步驟。立體視覺的深度感知基於三角測量原理。我們講兩台搭載投影光學系統的相機併排放置,使兩台相機的視野在所需物距發生重疊。我們通過這兩台相機的拍攝,可以得到兩個不同角度下的場景圖。如圖1所示。物體在圓錐筒前面,圓錐筒散落排列。在3d空間內,兩幅影象中的每乙個...

儲存點雲資料 3D相機的資料處理方式

原文 3d相機的資料處理方式 1.前言 3d相機雖然也被稱為相機,也可以得到二維的深度影象,但其實並不是由感光像元產生影象。2d相機和3d相機由於都有乙個 相機 的名字,通常讓不太了解的人產生困惑。我們用英文可能更容易理解。中文裡的3d相機,在英文語境下其實常被稱為3d sensor,並沒有3d c...