PCL的PNG文件和計算點雲重心


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三個軸的重心的坐標值

 簡單的程序演示,大神請忽略,

微信公眾號號可掃描二維碼一起共同學習交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM