本節展示了如何將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...