Enciclopedia de filtros PCL, Principio + Ejemplo de código + Pasos de operación

Resumen de Filtrado de PCl

1. Paso de filtro directo

Principio: filtre una dimensión específica y elimine los datos de la nube de puntos fuera del campo o rango especificado por el usuario.

El archivo de cabecera es:

#include<pcl/filters/passthrough.h>

Ejemplo de código de filtro:

	// Create the filtering object
	pcl::PassThrough<pcl::PointXYZ> pass; // 声明直通滤波
	pass.setInputCloud(cloud); 			// 传入点云数据
	pass.setFilterFieldName("z"); 		// 设置操作的坐标轴
	pass.setFilterLimits(0.0, 3.0); 	// 设置坐标范围
	pass.setFilterLimitsNegative(true); // 保留数据函数
	pass.filter(*cloud_filtered);  		// 进行滤波输出

*Cabe señalar que un filtro único solo puede filtrar la nube de puntos en la dirección de un eje de coordenadas;*

Explicado de la siguiente manera:

pass.setFilterFieldName(“z”); // Establecer el eje de coordenadas de la operación
pass.setFilterLimits(0.0, 3.0); // Establecer el rango de coordenadas

Indica que solo se operan los datos de la nube de puntos del eje Z, y la nube de puntos dentro del rango de 0~3 se guarda o descarta

pass.setFilterLimitsNegative(true);//retiene la función de datos

Falso significa guardar los datos de la nube de puntos dentro del rango, verdadero es lo contrario

Pasos para el uso:

1、创建待处理点云对象,以及存储点云处理完成后的点云对象。
2、设置点云的容量:宽+高+长×宽;
3、设置点云内所有点的xyz坐标;
4、创建PassThroughFilter对象,并设置其滤波参数。
5、将待处理点云对象作为filter的输入进行滤波;
6、得到结果:在filter对象设置的x,y,z的范围之内的点将被保留,范围之外的点将被舍弃,实现直通滤波的功能

inserte la descripción de la imagen aquí

2. Filtro de vóxeles voxelGrid

Principio: [Reducción de muestreo] Reduzca el número de nubes de puntos en el conjunto de datos de nubes de puntos. Crea una cuadrícula de vóxeles 3D (colección de diminutos cubos 3D espaciales) a partir de datos de nubes de puntos, con cada centro de gravedad de vóxeles reemplazando aproximadamente a los otros puntos en el vóxel. Este método es más lento que aproximar el centro del vóxel, pero es una representación más precisa de la superficie correspondiente al punto de muestra.

El archivo de cabecera es:

#include <pcl/filters/voxel_grid.h>

Ejemplo de código de filtro:

cout << "->正在体素下采样..." << endl;
	pcl::VoxelGrid<pcl::PointXYZ> vg;		//创建滤波器对象
	vg.setInputCloud(cloud);				//设置待滤波点云
	vg.setLeafSize(0.05f, 0.05f, 0.05f);	//设置体素大小
	vg.filter(*cloud_filtered);	 //执行滤波,保存滤波结果于cloud_filtered

Pasos para el uso:

Leer en nube de puntos → crear objeto de filtro → establecer tamaño de vóxel → realizar filtrado → guardar nube de puntos filtrada

inserte la descripción de la imagen aquí

3. Muestreo Uniforme

Principio: Cree una cuadrícula de vóxeles tridimensional para los datos de la nube de puntos y luego reserve un punto más cercano al centro del vóxel en cada vóxel para reemplazar todos los puntos del vóxel.

El archivo de cabecera es:

#include <pcl/keypoints/uniform_sampling.h>

Ejemplo de código de filtro:

	cout << "->正在均匀采样..." << endl;
	pcl::UniformSampling<pcl::PointXYZ> us;	//创建滤波器对象
	us.setInputCloud(cloud);				//设置待滤波点云
	us.setRadiusSearch(0.05f);				//设置滤波球体半径
	us.filter(*cloud_filtered);		//执行滤波,保存滤波结果于cloud_filtered

Pasos para el uso:

Leer en nube de puntos → crear objeto de filtro → establecer radio de esfera de filtro → realizar filtrado → guardar nube de puntos filtrada

