一、 定義
- 深度圖像的每個像素點的灰度值可用於表徵場景中某一點距離攝像機的遠近。 直接反應了景物可見表面的幾何形狀。
- 深度圖像經過座標轉換可以計算爲點雲數據,點雲數據也可以轉換爲深度圖像。
二、PCL相關函數庫
-
所在頭文件:#include <pcl/range_image/range_image.h>
-
PCL類
RangeImage是一個工具類,用於在特定視角捕捉的3D場景。
2.1 函數:
template<typename PointCloudType >
void pcl::RangeImage::createFromPointCloud ( const PointCloudType & point_cloud,
float angular_resolution = pcl::deg2rad (0.5f),
float max_angle_width = pcl::deg2rad (360.0f),
float max_angle_height = pcl::deg2rad (180.0f),
const Eigen::Affine3f & sensor_pose = Eigen::Affine3f::Identity (),
RangeImage::CoordinateFrame coordinate_frame = CAMERA_FRAME,
float noise_level = 0.0f,
float min_range = 0.0f,
int border_size = 0
)
參數 | 描述 |
---|---|
point_cloud | 輸入的點雲數據 |
angular_resolution | 圖像中各個像素之間的角差(弧度)。 角差是一次信號與二次信號的相位之差。 |
max_angle_width | 定義傳感器水平邊界的角度(弧度)。 |
max_angle_height | 定義傳感器垂直邊界的角度(弧度)。 |
sensor_pose | 傳感器姿態的變換矩陣 |
coordinate_frame | 座標系統 (默認爲相機座標系 CAMERA_FRAME) |
noise_level | 近鄰點對查詢點距離的影響水平 |
min_range | 最小可視深度 (defaults to 0) |
border_size | 點雲邊界的尺寸大小 (defaults to 0) |
三、例子分析
int main (int argc, char** argv) {
pcl::PointCloud<pcl::PointXYZ> pointCloud;
// Generate the data 生成表示矩形的點雲數據
for (float y=-0.5f; y<=0.5f; y+=0.01f) {
for (float z=-0.5f; z<=0.5f; z+=0.01f) {
pcl::PointXYZ point;
point.x = 2.0f - y;
point.y = y;
point.z = z;
pointCloud.points.push_back(point);
}
}
pointCloud.width = (uint32_t) pointCloud.points.size();
pointCloud.height = 1;
// We now want to create a range image from the above point cloud, with a 1deg angular resolution
float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); // 1.0 degree in radians
float maxAngleWidth = (float) (360.0f * (M_PI/180.0f)); // 360.0 degree in radians
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); // 180.0 degree in radians
Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
float noiseLevel=0.00;
float minRange = 0.0f;
int borderSize = 1;
pcl::RangeImage rangeImage;
rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight,
sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
std::cout << rangeImage << "\n";
}
float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); // 1.0 degree in radians
float maxAngleWidth = (float) (360.0f * (M_PI/180.0f)); // 360.0 degree in radians
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); // 180.0 degree in radians
Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
float noiseLevel=0.00;
float minRange = 0.0f;
int borderSize = 1;
angularResolution
表示相鄰像素之間的角差是一度。
maxAngleWidth=360 maxAngleHeight=180
,表示我們模擬的距離傳感器對周圍環境是一個完整的360度視圖。 通過調整這個值設置激光器掃描的視角,從而減少計算量。 比如:一個激光只需要描述前方的180度的數據,後面的數據可以忽視,那麼設置 maxAngleWidth=180
就足夠了。
傳感器姿態,包含6DoF (6個自由度), 其中roll=pitch=yaw=0.
coordinate_frame=CAMERA_FRAME
表示x面向右,y向下,z軸向前。另一種選擇是LASER_FRAME
, x面向前,y向左,z向向上。
noiseLevel=0
表示 深度圖使用一個歸一化的z緩衝區創建的。如果想讓鄰近點都落在同一個像素單元,用戶可以使用較高的值。例如noiseLevel=0.05,深度距離值是通過查詢點半徑爲5cm的圓內包含的點,平均計算而得到的。
如果minRange
是大於0的,那麼所有深度值小於這個值的點都將被忽略。
minRange = 0.0f 及 minRange=2.0f
結果對比
minRange = 0
minRange=2.0f
當裁剪時,borderSize
大於0會在圖像周圍留下當前視點看過去不可見點的邊界。
pcl::RangeImage rangeImage;
rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight,
sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
深度圖像值繼承自PointCloud
類 而且 它的點有 x,y,z和range 四個成員。有三類點,可用的真實點是深度大於0, 不可被觀察的點是 x=y=z=NAN
並且 range=-INFINITY.
最遠距離的點是 x=y=z=NAN
並且 range=INFINITY.
補充:
什麼是6DoF
自由度總共有6個,可分成兩種不同的類型:平移和旋轉。
1. 平移運動
剛體可以在3個自由度中平移:向前/向後,向上/向下,向左/向右。
平移運動
2. 旋轉運動
剛體也可以在3個自由度中旋轉:縱搖(Pitch)、橫搖(Roll)和垂搖(Yaw)。
旋轉運動
因此,3種類型的平移自由度+3種類型的旋轉自由度 = 6自由度! 在任意一個自由度中,物體可以沿兩個“方向”自由運動