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

点云平面拟合和球面拟合

一、介绍

In this tutorial we learn how to use a RandomSampleConsensus with a plane model to obtain the cloud fitting to this model.

二、代码

#include <iostream>
#include <thread>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/point_cloud.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/sample_consensus/sac_model_sphere.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std::chrono_literals;pcl::visualization::PCLVisualizer::Ptr simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem (1.0, "global");viewer->initCameraParameters();return (viewer);
}void ranFit()
{bool is_plane = true;bool is_show_final = false;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr final(new pcl::PointCloud<pcl::PointXYZ>);cloud->width = 500;cloud->height = 1;cloud->is_dense = false;cloud->points.resize(cloud->width * cloud->height);for (int i = 0; i < cloud->size(); ++i){if (is_plane==false){// x*x+y*y+z*z=1(*cloud)[i].x = 2.0 * rand() / (RAND_MAX + 1.0) - 1.0;(*cloud)[i].y = 2.0 * rand() / (RAND_MAX + 1.0) - 1.0;if ((*cloud)[i].x * (*cloud)[i].x + ((*cloud)[i].y * (*cloud)[i].y) > 1)(*cloud)[i].z = 2.0 * rand() / (RAND_MAX + 1.0) - 1.0;else if (i % 2 == 0)(*cloud)[i].z = sqrt(1 - ((*cloud)[i].x * (*cloud)[i].x) - ((*cloud)[i].y * (*cloud)[i].y));else(*cloud)[i].z = -sqrt(1 - ((*cloud)[i].x * (*cloud)[i].x) - ((*cloud)[i].y * (*cloud)[i].y));}else{// 0.5x+0.5y-z=0(*cloud)[i].x = rand() / (RAND_MAX + 1.0);(*cloud)[i].y = rand() / (RAND_MAX + 1.0);if (i % 3 == 0)(*cloud)[i].z = rand() / (RAND_MAX + 1.0);else(*cloud)[i].z = 0.5 * (*cloud)[i].x + 0.5 * (*cloud)[i].y;}}std::vector<int> inliers;std::vector<int> outliers;pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptrmodel_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptrmodel_p(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));Eigen::VectorXf coef;if (is_plane){pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_p);ransac.setDistanceThreshold(.01);ransac.computeModel();ransac.getInliers(inliers);ransac.getModelCoefficients(coef);}else{pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_s);ransac.setDistanceThreshold(.01);ransac.computeModel();ransac.getInliers(inliers);ransac.getModelCoefficients(coef);}std::cout << coef << std::endl;pcl::copyPointCloud(*cloud, inliers, *final);pcl::visualization::PCLVisualizer::Ptr viewer;if (is_show_final)viewer = simpleVis(final);elseviewer = simpleVis(cloud);while (!viewer->wasStopped()){viewer->spinOnce(100);std::this_thread::sleep_for(100ms);}
}int main()
{ranFit();return (0);
}

 

 

 

三、参考

How to use Random Sample Consensus model — Point Cloud Library 0.0 documentation

http://www.lryc.cn/news/134741.html

相关文章:

  • 部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)
  • 视觉SLAM:一直在入门,如何能精通,CV领域的绝境长城,
  • 【报错】yarn --version Unrecognized option: --version Error...
  • 二叉搜索树的(查找、插入、删除)
  • 电力虚拟仿真 | 高压电气试验VR教学系统
  • innovus如何设置size only
  • Java之继承详解二
  • 国内常见的几款可视化Web组态软件
  • 通过 git上传到 gitee 仓库
  • 设置Windows主机的浏览器为wls2的默认浏览器
  • 森林生物量(蓄积量)估算全流程
  • MySQL数据库概述
  • 2023年国赛数学建模思路 - 案例:退火算法
  • 怎么借助ChatGPT处理数据结构的问题
  • Docker容器无法启动 Cannot find /usr/local/tomcat/bin/setclasspath.sh
  • Pytorch-day08-模型进阶训练技巧-checkpoint
  • 【ArcGIS Pro二次开发】(61):样式(Style)和符号(Symbol)
  • 深入理解 HTTP/2:提升 Web 性能的秘密
  • 800V高压电驱动系统架构分析
  • Camunda_3:主动撤回
  • ClickHouse(二十三):Java Spark读写ClickHouse API
  • Linux下的GPIO基本概念指南
  • 快速解决Spring Boot跨域困扰:使用CORS实现无缝跨域支持
  • 【【萌新的STM32学习-13之GPIO寄存器的用法】】
  • Android开发基础知识总结(一)初识安卓Android Studio
  • 常见的网络设备有哪些?分别有什么作用?
  • 斗鱼财报盈利的背后:左手艳舞、右手擦边
  • 布隆过滤器
  • element-ui中二次封装一个带select的form组件
  • 07.利用Redis实现点赞排行榜功能