4. Filtro estadístico estadísticoOutlierRemoval

Principio: Realice un análisis estadístico en la vecindad de cada punto y filtre algunos puntos atípicos que no cumplan con los requisitos en función de las características de distribución de distancia desde el punto hasta todos los puntos vecinos. El algoritmo itera sobre toda la entrada dos veces: en la primera iteración, calcula la distancia promedio de cada punto a los k vecinos más cercanos, y los resultados obtenidos siguen una distribución gaussiana. A continuación, calcule la media μ y la desviación estándar σ de todas estas distancias para determinar el umbral de distancia thresh_d, donde thresh_d = μ ± k·σ. k es el multiplicador de desviación estándar. En la siguiente iteración, los puntos se clasifican como inliers o outliers si su distancia de vecindad promedio está por debajo o por encima de este umbral, respectivamente.

El archivo de cabecera es:

#include <pcl/filters/statistical_outlier_removal.h>

Ejemplo de código de filtro:

cout << "->正在进行统计滤波..." << endl;
	pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;	//创建滤波器对象
	sor.setInputCloud(cloud);				//设置待滤波点云
	sor.setMeanK(50);						//设置查询点近邻点的个数
	sor.setStddevMulThresh(1.0);			//设置标准差乘数,来计算是否为离群点的阈值
	//sor.setNegative(true);				//默认false,保存内点;true,保存滤掉的离群点
	sor.filter(*cloud_filtered);	//执行滤波,保存滤波结果于cloud_filtered

Pasos para el uso:

Leer en nube de puntos → crear objeto de filtro → establecer umbral de punto atípico → realizar filtrado estadístico → guardar nube de puntos filtrada

inserte la descripción de la imagen aquí

5. Eliminación de RadiusOutlier

Principio: Toda la entrada se itera una vez, y para cada punto se realiza la búsqueda de vecindad del radio R. Si el número de puntos de vecindad es inferior a cierto umbral, el punto se considerará como un punto de ruido y se eliminará.

El archivo de cabecera es:

#include <pcl/filters/radius_outlier_removal.h>

Ejemplo de código de filtro:

	cout << "->正在进行半径滤波..." << endl;
	pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror;	//创建滤波器对象
	ror.setInputCloud(cloud);						//设置待滤波点云
	ror.setRadiusSearch(0.02);						//设置查询点的半径范围
	ror.setMinNeighborsInRadius(5);	//设置判断是否为离群点的阈值,即半径内至少包括的点数
	//ror.setNegative(true);	//默认false,保存内点;true,保存滤掉的外点
	ror.filter(*cloud_filtered);	//执行滤波,保存滤波结果于cloud_filtered

Pasos para el uso:

Leer en la nube de puntos → crear un objeto de filtro de radio → establecer el umbral de valores atípicos → realizar reducción de muestreo → guardar el resultado de muestreo
Ningún efecto de punto discreto no es obvio
6, condición de filtro de condición Eliminación

Filtre datos de nubes de puntos que cumplan con ciertos criterios. Hay dos tipos de condiciones:

[1] ConditionAnd: Se deben cumplir todas las condiciones

[2] ConditionOr:
se pueden configurar uno o más objetos de condición y se puede agregar un operador de comparación a los objetos de condición. El operador de comparación condicional consta de tres elementos:

[1] Nombre: corresponde al nombre del campo XYZ de la nube de puntos, el espacio de color RGB, el componente de color en el espacio de color HSI, etc.

[2] Operadores de comparación: GT, GE, LT, LE, EQ

[3] Valor: el valor del nombre a comparar

Lista de operadores de comparación:

operador significado
GT mas grande que
GE mayor o igual mayor o igual
LT menos que menos que
EL menor o igual menor o igual
ecualizador igual es igual a

El archivo de cabecera es:

#include <pcl/filters/conditional_removal.h>

El código de filtrado es:

