由點雲建立深度圖
阿新 • • 發佈:2019-02-13
首先,在PCL(Point Cloud Learning)中國協助發行的書提供光碟的第9章例1資料夾中,開啟名為range_image_creation.cpp的程式碼檔案。 解釋說明 下面來解析開啟原始碼中的關鍵語句。 #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