解釋說明
下面來解析打開源代碼中的關鍵語句。
#include <pcl/range_image/range_image.h> //深度圖像頭文件
int main (int argc, char** argv) {
pcl::PointCloud<pcl::PointXYZ> pointCloud; //定義點雲對象
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; //設置點雲對象的頭信息
這段程序首先創建壹組數據作為點雲的數據內容,再設置文件頭的信息,整個實現生成壹個呈矩形形狀的點雲。
float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); // 按弧度1度
float maxAngleWidth = (float) (360.0f * (M_PI/180.0f)); // 按弧度360.0度
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); // 按弧度180.0度
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;
這部分定義了創建深度圖像時需要的設置參數,將角度分辨率定義為1度,意味著由鄰近的像素點所對應的每個光束之間相差1度,maxAngleWidth=360和maxAngleHeight=180意味著,我們進行模擬的距離傳感器對周圍的環境擁有壹個完整的360度視角,用戶在任何數據集下都可以使用此設置,因為最終獲取的深度圖像將被裁剪到有空間物體存在的區域範圍。但是,用戶可以通過減小數值來節省壹些計算資源,例如:對於傳感器後面沒有可以觀測的點時,壹個水平視角為180度的激光掃描儀,即maxAngleWidth=180就足夠了,這樣只需要觀察距離傳感器前面就可以了,因為後面沒有需要觀察的場景。sensorPose定義了模擬深度圖像獲取傳感器的6自由度位置,其原始值為橫滾角roll、俯仰角pitch、偏航角yaw都為0,coordinate_frame=CAMERA_FRAME說明系統的X軸是向右的,Y軸是向下的,Z軸是向前的,另外壹個選擇是LASER_FRAME,其X軸向前,Y軸向左,Z軸向上。noiseLevel=0是指使用壹個歸壹化的Z緩沖器來創建深度圖像,但是如果想讓鄰近點集都落在同壹個像素單元,用戶可以設置壹個較高的值,例如noiseLevel=0.05可以理解為,深度距離值是通過查詢點半徑為125px的圓內包含的點用來平均計算而得到的。如果minRange>0,則所有模擬器所在位置半徑minRange內的鄰近點都將被忽略,即為盲區。在裁剪圖像時,如果borderSize>0,將在圖像周圍留下當前視點不可見點的邊界。
pcl::RangeImage rangeImage;
rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
std::cout << rangeImage << "\n";
其余的代碼是使用那些用戶給定的參數,從點雲創建深度圖像,並且在終端下打印出壹些信息。
深度圖像繼承於PointCloud類,它的點類型具有x,y,z和range距離字段,***有三種類型的點集,有效點集是距離大於零的點集,當前視點不可見點集x=y=z=NAN且值域為負無窮大,遠距離點集x=y=z=NAN且值域為無窮大。
編譯和運行程序
利用光盤提供的CMakeLists.txt文件,在cmake中建立工程文件,並生成相應的可執行文件。生成執行文件後,就可以運行了,在cmd中鍵入命令:
...>range_image_creation.exe