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

青岛营销型网站推广百度贴吧热线客服24小时

青岛营销型网站推广,百度贴吧热线客服24小时,网站建设中html5模板,惠州手工活外发加工网一、RANSAC概念及作用 1.1 基本概念 RANSAC是一种鲁棒的参数估计方法,用于从包含大量异常值的数据中拟合数学模型。其核心思想是通过随机采样和迭代验证,找到最优的模型参数,避免异常值的干扰。 1.2 核心思想 随机采样:每次从数…

一、RANSAC概念及作用

1.1 基本概念

RANSAC是一种鲁棒的参数估计方法,用于从包含大量异常值的数据中拟合数学模型。其核心思想是通过随机采样迭代验证,找到最优的模型参数,避免异常值的干扰。

1.2 核心思想

  • 随机采样:每次从数据中随机选取最小子集(如拟合直线时选2个点)来估计模型参数。

  • 一致性检验:用估计的模型测试其他数据点,统计符合模型的内点(inliers,误差小于阈值的数据)。

  • 迭代优化:重复上述过程,选择内点最多的模型作为最优解。

1.2.1 算法步骤

  1. 随机采样:从数据中随机选取最小样本集(如拟合平面需3个点)。

  2. 模型估计:用采样点计算模型参数(如直线方程)。

  3. 内点检测:计算所有数据点到模型的误差,统计满足误差阈值的点(内点)。

  4. 评估模型:若当前内点比例高于历史最优,则更新模型和内点集合。

  5. 终止条件:达到预设迭代次数或内点比例足够高时停止。

1.2.2 优缺点

  • 优点

    • 对噪声和异常值不敏感。

    • 无需数据预处理(如滤波)。

  • 缺点

    • 计算成本高(依赖迭代次数)。

    • 需预设阈值(如内点误差阈值)。

1.2.3 数学表达

1.3 PCL中的随机参数估计算法

PCL 中以随机采样一致性算法( RANSAC) 为核心,实现了五种类似于RANSAC的随机参数估计算法,例如随机采样一致性估计(RANSAC ) 、最大似然一致性估计 (MLESAC ) 、最小中值方差一致性估计 ( LMEDS )等,所有的估计参数算法都符合一致性准则。利用RANSAC可以实现点云分割,目前 PCL 中支持的几何模型分割有空间平面、直线、二维或三维圆、圆球、锥体等 。 

二、代码解析

2.1 生成噪声和球体面

	for (std::size_t i = 0; i < cloud->points.size(); ++i){cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0);if (i % 5 == 0){cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0);}else if (i % 2 == 0){cloud->points[i].z = sqrt(1 - (cloud->points[i].x * cloud->points[i].x)- (cloud->points[i].y * cloud->points[i].y));}else{cloud->points[i].z = -sqrt(1 - (cloud->points[i].x * cloud->points[i].x)- (cloud->points[i].y * cloud->points[i].y));}}

生成一个合成点云,其中包含:随机噪声点和一个隐含的球体表面点

比例Z 坐标生成方式几何意义
20%完全随机 ([0, 1024))离群点(噪声)
40%z = +sqrt(1 - x² - y²)单位球上半球面(内点)
40%z = -sqrt(1 - x² - y²)单位球下半球面(内点)
  • 有效球面点:80% 的点分布在单位球上(x² + y² + z² = 1)。

  • 噪声点:20% 的点是随机噪声,用于测试 RANSAC 的鲁棒性。

2.2 RANSAC算法过程

	std::vector<int> inliers;pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_s);ransac.setDistanceThreshold(.01);ransac.computeModel();ransac.getInliers(inliers);

2.2.1 创建球体模型对象

pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));
  • 作用:定义一个 RANSAC 可拟合的球体模型

  • 参数

    • pcl::PointXYZ:点云类型(包含 x, y, z 坐标)。

    • cloud:输入点云(pcl::PointCloud<pcl::PointXYZ>::Ptr 类型)。

  • 输出model_s 是球体模型的智能指针,用于后续 RANSAC 拟合。

2.2.2 初始化 RANSAC 算法

pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_s);
  • 作用:创建RANSAC求解器,绑定球体模型 model_s

  • 关键点

    • RANSAC 会从 cloud 中随机采样点,尝试拟合球体。

    • 适用于存在大量离群点(outliers)的情况。

2.2.3 设置距离阈值

ransac.setDistanceThreshold(0.01);
  • 作用:定义内点(inliers)的判定条件

  • 参数

    • 0.01:点到球面的最大允许距离(单位:米)。

    • 若点距球面距离 ≤ 0.01,则判定为内点。

  • 影响

    • 值越小,拟合越严格。

    • 值越大,鲁棒性越强。

2.2.4 执行RANSAC拟合

ransac.computeModel();
  • 作用:运行 RANSAC 算法,迭代寻找最优球体参数。

  • 内部流程

    1. 随机采样最小点集(球体需 4 个点)。

    2. 计算球体参数(中心 (cx, cy, cz) 和半径 r)。

    3. 统计所有满足 distance ≤ 0.01 的内点。

    4. 重复迭代,保留内点最多的模型。

2.2.5 获取内点索引

ransac.getInliers(inliers);
  • 作用:提取被 RANSAC 判定为内点的索引。

  • 参数

    • inliers:通常是 pcl::PointIndices::Ptr 或 std::vector<int> 类型,存储内点的索引。

2.2.6 copyPointCloud函数

pcl::copyPointCloud(*cloud, inliers, *final);

