当前位置: 首页 > news >正文

PCL提取平面上的圆形凸台特征

1. 点云转深度图像,提取圆心;找到与圆心匹配的三维点;

2. 三维点以指定半径取邻域点,抽取所有邻域点的最大平面为参考平面;

3. 将平面附近点删去,得到凸台点。剩余凸台抽取最大平面,作为凸台顶面平面;

4. 将凸台点云变换到顶面平面作为xOy平面的坐标系下;

5. 对投影到顶面平面的2D点云识别边缘点,并拟合2D圆;找到圆心对应的原始点;

6. 圆心点到参考平面距离为凸台高度;

部分代码如下:

  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_src(new pcl::PointCloud<pcl::PointXYZ>);pcl::PLYReader reader;//reader.setVerbosity(true);  // 启用详细日志if (reader.read(file_name, *cloud_src) == -1) {pcl::console::print_error("Failed to load PLY file!\n");return -1;}print_time("load data done");#pragma omp parallel forfor (int tt = 0;tt < 100;tt++){pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);*cloud = *cloud_src;          // 逐字段深拷贝,包括点、宽、高、header 等Eigen::Vector4f plane_coeff;Eigen::Vector3f centroid;if (!extractPlane(cloud, plane_coeff, centroid)){printf("Plane extract failed!\n");continue;}erasePtsByDistToPlane(cloud, plane_coeff, 0.015);//pcl::io::savePLYFileBinary(folder + "single" + ".ply", *cloud);Eigen::Vector3f centroid2;auto circle_plane = extractLargestPlane(cloud, centroid2);Eigen::Vector4f plane2;plane2[0] = circle_plane->values[0];plane2[1] = circle_plane->values[1];plane2[2] = circle_plane->values[2];plane2[3] = circle_plane->values[3];Coord2DTransformer transformer;transformer.projectToPlane(cloud, plane2, centroid2);//auprojectToPlane(cloud, circle_plane);//pcl::io::savePLYFileBinary(folder + "circle_plane" + ".ply", *cloud2);auto boundary = extractBoundaryPointsAlphaShape(transformer.points2d_cv, 0.01);auto fitted_circle = fitCircleLeastSquares(boundary);auto center = transformer.calcCoord3D(glm::dvec2(fitted_circle.center.x, fitted_circle.center.y));auto height = pointToPlane(center, plane_coeff);// -(plane_coeff[0] * center.x + plane_coeff[1] * center.y + plane_coeff[3] * center.z) / plane_coeff[2];//exportPointsToTXT(boundary, folder + "boundary.txt", 6);printf("center = %.3f, %.3f, %.3f, radius = %.3f, height = %.3f\n",center.x, center.y, center.z, fitted_circle.radius, height);//auto cloud3 = extractBoundary(cloud2);// pcl::io::savePLYFileBinary(folder + "boundary" + ".ply", *cloud3);//Coord2DTransformer transformer;//auto transformed_cloud = transformer.rectify(cloud, plane_coeff, centroid);}

http://www.dtcms.com/a/319759.html

相关文章:

  • WindowsLinux系统 安装 CUDA 和 cuDNN
  • 从库存一盘货到全域智能铺货:巨益科技全渠道平台助力品牌业财一体化升级
  • 电子基石:硬件工程师的器件手册 (九) - DC-DC拓扑:电能转换的魔术师
  • 线上业务突然流量掉 0 ?一次 DNS 污染排查与自救实录
  • Qt中类提升后不显示问题
  • 纷享销客前端实习一面
  • 数据结构(五):顺序循环队列与哈希表
  • 纪念《信号与系统》拉普拉斯变换、Z变换之前内容学完
  • 树莓派Raspberry Pi 烧录
  • TCP/IP 协议中的三次握手和四次挥手-----详解笔记
  • 板块三章节3——NFS 服务器
  • 人工智能2.0时代的人才培养和通识教育
  • 计算机视觉第一课opencv(一)保姆级教学
  • lane_up channel_up
  • mysql8.0.40服务日志时间和linux系统时间不同步问题!
  • 指针——练习
  • 算法 - 贪心算法
  • 计网学习笔记第3章 数据链路层层(灰灰题库)
  • 冷库设备远程监控物联网+省电节能解决方案
  • linux下实现System V消息队列实现任意结构体传输
  • 具身智能,正在翻越三座大山
  • 计算机毕业设计java疫情开放下的新冠信息共享平台 基于Java的社区疫情防控人员流动管理系统 疫情防控期间社区人员动态管理系统
  • 范数的定义、分类与 MATLAB 应用实践
  • 解决React白板应用中的画布内容丢失问题
  • 3363. 最多可收集的水果数目
  • 关键字 - 第二讲
  • Spring AI + Redis:构建高效AI应用缓存方案
  • 【物联网】基于树莓派的物联网开发【25】——树莓派安装Grafana与Influxdb无缝集成
  • 在 Linux 系统上安装 Docker 的步骤如下(以 Ubuntu/Debian为例)
  • 前缀和