PCL点云焊点提取

滚回来更新一篇文章,和各位交流一下
待处理点云:
数量级:百万
类型:零部件
描述:弯曲表面上有一些凸起在上面,需要提取凸起和平面接触的一圈点云,作为焊接的加工点

在这里插入图片描述

参考:

https://zhuanlan.zhihu.com/p/32111069

其实这篇文章也算是全面了,思路和他的差不多,只是算法不太一样,主要是前处理点云数据这里不太一样
首先是体素栅格滤波,待处理点云数据不均匀,且存在点云重影的问题,拟合算法效果不太好:

体素栅格:

	pcl::VoxelGrid<pcl::PointXYZ> sor;
	sor.setInputCloud(cloudA);
	sor.setLeafSize(1.2f, 1.2f, 1.2f);//设置滤波时创建的体素大小为1.2cm立方体
	sor.filter(*cloud_filtered);

高斯:

pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); //kdtree搜索
	pcl::PointCloud<pcl::PointNormal> mls_points;
	pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
		mls.setComputeNormals(true);// 最小二乘计算中
	mls.setInputCloud(cloud);
	mls.setPolynomialFit(true);  //多项式拟合提高精度,
	mls.setPolynomialOrder(2);//2次多项式
	mls.setSearchMethod(tree);
	mls.setSearchRadius(0.05);//半径
	mls.setSqrGaussParam(10);

前处理最好能处理点云达到需求,保持轮廓的情况下点云数量级越小越好

正式处理:
和知乎文章一样
1.导入点云:

//导入pcd

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA(new pcl::PointCloud<pcl::PointXYZ>);

	if (pcl::io::loadPCDFile<pcl::PointXYZ>("xx.pcd", *cloudA) == -1)
	{
		PCL_ERROR("未导入点云\n");

		return -1;
	}

2.法线计算:

//先计算法线


	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;

	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());

	ne.setSearchMethod(tree);

	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);

	ne.setRadiusSearch(1);//搜索半径1cm

	ne.compute(*normals);

	pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);

	pcl::concatenateFields(*cloudA, *normals, *cloud_with_normals);

	

3.提取平面:采用RANSAC提取平面

     setOptimizeCoefficients(true);

	seg.setModelType(pcl::SACMODEL_NORMAL_PLANE); 

	seg.setNormalDistanceWeight(0.1);//法线权重系数0.1

	seg.setMethodType(pcl::SAC_RANSAC);

	seg.setMaxIterations(1000); //迭代的次数1000

	seg.setDistanceThreshold(0.5); //内点到模型的距离最大0.5

4.边界提取



	normEst.setKSearch(9);  //法向估计的点数

	normEst.compute(*normals1);

	est.setInputCloud(cloud_filtered);

	est.setInputNormals(normals1);

	est.setSearchMethod(tree1);

	est.setKSearch(20);  

	est.compute(boundaries);

到这里已经有效果了:
z在这里插入图片描述
知乎文章也是到这一步:
在这里插入图片描述
这位大神说后面需要去掉边框,和我的问题一样,大神不说那我来说拉:

直通滤波:

pcl::PassThrough<pcl::PointXYZ> pass_x;
	pass_x.setInputCloud(BoundPoints);
	pass_x.setFilterFieldName("x");
	pass_x.setFilterLimits(min.x + 10, max.x - 20);
	pass_x.filter(*cloud_filtered_x);

最终效果:
在这里插入图片描述
搞定,下次还不知道什么时候有时间来更新啊

热门文章

暂无图片
编程学习 ·

Taro 3 正式版发布:开放式跨端跨框架解决方案

作者:凹凸曼 - yuche 从 Taro 第一个版本发布到现在,Taro 已经接受了来自于开源社区两年多的考验。今天我们很高兴地在党的生日发布 Taro 3(Taro Next)正式版,希望 Taro 未来的更多两年能像一名共产主义战士一样经受住更多的考验。以下是 Taro 3 的一些新增特性: 跨框架:…
暂无图片
编程学习 ·

718. 最长重复子数组

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。目录1、题目分析2、解题分析3、代码示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。1、题目分析求两个数组公共的子数组的长度,那么可以用较短的那个…
暂无图片
编程学习 ·

前端适配问题总结

