贪睡的shy 2023-10-01 19:27 采纳率: 100%
浏览 6
已结题

PCL1.12 VS2022运行结果有时正确有时不正确

当前软件为PCL1.12+VS2022
PCL初学者
问题为,代码运行结果有时正确有时不正确求指教,是哪里出现的问题?

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/crop_box.h>
#include <vector>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/PointIndices.h>
#include <pcl/filters/extract_indices.h>
using namespace std;
struct  pointt
{
    int  index=0;
    float x=0;
    float z=0;
};
struct Profile1
{
    float y=0;
    vector<pointt> pointss;
};
vector<pointt> getprofile(float y, float stepY, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1)//获得断面
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr croppedCloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointIndices::Ptr croppedindices(new pcl::PointIndices);
    pcl::CropBox<pcl::PointXYZ> crop;
    float minX = -1;   // 裁剪框在 x 轴上的最小值
    float minZ = -1;   // 裁剪框在 z 轴上的最小值
    float maxX = 4;    // 裁剪框在 x 轴上的最大值
    float maxZ = 4;    // 裁剪框在 z 轴上的最大值
    crop.setInputCloud(cloud1);
    crop.setMin(Eigen::Vector4f(minX, y, minZ, 1.0));
    crop.setMax(Eigen::Vector4f(maxX, y + stepY, maxZ, 1.0));
    crop.filter(*croppedCloud);
    crop.getRemovedIndices(*croppedindices);  // 获取被移除的点的索引
    struct pointt p1 = { 0,0,0 };
    vector<pointt> numbers;
    for (int i = 0; i < croppedCloud->points.size(); i++)
    {
        p1.x = croppedCloud->points[i].x;
        p1.z = croppedCloud->points[i].z;
        p1.index = i;
        numbers.push_back(p1);
    }
    croppedCloud.reset();
    croppedindices.reset();
    return numbers;
}
vector<Profile1> profile(float minY, float maxY, float stepY, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)//循环获得断面
{

    vector<Profile1> members;
    Profile1 pf = { 0.0, vector<pointt>() };;
    for (float y = minY; y <= maxY;)
    {
        pf.pointss = getprofile(y, stepY, cloud);
        pf.y = y;
        if (pf.pointss.empty())
        {

        }
        else
        {
            members.push_back(pf);
        }
        y = y + stepY;
    }
    return members;
}
int main(int argc, char** argv)
{
    float minY = -0.18;   // 裁剪框在 y 轴上的最小值
    float maxY = 0.18;    // 裁剪框在 y 轴上的最大值
    float stepY = 0.005;   // 沿 y 轴的步长
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud);
    vector<Profile1> members = profile(minY, maxY, stepY, cloud);
    for (int i = 0; i < members.size(); i++)//测试代码正确性
    {
        cout << "里程为" << members[i].y << endl;
        //for (int j = 0; j < members[i].pointss.size(); j++)
        //{
          //   cout << "x为" << members[i].pointss[j].x << "z为" << members[i].pointss[j].z << "索引为" << members[i].pointss[j].index << endl;
         //}
    }
    cloud.reset();
    system("pause");
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-01 22:13
    关注

    【相关推荐】



    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7788693
    • 这篇博客你也可以参考下:小白的PCL路1(PCL1.8.1+VS2017配置)
    • 除此之外, 这篇博客: PCL点云库学习笔记(点云分割1)中的 六、基于颜色的区域生长分割 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      主要区别:
      1.它使用颜色而不是法线;
      2.它将合并算法用于过度分割和欠分割控制。分割之后,将平均颜色差异很小的两个相邻聚类合并在一起。计算每个群集包含的点数, 如果此数字小于用户定义的值,则当前群集将与最近的相邻群集合并。

      #include <iostream>
      #include <thread>
      #include <vector>
      
      #include <pcl/point_types.h>
      #include <pcl/io/pcd_io.h>
      #include <pcl/search/search.h>
      #include <pcl/search/kdtree.h>
      #include <pcl/visualization/cloud_viewer.h>
      #include <pcl/filters/passthrough.h>
      #include <pcl/segmentation/region_growing_rgb.h>
      
      using namespace std::chrono_literals;
      
      int main(int argc, char** argv)
      {
      	pcl::search::Search <pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);//创建一个指向kd树搜索对象的共享指针
      
      	pcl::PointCloud <pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud <pcl::PointXYZRGB>);
      	if (pcl::io::loadPCDFile <pcl::PointXYZRGB>("region_growing_rgb_tutorial.pcd", *cloud) == -1)
      	{
      		std::cout << "Cloud reading failed." << std::endl;
      		return (-1);
      	}
      
      	//进行直通滤波处理,提取滤波后的点集,保存到索引中
      	pcl::IndicesPtr indices(new std::vector <int>);//创建一组索引
      	pcl::PassThrough<pcl::PointXYZRGB> pass;//设置直通滤波器对象
      	pass.setInputCloud(cloud);
      	pass.setFilterFieldName("z");
      	pass.setFilterLimits(0.0, 1.0);
      	pass.filter(*indices);
      
      	pcl::RegionGrowingRGB<pcl::PointXYZRGB> reg;
      	reg.setInputCloud(cloud);
      	reg.setIndices(indices);//设置输入点云的索引
      	reg.setSearchMethod(tree);
      	reg.setDistanceThreshold(10);//设置距离阈值,判断点云两点是否相邻
      	reg.setPointColorThreshold(6);//两点的颜色差别阈值
      	reg.setRegionColorThreshold(5);//两个聚类的平均颜色的差别阈值
      	reg.setMinClusterSize(600);
      
      	std::vector <pcl::PointIndices> clusters;
      	reg.extract(clusters);
      
      	pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud();
      	pcl::visualization::CloudViewer viewer("Cluster viewer");
      	viewer.showCloud(colored_cloud);
      	while (!viewer.wasStopped())
      	{
      		std::this_thread::sleep_for(100us);
      	}
      
      	return (0);
      }
      

      在这里插入图片描述


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 10月1日

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)