本帖最后由 猴哥V5 于 2016-11-10 10:05 编辑
如果不用cmake怎么对pcd文件进行加载?在cmakelists里是这样写的...>pairwise_incremental_registration capture0001.pcdcapture0002.pcd,直接在程序里怎么写?求大神帮忙。谢谢。
下面是main函数
int main(int argc, char** argv)
{
//读取数据
std::vector<PCD, Eigen::aligned_allocator<PCD> > data; //模型
loadData(argc, argv, data); //读取pcd文件数据,定义见上面
//检查用户数据
if (data.empty())
{
PCL_ERROR("Syntax is: %s <source.pcd> <target.pcd> ", argv[0]); //语法
PCL_ERROR(" - multiple files can be added. The registration results of (i, i+1) will be registered against (i+2), etc"); //可以使用多个文件
return (-1);
}
PCL_INFO("Loaded %d datasets.", (int)data.size()); //显示读取了多少个点云文件
//创建一个 PCLVisualizer 对象
p = new pcl::visualization::PCLVisualizer(argc, argv, "Pairwise Incremental Registration example"); //p是全局变量
p->createViewPort(0.0, 0, 0.5, 1.0, vp_1); //创建左视区
p->createViewPort(0.5, 0, 1.0, 1.0, vp_2); //创建右视区
//创建点云指针和变换矩阵
PointCloud::Ptr result(new PointCloud), source, target; //创建3个点云指针,分别用于结果,源点云和目标点云
//全局变换矩阵,单位矩阵,成对变换
//逗号表达式,先创建一个单位矩阵,然后将成对变换 赋给 全局变换
Eigen::Matrix4f GlobalTransform = Eigen::Matrix4f::Identity(), pairTransform;
//遍历所有的点云文件
for (size_t i = 1; i < data.size(); ++i)
{
source = data[i - 1].cloud; //源点云
target = data.cloud; //目标点云
showCloudsLeft(source, target); //在左视区,简单的显示源点云和目标点云
PointCloud::Ptr temp(new PointCloud); //创建临时点云指针
//显示正在配准的点云文件名和各自的点数
PCL_INFO("Aligning %s (%d points) with %s (%d points).\n", data[i - 1].f_name.c_str(), source->points.size(), data.f_name.c_str(), target->points.size());
//********************************************************
//配准2个点云,函数定义见上面
pairAlign(source, target, temp, pairTransform, true);
//将当前的一对点云数据,变换到全局变换中。
pcl::transformPointCloud(*temp, *result, GlobalTransform);
//更新全局变换
GlobalTransform = GlobalTransform * pairTransform;
//********************************************************
// 保存成对的配准结果,变换到第一个点云帧
std::stringstream ss; //这两句是生成文件名
ss << i << ".pcd";
pcl::io::savePCDFile(ss.str(), *result, true); //保存成对的配准结果
}
}
在面函数里调用了loadData函数
void loadData(int argc, char **argv, std::vector<PCD, Eigen::aligned_allocator<PCD> > &models)
{
std::string extension(".pcd"); //声明并初始化string类型变量extension,表示文件后缀名
// 通过遍历文件名,读取pcd文件
for (int i = 1; i < argc; i++) //遍历所有的文件名(略过程序名)
{
std::string fname = std::string(argv);
if (fname.size() <= extension.size()) //文件名的长度是否符合要求
continue;
std::transform(fname.begin(), fname.end(), fname.begin(), (int(*)(int))tolower); //将某操作(小写字母化)应用于指定范围的每个元素
//检查文件是否是pcd文件
if (fname.compare(fname.size() - extension.size(), extension.size(), extension) == 0)
{
// 读取点云,并保存到models
PCD m;
m.f_name = argv;
pcl::io::loadPCDFile(argv, *m.cloud); //读取点云数据
//去除点云中的NaN点(xyz都是NaN)
std::vector<int> indices; //保存去除的点的索引
pcl::removeNaNFromPointCloud(*m.cloud, *m.cloud, indices); //去除点云中的NaN点
models.push_back(m);
}
}
} |