这行代码的作用是从原始点云 cloud 中提取 RANSAC 拟合后得到的内点(inliers),并将其复制到一个新的点云final

  • 输入

    • *cloud:原始点云。

    • indices:需要复制的点的索引(这里是 inliers,即 RANSAC 找到的内点)。

  • 输出

    • cloud_out:存储提取后的点云(这里是 *final)。

2.3 点云显示函数

pcl::visualization::PCLVisualizer::Ptr 
simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud, pcl::PointCloud<pcl::PointXYZ>::ConstPtr final = nullptr)
{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, 2, "sample cloud");if (final != nullptr){pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handler(final, 255, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(final, color_handler, "final cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "final cloud");}viewer->addCoordinateSystem(1.0, "global");viewer->initCameraParameters();return (viewer);
}

上述代码将原点云显示为白色,将筛选后的点云显示为红色。

2.4案例完整代码

2.2.1 案例球形估计

#include <iostream>
#include <thread>#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_parallel_plane.h>
#include <pcl/sample_consensus/sac_model_normal_sphere.h>
#include <pcl/visualization/pcl_visualizer.h>pcl::visualization::PCLVisualizer::Ptr 
simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud, pcl::PointCloud<pcl::PointXYZ>::ConstPtr final = nullptr)
{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, 2, "sample cloud");if (final != nullptr){pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handler(final, 255, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(final, color_handler, "final cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "final cloud");}viewer->addCoordinateSystem(1.0, "global");viewer->initCameraParameters();return (viewer);
}int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr final(new pcl::PointCloud<pcl::PointXYZ>);cloud->width = 3000;cloud->height = 1;cloud->is_dense = false;cloud->points.resize(cloud->width * cloud->height);for (std::size_t i = 0; i < cloud->points.size(); ++i){cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0);if (i % 5 == 0){cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0);}else if (i % 2 == 0){cloud->points[i].z = sqrt(1 - (cloud->points[i].x * cloud->points[i].x)- (cloud->points[i].y * cloud->points[i].y));}else{cloud->points[i].z = -sqrt(1 - (cloud->points[i].x * cloud->points[i].x)- (cloud->points[i].y * cloud->points[i].y));}}std::vector<int> inliers;pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_s);ransac.setDistanceThreshold(100);ransac.computeModel();ransac.getInliers(inliers);pcl::copyPointCloud(*cloud, inliers, *final);pcl::visualization::PCLVisualizer::Ptr viewer;viewer = simpleVis(cloud, final);while (!viewer->wasStopped()){viewer->spinOnce(100);}return -1;
}

2.2.2 案例平面估计

#include <iostream>
#include <ctime>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/sample_consensus/sac_model_perpendicular_plane.h>
#include <pcl/sample_consensus/ransac.h>pcl::visualization::PCLVisualizer::Ptr simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr PointCloud,pcl::PointCloud<pcl::PointXYZ>::ConstPtr final = nullptr)
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(PointCloud, "PointCloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "PointCloud");pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> final_point_color_handle(final, 255, 0, 0);viewer->addPointCloud(final, final_point_color_handle,"fianl");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "fianl");viewer->addCoordinateSystem(200);viewer->initCameraParameters();return viewer;
}int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr PointCloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr final(new pcl::PointCloud<pcl::PointXYZ>);PointCloud->width = 1500;PointCloud->height = 1;PointCloud->is_dense = false;PointCloud->points.resize(PointCloud->width * PointCloud->height);for (size_t i = 0; i < PointCloud->points.size(); ++i){PointCloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0);PointCloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0);if (i % 2 == 0){PointCloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0);}else{PointCloud->points[i].z =0.5 * ( PointCloud->points[i].x + PointCloud->points[i].y);}}std::vector<int> inliers;pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_p(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(PointCloud));pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_p);ransac.setDistanceThreshold(0.001);ransac.computeModel();ransac.getInliers(inliers);pcl::copyPointCloud(*PointCloud, inliers, *final);pcl::visualization::PCLVisualizer::Ptr viewer;viewer = simpleVis(PointCloud, final);while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

http://www.dtcms.com/wzjs/256051.html

相关文章:

  • 柯林wap建站冯站长之家
  • 义乌品牌网站建设如何建站
  • 跨境电商平台怎么做搜索引擎优化的分类
  • 上海网站备案注销营销咨询师
  • 做网站需要租服务器吗营业推广策略
  • 局域网小网站网站建设软件帮别人推广app赚钱
  • 网站响应式和非响应式百度识图在线识别
  • 东营做网站seo的白度
  • 求个网站靠谱的搜索引擎优化的简称
  • 哪个网站做美食好一点网站搭建策略与方法
  • 哈尔滨网站建设推荐腾讯云域名注册
  • 武汉鑫灵锐网站建设厦门网络推广哪家强
  • 做网站主要栏目内seo网站优化建议
  • 做类似58同城的网站列表网推广效果怎么样
  • 苏州做视频网站广告公司免费网络推广平台
  • 做360手机网站百度招聘2022年最新招聘
  • 广东十大网站建设排名网站排名软件推荐
  • 全方位营销型网站数字营销
  • 上海网站建设聚众网络网站访问量排行榜
  • 新手网站西安关键词优化排名
  • 怎么做淘客网站百度一下百度一下你就知道
  • 怎么做免费个人网站什么是百度竞价推广
  • 电子商城平台网站建设李勇seo博客
  • 夸网站做的好怎么夸网络优化网站
  • 中山营销型网站建设培训机构招生方案模板
  • 旅游电子商务网站建设费用seo诊断
  • 做好网站建设工作营销推广策划方案范文
  • 明星做代言的购物网站0代做seo排名
  • 做网站模板出售类网站怎么样天津关键词排名推广
  • 做塑料的网站网站优化一年多少钱