PCL提供節約一點雲的值為一個PNG圖像文件的可能方案。顯然,這只能用有序的點雲來完成,因為生成的圖像的行和列將與點雲的對應完全一致。例如,如果你從一個傳感器Kinect或Xtion的點雲,你可以用這個來檢索640x480 RGB圖像匹配的點雲。
就是將點雲文件PCD保存成PNG文件,程序如下
#include <pcl/io/pcd_io.h> #include <pcl/io/png_io.h> int main(int argc, char** argv) { // 創建點雲對象 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); // 讀取點雲文件 if (pcl::io::loadPCDFile<pcl::PointXYZRGB>(argv[1], *cloud) != 0) { return -1; } // 保存圖片,(必須為有序點雲) pcl::io::savePNGFile("output.png", *cloud, "rgb"); }
那么這里的實驗結果是根據我之前使用的用kinect獲得的點雲數據,他的點雲可視化效果如下
保存為PNG的結果為
如果省略參數,函數將默認保存RGB域。
(2)計算點雲重心
點雲的重心是一個點坐標,計算出雲中所有點的平均值。你可以說它是“質量中心”,它對於某些算法有多種用途。如果你想計算一個聚集的物體的實際重心,記住,傳感器沒有檢索到從相機中相反的一面,就像被前面板遮擋的背面,或者里面的。只有面對相機表面的一部分。
#include <pcl/io/pcd_io.h> #include <pcl/common/centroid.h> #include <iostream> int main(int argc, char** argv) { // 創建點雲的對象 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 讀取點雲 if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) != 0) { return -1; } // 創建存儲點雲重心的對象 Eigen::Vector4f centroid; pcl::compute3DCentroid(*cloud, centroid); std::cout << "The XYZ coordinates of the centroid are: (" << centroid[0] << ", " << centroid[1] << ", " << centroid[2] << ")." << std::endl; }
這樣就可以計算出點雲的XYZ三個軸的重心的坐標值
簡單的程序演示,大神請忽略,
微信公眾號號可掃描二維碼一起共同學習交流