2015年2月24日火曜日

点郡の重心座標を計算して全体を移動させるプログラム

 通常Kinectから得られる点郡データはz軸(奥行き)方向に一定の距離があるはずだが、色々処理をしたい場合は座標(0,0,0)にあったほうがやり易かったりするので、入力点郡の重心を求め、全体をその重心の座標が(0,0,0)になるように移動するプログラムを作る。

コード

#include "stdafx.h"

#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
void centroid(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
    Eigen::Vector4f xyz_centroid;
    pcl::compute3DCentroid(*cloud, xyz_centroid);//重心を計算

    for(size_t i = 0; i < cloud->points.size(); i++){
        cloud->points[i].x = cloud->points[i].x - xyz_centroid[0];//X座標の移動
        cloud->points[i].y = cloud->points[i].y - xyz_centroid[1];//Y座標の移動
        cloud->points[i].z = cloud->points[i].z - xyz_centroid[2];//Z座標の移動
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

    pcl::io::loadPCDFile(argv[1], *cloud);

    centroid(cloud);//重心計算+移動の関数に点群を渡す。

    std::stringstream Filename;
    std::string name;
    name = argv[1];
    name.erase(name.length()-4);
    Filename << name << "_C.pcd";//最初に渡されたファイル名の末尾に_Cを付加する
    pcl::io::savePCDFileBinary(Filename.str(),*cloud);
}



 このコードは前回のViewerのように引数にPCDファイルを読み込み、重心を座標(0,0,0)に移動後、別名で保存する。保存時のファイル名は引数で渡したファイル名の末尾に「_C」を加える

0 件のコメント:

コメントを投稿