点云技术相关产学研社区

 找回密码
 立即注册加入PCL中国点云技术相关产学研社区

扫一扫,访问微社区

查看: 2679|回复: 0

如何逐步匹配多幅点云,光盘教程遇到问题。

[复制链接]
发表于 2016-11-10 10:03:47 | 显示全部楼层 |阅读模式
本帖最后由 猴哥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);
                    }
            }
    }
  • 回复

    使用道具 举报

    本版积分规则

    QQ|小黑屋|点云技术相关产学研社区 ( 陕ICP备13001629号 )

    GMT+8, 2024-5-4 19:35 , Processed in 2.409380 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表