cout << "->正在进行条件滤波..." << endl;
	/*创建条件限定下的滤波器*/
	pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());//创建条件定义对象range_cond
	//为条件定义对象添加比较算子
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new
pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::GT, -0.1)));//添加在x字段上大于 -0.1 的比较算子
	range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new
		pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::LT, 1.0)));//添加在x字段上小于 1.0 的比较算子
	pcl::ConditionalRemoval<pcl::PointXYZ> cr;	//创建滤波器对象
	cr.setCondition(range_cond);				//用条件定义对象初始化
	cr.setInputCloud(cloud);					//设置待滤波点云
	//cr.setKeepOrganized(true);				//设置保持点云的结构
	//cr.setUserFilterValue(5);					//将过滤掉的点用(5,5,5)代替
	cr.filter(*cloud_filtered);					//执行滤波,保存滤波结果于cloud_filtered

setKeepOrganized(true) explica:

Mantenga la estructura de la nube de puntos, es decir, la nube de puntos ordenada aún puede mantener el orden después del filtrado. *

* setKeepOrganized es falso por defecto, es decir, los puntos filtrados se eliminan directamente, lo que puede cambiar la estructura organizativa de la nube de puntos. es_denso: 1

Si se establece en verdadero y luego se establece un valor específico a través de setuserFilterValue, los puntos filtrados se reemplazarán por este valor; si no se establece setuserFilterValue, los puntos filtrados se rellenarán con nan de forma predeterminada. es_denso: 0;

Pasos para el uso:

Lea en la nube de puntos → cree un objeto de condición → agregue un operador de comparación → cree un objeto de filtro bajo las condiciones → realice el filtrado → guarde el resultado del filtrado

inserte la descripción de la imagen aquí
7. Extracción de índices extractIndices

Principio: Extraiga un subconjunto de nube de puntos correspondiente a un conjunto de índices de la nube de puntos original, siempre que se obtenga el conjunto de índices de nube de puntos.

El archivo de cabecera es:

#include <pcl/filters/extract_indices.h>

Ejemplo de código de filtro:

cout << "->正在进行点云平面子集提取..." << endl;
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());	//创建分割时所需要的模型系数对象coefficients
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices());				//创建存储内点的点索引集合对象inliers
	pcl::SACSegmentation<pcl::PointXYZ> seg;								//创建分割对象
	seg.setOptimizeCoefficients(true);										//可选,对估计的模型参数进行优化处理
	seg.setModelType(pcl::SACMODEL_PLANE);									//设置分割模型类别
	seg.setMethodType(pcl::SAC_RANSAC);										//设置随即参数估计方法
	seg.setMaxIterations(1000);												//设置最大迭代次数
	seg.setDistanceThreshold(0.01);											//设置判断是否为模型内点的距离阈值
		/*平面点云提取*/
	///从点云中分割最大平面组成部分
	seg.setInputCloud(cloud);//设置输入点云,待分割
	seg.segment(*inliers, *coefficients);//引发分割实现:存储分割结果到点集合inliers;存储平面模型系数coefficients
	
	pcl::ExtractIndices<pcl::PointXYZ> extract;	//创建点云提取对象
	extract.setInputCloud(cloud);				//设置输入点云
	extract.setIndices(inliers);				//设置分割后的内点inliers为需要提取的点集
	extract.setNegative(false);					//设置提取内点而非外点,默认false
	extract.filter(*cloud_filtered);			//提取点集并存储到 cloud_filtered

Pasos para el uso:

Leer en la nube de puntos→Segmentación del plano para obtener el conjunto de índices→Crear objeto de extracción de índice de nube de puntos→Ejecutar extracción de índice→Guardar la nube de puntos extraída

inserte la descripción de la imagen aquí
8. Filtro de proyección projectInliers

Principio: Proyecte el punto sobre un modelo paramétrico, que puede ser un plano, una esfera, un cilindro, un cono, etc. para filtrar la proyección.

El archivo de cabecera es:

#include <pcl/filters/project_inliers.h>

Ejemplo de código de filtro:

	cout << "->正在平面模型投影..." << endl;
	//创建 Ax+By+Cz=0 平面
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
	coefficients->values.resize(4);	//设置模型系数的大小
	coefficients->values[0] = 1.0;	//x系数
	coefficients->values[1] = 1.0;	//y系数
	coefficients->values[2] = 1.0;	//z系数
	coefficients->values[3] = 0.0;	//常数项
	//投影滤波
	pcl::ProjectInliers<pcl::PointXYZ> proj;//创建投影滤波器对象
	proj.setModelType(pcl::SACMODEL_PLANE);	//设置对象对应的投影模型
	proj.setInputCloud(cloud);				//设置输入点云
	proj.setModelCoefficients(coefficients);//设置模型对应的系数
	proj.filter(*cloud_projected);			//执行投影滤波,存储结果于cloud_projected