前端适配问题总结视口布局的优点:宽度和高度全部自动适应!再加上rem布局的字体适应,可以完美解决各种屏幕适配问题!1.vw:1vw等于视口宽度的1%。2.vh:1vh等于视口高度的1%。3.vmin:选取vw和vh中最小的那个。4.vmax:选取vw和vh中最大的那个。vh and vw:相对于视口的高度…
暂无图片
编程学习 ·

反射 枚举和lambda

1 反射(reflect) 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意 一个对象,都能够调用它的任意方法和属性. 既然能拿到那么,我们就可以修改部分类型信息. 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. 2 使用场景: 可…
暂无图片
编程学习 ·

java学习基础:Math类

记录学习java路程将与风雨相伴!!! Math类(数学类) 算术计算 Math.sqrt():计算平方根 Math.cbrt():计算立方根 Math.pow(a,b):计算a的b次方 Math.max(,):计算最大值 Math.min(,):计算最小值 Math.abs():取绝对值 进位 Math.ceil():天花板的意思,就…
暂无图片
编程学习 ·

基于stm32单片机温度报警器LCD1602液晶电子制作智能测量

演示视频:https://v.youku.com/v_show/id_XNDU3OTU0MDcwOA==.html 将链接复制至IE浏览器打开!!! 功能说明: 上电后,会一直显示测量出来的温度值,没有按键按下情况下一直会显示。 当温度超过高限或者低于下限会报警。 按下设置键后可以对高限底限进行设置。
暂无图片
编程学习 ·

select 进阶查询,不会你就 OUT 了

1.1 分组查询 1.1.1 语法 # where 和 having 可以省略 SELECT col_name, group_function, FROM tb_name [WHERE where_condition] GROUP BY group_expression [HAVING group_condition];☞ 说明col_name:列明 tb_name:表名 where_condition:where 后的过滤条件 group_func…
暂无图片
编程学习 ·

防止IE6 CSS背景闪烁

Internet Explorer造成的困扰问题之一是锚标记背景图像的闪烁。 但是,您知道吗,有一种使用少量JavaScript来防止该问题的快捷简便的方法吗? 只需将以下JavaScript代码放在您网站的标题部分,刷新页面,然后就另一个IE6问题出价。 .x-secondary-small {display: none; }@medi…
暂无图片
编程学习 ·

C#异步Task

笔记整理(原资源网址): https://www.bilibili.com/video/BV1Zf4y117fs?p=12 Task Thread 的问题线程(Thread)是用来创建并发(concurrent)的一种低级别工具,它有一些限制,尤其是:虽然开始线程的时候可以方便的传入数据,但是当 Join 的时候,很难从线程获得返回值。 可能…
暂无图片
编程学习 ·

Maven setting 文件配置

Maven setting 文件配置<?xml version="1.0" encoding="UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additiona…
暂无图片
编程学习 ·

java大牛总结的 面试题

下面一起来看 208 道面试题,具体的内容。一、Java 基础1.JDK 和 JRE 有什么区别?2.== 和 equals 的区别是什么?3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?4.final 在 java 中有什么作用?5.java 中的 Math.round(-1.5) 等于多少?6.String 属于基础的数…
暂无图片
编程学习 ·

SSM整合之配置文件

1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/…
暂无图片
编程学习 ·

Arcgis api for Javascript + arcgisServer + arcSDE笔记(1)

最近要搞的项目要用Arcgis api for Javascript做地图模块,自己开始学相关的技术。这是之前整理的笔记,现在传到博客上,也作为学习的记录0 环境搭建Arcgis软件统一使用10.2版本(更新的版本很难找到比较齐全的server、sde等配套软件),安装arcgis Desktop、arcgis Server、a…
暂无图片
编程学习 ·

diff (制作补丁)和 patch(添加补丁) 的简介及简单使用

diff是Linux系统的一个很重要的工具程序,我们通常用diff对同一软件(或程序)的不同版本的文件进行对比查看。不过,你不要用diff去比较两个完全不相干的文件,因为那样是比不出结果来的。diff是以“行”为单位比较的。diff和patch是一对工具,在数学上来说,diff是对两个集合…
暂无图片
编程学习 ·

EPSON LS3-401S机器人学习笔记 1

机器人小白开始学习历程去下面的网址下载https://epson.com/Support/Robots/SCARA-Robots/SCARA-LS-Series/Epson-LS3-SCARA-Robots/s/SPT_RLS3401ST9P5#manuals正在读这本书,讲解开发工具RC+ 5.0 的,由于我的机器人是最低端的,如果使用RC+ 7.0 ,还需求购买一个什么卡,就先…