首页 > 连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识

连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识

#include 
#include       //io模块 
#include    //数据类型intmain (int argc, char** argv)
{if (argc != 2) //提示如果执行可执行文件输入两个参数 -f 或者-p
  {std::cerr << "please specify command line arg '-f' or '-p'" << std::endl;exit(0);}//申明三个pcl::PointXYZ点云数据类型,分别为cloud_a, cloud_b, cloud_cpcl::PointCloud cloud_a, cloud_b, cloud_c;//存储进行连接时需要的Normal点云,Normal (float n_x, float n_y, float n_z)pcl::PointCloud n_cloud_b;//存储连接XYZ与normal后的点云pcl::PointCloud p_n_cloud_c;// 创建点云数据//设置cloud_a的个数为5cloud_a.width  = 5;cloud_a.height = cloud_b.height = n_cloud_b.height = 1; //设置都为无序点云cloud_a.points.resize (cloud_a.width * cloud_a.height); //总数if (strcmp(argv[1], "-p") == 0)   //判断是否为连接a+b=c(点云连接)
  {cloud_b.width  = 3;cloud_b.points.resize (cloud_b.width * cloud_b.height);}else{n_cloud_b.width = 5; //如果是连接XYZ与normal则生成5个法线(字段间连接)n_cloud_b.points.resize (n_cloud_b.width * n_cloud_b.height);}
//以下循环生成无序点云填充上面定义的两种类型的点云数据for (size_t i = 0; i < cloud_a.points.size (); ++i){  //cloud_a产生三个点(每个点都有X Y Z 三个随机填充的值)cloud_a.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud_a.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud_a.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}if (strcmp(argv[1], "-p") == 0)for (size_t i = 0; i < cloud_b.points.size (); ++i){   //如果连接a+b=c,则cloud_b用三个点作为xyz的数据cloud_b.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud_b.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud_b.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}elsefor (size_t i = 0; i < n_cloud_b.points.size (); ++i){  //如果连接xyz+normal=xyznormal则n_cloud_b用5个点作为normal数据n_cloud_b.points[i].normal[0] = 1024 * rand () / (RAND_MAX + 1.0f);n_cloud_b.points[i].normal[1] = 1024 * rand () / (RAND_MAX + 1.0f);n_cloud_b.points[i].normal[2] = 1024 * rand () / (RAND_MAX + 1.0f);}
/*******************************************************************
定义了连接点云会用到的5个点云对象:3个输入(cloud_a cloud_b 和n_cloud_b)
两个输出(cloud_c  n_cloud_c)然后就是为两个输入点云cloud_a和 cloud_b或者cloud_a 和n_cloud_b填充数据  ********************************************************************/
//输出Cloud Astd::cerr << "Cloud A: " << std::endl;for (size_t i = 0; i < cloud_a.points.size (); ++i)std::cerr << "    " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl;
//输出Cloud Bstd::cerr << "Cloud B: " << std::endl;if (strcmp(argv[1], "-p") == 0)for (size_t i = 0; i < cloud_b.points.size (); ++i)std::cerr << "    " << cloud_b.points[i].x << " " << cloud_b.points[i].y << " " << cloud_b.points[i].z << std::endl;else//输出n_Cloud_bfor (size_t i = 0; i < n_cloud_b.points.size (); ++i)std::cerr << "    " << n_cloud_b.points[i].normal[0] << " " << n_cloud_b.points[i].normal[1] << " " << n_cloud_b.points[i].normal[2] << std::endl;// Copy the point cloud dataif (strcmp(argv[1], "-p") == 0){cloud_c  = cloud_a;cloud_c += cloud_b;//把cloud_a和cloud_b连接一起创建cloud_c  后输出std::cerr << "Cloud C: " << std::endl;for (size_t i = 0; i < cloud_c.points.size (); ++i)std::cerr << "    " << cloud_c.points[i].x << " " << cloud_c.points[i].y << " " << cloud_c.points[i].z << " " << std::endl;}else{  //连接字段  把cloud_a和 n_cloud_b字段连接 一起创建 p_n_cloud_c)
    pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c);std::cerr << "Cloud C: " << std::endl;for (size_t i = 0; i < p_n_cloud_c.points.size (); ++i)std::cerr << "    " <<p_n_cloud_c.points[i].x << " " << p_n_cloud_c.points[i].y << " " << p_n_cloud_c.points[i].z << " " <<p_n_cloud_c.points[i].normal[0] << " " << p_n_cloud_c.points[i].normal[1] << " " << p_n_cloud_c.points[i].normal[2] << std::endl;}return (0);
}

更多相关:

  • 经过长期探索,发现一个不需要手动设置线程休眠时间(e.g. std::this_thread::sleep_for(std::chrono::microseconds(1)))的代码: Github: https://github.com/log4cplus/ThreadPool #ifndef THREAD_POOL_H_7e...

  • nth_element(first,nth,last) first,last 第一个和最后一个迭代器,也可以直接用数组的位置。  nth,要定位的第nn 个元素,能对它进行随机访问. 将第n_thn_th 元素放到它该放的位置上,左边元素都小于它,右边元素都大于它. 测试代码: http://www.cplusplus.com...

  • c/c++老版本的rand()存在一定的问题,在转换rand随机数的范围,类型或者分布时,常常会引入非随机性。 定义在 中的随机数库通过一组协作类来解决这类问题:随机数引擎 和 随机数分布类 一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将(引擎和分布对象)定义为 st...

  • jsoncpp 是一个C++ 语言实现的json库,非常方便得支持C++得各种数据类型到json 以及 json到各种数据类型的转化。 一个json 类型的数据如下: {"code" : 10.01,"files" : "","msg" : "","uploadid" : "UP000000" } 这种数据类型方便我们人阅读以...

  • 问题如下: 已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子 集中的各个元素和为整数target的子集,结果中无重复的子集。 例如: nums[] = [10, 1, 2, 7, 6, 1, 5], target = 8 结果为: [[1, 7], [1, 2, 5], [2, 6], [1, 1, 6]] 同样之前有...