点云分割——圆柱体分割

此例利用随机采样一致性算法对有噪声的点云场景提取一个圆柱体模型,处理流程如下:

(1)过滤掉远与1.5m的数据点

(2)计算每个点的表面法线

(3)分割出平面模型(本例中为桌面)并保存到磁盘中

(4)分割出圆柱体模型并保存到磁盘中

 

PCL法线估计:

    平面的法线是垂直于它的单位向量。在点云的表面的法线被定义为垂直于与点云表面相切的平面的向量。表面法线也可以计算点云中一点的法线,被认为是一种十分重要的性质。常常在被使用在很多计算机视觉的应用里面,比如可以用来推出光源的位置,通过阴影与其他视觉影响,表面法线的问题可以近似化解为切面的问题,这个切面的问题又会变成最小二乘法拟合平面的问题。

    解决表面法线估计的问题可以最终化简为对一个协方差矩阵的特征向量和特征值的分析(或者也叫PCA-Principal Component Analysis 主成分分析),这个协方差矩阵是由查询点的最近邻产生的。对于每个点Pi,我们假设协方差矩阵C如下:

C++中声明对象和NEW对象的区别:

    new出来的对象是直接放在堆上,而声明一个对象是放在栈中。换句话说,new出来的对象的生命周期是全局的,譬如在一个函数块里new一个对象,可以将该对象的指针返回回去,该对象依旧存在。而声明的对象的生命周期只存在于声明了该对象的函数块中,如果返回该声明的对象,将会返回一个已经被销毁的对象。

参考博客:https://blog.youkuaiyun.com/city_to_sky/article/details/79876992

 

FPS每秒纯属帧率(Frames Per Second):

    FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会越流畅。通常,要避免动作不流畅的最低是30。某些计算机视频格式,每秒只能提供15帧。

FPS”也可以理解为我们常说的“刷新率(单位为Hz)”,例如我们常在CS游戏里说的“FPS值”。我们在装机选购显卡和显示器的时候,都会注意到“刷新率”。一般我们设置缺省刷新率都在75Hz(即75帧/秒)以上。例如:75Hz的刷新率刷也就是指屏幕一秒内只扫描75次,即75帧/秒。而当刷新率太低时我们肉眼都能感觉到屏幕的闪烁,不连贯,对图像显示效果和视觉感观产生不好的影响。

电影以每秒24张画面的速度播放,也就是一秒钟内在屏幕上连续投射出24张静止画面。有关动画播放速度的单位是fps,其中的f就是英文单词Frame(画面、帧),p就是Per(每),s就是Second(秒)。用中文表达就是多少帧每秒,或每秒多少帧。电影是24fps,通常简称为24帧。

 

调试过程中出现的问题:

1.当前不会命中断点 还没有为该文档加载任何符号

    这因为编译器生成的符号文件与源代码不同。将工具->选项->调试中的要求源文件与原始版本完全匹配选项取消。清除项目并重新生成再运行。

2.读取文件失败

    由于电脑处理速度有限,加上点云数据很大,因此加载时间会很长,并不是读取有问题,耐心等待即可。

 

程序代码:

// RANSAC.cpp: 定义控制台应用程序的入口点。

#include "stdafx.h"

#include <pcl/ModelCoefficients.h>

#include <iostream>//标准C++库中的输入输出类相关头文件。

#include <pcl/io/pcd_io.h>

#include <pcl/io/io.h>

#include <pcl/io/ply_io.h>

#include <pcl/visualization/cloud_viewer.h>

#include <pcl/point_types.h>

#include <pcl/filters/extract_indices.h>

#include <pcl/filters/passthrough.h>

#include <pcl/features/normal_3d.h>

#include <pcl/sample_consensus/method_types.h>

#include <pcl/sample_consensus/model_types.h>

#include <pcl/segmentation/sac_segmentation.h>

using namespace std;

using namespace pcl;

typedef pcl::PointXYZ PointT;

void viewerOneOff(visualization::PCLVisualizer& viewer) {

       viewer.setBackgroundColor(0, 0, 0);   //设置背景颜色为黑色

}

int

main(int argc, char** argv)

{

       // All the objects needed

       pcl::PCDRe

### RANSAC算法在点云分割中的应用 RANSAC(Random Sample Consensus,随机抽样一致性)是一种鲁棒的估计模型参数的方法,在点云分割领域被广泛应用于平面拟合和其他几何结构提取的任务中。以下是关于其原理及其在点云分割中的具体实现方法。 #### 原理概述 RANSAC的核心思想是从数据集中随机选取最小数量的数据点来构建一个假设模型,并通过验证其余数据点对该模型的支持程度来评估该模型的有效性。对于点云分割而言,这一过程通常用于检测并分离出特定类型的几何形状(如平面)。这种方法能够有效应对噪声和离群点的影响[^1]。 #### 应用场景 在点云处理中,RANSAC常用来完成如下任务: - **平面分割**:识别点云中的平面区域,例如地面、墙面等。 - **多平面拟合**:连续多次运行RANSAC以逐步提取多个不同的平面。 - **其他几何体拟合**:除了平面外,还可以扩展到圆柱面、球面等多种几何形状的拟合[^3]。 #### 实现步骤详解 虽然不允许使用诸如“首先”这样的引导词,但仍可以通过描述各组成部分的方式呈现完整的流程: ##### 数据准备阶段 输入原始点云数据集作为初始集合P。此集合可能包含大量噪点以及目标对象之外的部分[^2]。 ##### 随机采样环节 从集合P中随机抽取一定数目的样本点构成候选子集S。这些点的数量取决于所期望拟合的具体几何形式;比如针对三维空间内的平面来说,则需至少三个不共线的点才能唯一确定之。 ##### 模型建立部分 利用上述选出的几个点计算得到初步假定下的数学表达式M——即待求解的目标函数方程式。例如当进行平面拟合操作时可采用一般式的表示法ax+by+cz+d=0的形式来进行表述。 ##### 支持度检验模块 遍历整个剩余未参与建模的所有点位q∈Q=P\S,判断它们距离当前估算出来的表面有多远。如果某个测试点满足预设阈值条件δ之内就被认为是内点i∈I⊆Q。最终统计所有符合条件的总数|I|作为衡量标准之一去评价此次迭代产生的结果质量如何。 ##### 结果优化循环 重复执行以上几步直至达到最大允许尝试次数或者找到具有足够高支持率的最佳匹配方案为止。每次更新过程中保留最优的一组参数组合以便最后输出使用。 ##### 后续处理工作 一旦成功定位到了首个显著特征之后就可以将其移除掉从而继续探索剩下的未知成分直到整体分解完毕结束整个程序运作流程。 ```python import numpy as np from sklearn.cluster import DBSCAN def ransac_plane_fitting(points, threshold=0.01, max_iterations=1000): best_inliers = None best_model = None for _ in range(max_iterations): sample_indices = np.random.choice(len(points), size=3, replace=False) sampled_points = points[sample_indices] # Fit plane model using the three selected points. vec_a = sampled_points[1] - sampled_points[0] vec_b = sampled_points[2] - sampled_points[0] cross_product = np.cross(vec_a, vec_b) normal_vector = cross_product / np.linalg.norm(cross_product) d = -np.dot(normal_vector, sampled_points[0]) current_model = (normal_vector[0], normal_vector[1], normal_vector[2], d) distances = abs(np.dot(points, normal_vector) + d) inlier_mask = distances < threshold if best_inliers is None or sum(inlier_mask) > len(best_inliers): best_inliers = inlier_mask best_model = current_model return best_model, best_inliers # Example usage with synthetic data generation omitted here due to space constraints. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值