modelo de proyección:

  • Modelo de avión: SACMODEL_PLANE
  • Modelo de línea: SACMODEL_LINE
  • Círculo 2D en el plano: SACMODEL_CIRCLE2 D
  • Círculo 3D en el plano: SACMODEL_CIRCLE3D
  • Modelo de esfera: SACMODEL_SPHERE
  • Modelo cilíndrico: SACMODEL_CYLINDER
  • Modelo de cono: SACMODEL_CONE
  • Modelo toroide: SACMODEL_TORUS
  • Un modelo de línea paralela al eje dado: SACMODEL_PARALLEL_LINE
  • Modelo de plano perpendicular al eje especificado: SACMODEL_PERPENDICULAR_PLANE
  • Modelo de segmentación de palo 3D: SACMODEL_STICK

Pasos para el uso:

Leer en la nube de puntos → crear un modelo paramétrico → establecer los coeficientes del modelo → realizar filtrado de proyección → guardar la nube de puntos proyectada

inserte la descripción de la imagen aquí

9. Filtro de modelo modelOutlierRemoval

Principio: De acuerdo con la distancia desde el punto hasta el modelo, configure el umbral de distancia para filtrar los puntos que no son del modelo.

El archivo de cabecera es:

#include <pcl/filters/model_outlier_removal.h>

Ejemplo de código de filtro:

	cout << "->正在模型滤波..." << endl;
	//设置模型系数
	pcl::ModelCoefficients model_coeff;
	model_coeff.values.resize(4);
	model_coeff.values[0] = 1.0;
	model_coeff.values[1] = 1.0;
	model_coeff.values[2] = 1.0;
	model_coeff.values[3] = 0.0;
	///模型滤波
	pcl::ModelOutlierRemoval<pcl::PointXYZ> filter;	//创建模型滤波器对象
	filter.setModelCoefficients(model_coeff);		//为模型对象添加模型系数
	filter.setThreshold(0.1);						//设置判断是否为模型内点的阈值
	filter.setModelType(pcl::SACMODEL_PLANE);		//设置模型类别
	filter.setInputCloud(cloud);					//输入待滤波点云
	filter.setNegative(false);						//默认false,提取模型内点;true,提取模型外点
	filter.filter(*cloud_filtered);					//执行模型滤波,保存滤波结果于cloud_filtered

Pasos para el uso:

Leer en nube de puntos → establecer coeficientes de modelo → crear objeto de filtro de modelo → realizar filtrado de modelo → guardar resultados de filtrado
inserte la descripción de la imagen aquí
10, filtrado bilateral BilateralFilter

Principio: class pcl::BilateralFilter< PointT > Class BilateralFilter es la implementación del algoritmo de filtrado bilateral en la nube de puntos. La implementación de esta clase no usa los datos del campo XYZ, pero usa los datos de intensidad para implementar el algoritmo de filtrado bilateral, por lo tanto, al usar esta clase, el tipo de nube de puntos debe tener un campo de intensidad; de lo contrario, no se puede realizar el filtrado bilateral (por lo tanto, al usar esta función, debe prestar atención al formato de datos de su nube de puntos de entrada, que debe incluir el información de intensidad de la nube de puntos).

El archivo de cabecera es:

#include <pcl/filters/bilateral.h>

Ejemplo de código de filtro:

pcl::search::KdTree<pcl::PointXYZI>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZI>);
	pcl::BilateralFilter<pcl::PointXYZI> bf;
	bf.setInputCloud(cloud);
	bf.setSearchMethod(tree);
	bf.setHalfSize(0.1);	// 设置高斯双边滤波窗口的一半大小,即搜索半径。
	bf.setStdDev(0.03);		// 设置标准差参数
	bf.filter(*outcloud);

Supongo que te gusta

Origin blog.csdn.net/weixin_43925768/article/details/129183368
Recomendado
Clasificación