Configuración de la biblioteca de nube de puntos PCL1.11.1 en el entorno Win10+VS2019 (súper detallado)
1. Descargue PCL1.11.1 del sitio web oficial
Encuentre las versiones en el github de la biblioteca de nube de puntos PCL. Dirección de descarga: https://github.com/PointCloudLibrary/pcl/releases
. Descargue estos tres archivos. El proceso de descarga puede ser lento. Se ha descargado aquí y puede descargarse Descargado en Baidu, el disco de red se puede extraer por sí solo.
Enlace: https://pan.baidu.com/s/1y1MkpTzp5F_2mtabRrYH9A
Código de extracción: 1rh4
2. Instale PCL1.11.1
1. Abra el archivo "PCL-1.11.1-AllInOne-msvc2019-win64.exe" descargado
(1) Seleccione el segundo, agregue automáticamente variables de entorno y cree un acceso directo en el escritorio en la parte inferior.
Si el proceso de instalación indica que no se pueden agregar variables de entorno, debe agregarlas manualmente. El método de adición manual se presentará más adelante.
(2) Seleccione el directorio de instalación e intente no instalar en la unidad C. La ruta que establecí aquí es: H:\PCL\PCL 1.11.1
¡Asegúrese de recordar la ubicación de instalación!
(3) Luego haga clic en "Siguiente" y luego en "Instalar".
[Nota]: La ventana de instalación de OpenNI2 aparecerá durante el proceso de instalación. Instale OpenNI2 en el archivo de terceros de PCL. La ruta seleccionada es: H:\PCL\PCL 1.11.1\3rdParty\OpenNI2.
(4) Una vez completada la instalación, el contenido de la carpeta PCL es el siguiente:
El contenido de la carpeta OpenNI2 es el siguiente:
(5) Finalmente, descomprima el contenido del archivo "pcl-1.11.1-pdb-msvc2019-win64.zip" y cópielo en el archivo "H:\PCL\PCL 1.11.1\bin".
En este punto finaliza el proceso de instalación.
2. Configure las variables de entorno.Si
el proceso de instalación indica "No se pueden agregar variables de entorno porque la ruta es demasiado larga", debe agregar las variables de entorno manualmente.
Haga clic derecho en esta computadora y seleccione "Propiedades", abra "Configuración avanzada del sistema" y seleccione "Variables de entorno".
(1) Como se puede observar en las variables del sistema, se han agregado el directorio raíz de PCL y el directorio de OpenNI2.
De lo contrario, agréguelo manualmente y tenga en cuenta que la ruta es coherente con la ruta de instalación que configuró.
(2) Luego haga doble clic en "Ruta" en las variables del sistema y agregue la siguiente ruta a la variable de entorno. (Según su propia configuración de ruta de instalación)
El contenido adicional específico es el siguiente:
H:\PCL\PCL 1.11.1\bin
H:\PCL\PCL 1.11.1\3rdParty\FLANN\bin
H:\PCL\PCL 1.11.1\3rdParty\VTK\bin
H:\PCL\PCL 1.11.1\3rdParty\Qhull\bin
H:\PCL\PCL 1.11.1\3rdParty\OpenNI2\Tools
%OPENNI2_REDIST64%
%OPENNI2_LIB64%
%OPENNI2_INCLUDE64%
Después de agregar las variables de entorno, reinicie la computadora.
3. Configurar el entorno de desarrollo en VS2019
1. Cree un nuevo proyecto vacío,
establezca el nombre del proyecto y la ruta de almacenamiento y haga clic en "Aceptar".
(1) Después de la creación, seleccione Depurar para la configuración de la solución y x64 para la plataforma de la solución.
(2) Luego cree un nuevo archivo fuente .cpp en el archivo fuente.
2. Configure las propiedades.
Haga clic derecho en el proyecto y seleccione "Propiedades"
(1) Primero, seleccione "Depurar" para configuración y "x64" para plataforma, luego seleccione Propiedades de configuración – Depurar – Entorno. Seleccione Editar
en el entorno y agregue el siguiente contenido.
Los contenidos específicos son los siguientes:
H:\PCL\PCL 1.11.1\bin;
H:\PCL\PCL 1.11.1\3rdParty\FLANN\bin;
H:\PCL\PCL 1.11.1\3rdParty\VTK\bin;
H:\PCL\PCL 1.11.1\3rdParty\OpenNI2\Tools
(2) Luego seleccione "Idioma" en C++, cambie "Conforme al patrón" a "No",
continúe seleccionando "Todas las opciones" en C++, cambie "SDL Check" a "No"
(3) Seleccione "Administrador de propiedades" " , haga clic derecho en "Debug|x64" y seleccione "Agregar nueva hoja de propiedades del proyecto".
Nómbrelo "PCL1.11.1" y seleccione la ubicación de almacenamiento, para que pueda elegir directamente cambiar las propiedades para la configuración del entorno en el futuro.
Después de agregar, haga doble clic para abrir la página de propiedades e iniciar la configuración.
(4) Seleccione "Incluir directorio" en el directorio VC++, haga clic en Editar y agregue 7 contenidos.
Los contenidos específicos son los siguientes:
H:\PCL\PCL 1.11.1\include\pcl-1.11
H:\PCL\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
H:\PCL\PCL 1.11.1\3rdParty\Eigen\eigen3
H:\PCL\PCL 1.11.1\3rdParty\FLANN\include
H:\PCL\PCL 1.11.1\3rdParty\OpenNI2\Include
H:\PCL\PCL 1.11.1\3rdParty\Qhull\include
H:\PCL\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2
(5) Seleccione "Directorio de biblioteca" en el directorio VC++, haga clic en Editar y agregue 6 contenidos.
Los contenidos específicos son los siguientes:
H:\PCL\PCL 1.11.1\lib
H:\PCL\PCL 1.11.1\3rdParty\Boost\lib
H:\PCL\PCL 1.11.1\3rdParty\FLANN\lib
H:\PCL\PCL 1.11.1\3rdParty\OpenNI2\Lib
H:\PCL\PCL 1.11.1\3rdParty\Qhull\lib
H:\PCL\PCL 1.11.1\3rdParty\VTK\lib
(6) Seleccione "Preprocesador" en C/C++, seleccione "Definición de preprocesador", haga clic en Editar y agregue contenido.
Los contenidos específicos son los siguientes:
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
(7) Cambie "SDL Check" para todas las opciones en C/C++ a "No".
(8) Seleccione "Entrada" en el conector, seleccione "Dependencias adicionales", haga clic en Editar y agregue contenido.
El contenido agregado es el archivo lib en el directorio raíz PCL (H:\PCL\PCL 1.11.1\lib) y el archivo lib en PCL\3rdParty\VTK (H:\PCL\PCL 1.11.1\3rdParty\VTK\ lib), el nombre de archivo de la versión de depuración tiene el sufijo "-gd".
Los contenidos específicos son los siguientes:
pcl_commond.lib
pcl_featuresd.lib
pcl_filtersd.lib
pcl_iod.lib
pcl_io_plyd.lib
pcl_kdtreed.lib
pcl_keypointsd.lib
pcl_mld.lib
pcl_octreed.lib
pcl_outofcored.lib
pcl_peopled.lib
pcl_recognitiond.lib
pcl_registrationd.lib
pcl_sample_consensusd.lib
pcl_searchd.lib
pcl_segmentationd.lib
pcl_stereod.lib
pcl_surfaced.lib
pcl_trackingd.lib
pcl_visualizationd.lib
vtkChartsCore-8.2-gd.lib
vtkCommonColor-8.2-gd.lib
vtkCommonComputationalGeometry-8.2-gd.lib
vtkCommonCore-8.2-gd.lib
vtkCommonDataModel-8.2-gd.lib
vtkCommonExecutionModel-8.2-gd.lib
vtkCommonMath-8.2-gd.lib
vtkCommonMisc-8.2-gd.lib
vtkCommonSystem-8.2-gd.lib
vtkCommonTransforms-8.2-gd.lib
vtkDICOMParser-8.2-gd.lib
vtkDomainsChemistry-8.2-gd.lib
vtkDomainsChemistryOpenGL2-8.2-gd.lib
vtkdoubleconversion-8.2-gd.lib
vtkexodusII-8.2-gd.lib
vtkexpat-8.2-gd.lib
vtkFiltersAMR-8.2-gd.lib
vtkFiltersCore-8.2-gd.lib
vtkFiltersExtraction-8.2-gd.lib
vtkFiltersFlowPaths-8.2-gd.lib
vtkFiltersGeneral-8.2-gd.lib
vtkFiltersGeneric-8.2-gd.lib
vtkFiltersGeometry-8.2-gd.lib
vtkFiltersHybrid-8.2-gd.lib
vtkFiltersHyperTree-8.2-gd.lib
vtkFiltersImaging-8.2-gd.lib
vtkFiltersModeling-8.2-gd.lib
vtkFiltersParallel-8.2-gd.lib
vtkFiltersParallelImaging-8.2-gd.lib
vtkFiltersPoints-8.2-gd.lib
vtkFiltersProgrammable-8.2-gd.lib
vtkFiltersSelection-8.2-gd.lib
vtkFiltersSMP-8.2-gd.lib
vtkFiltersSources-8.2-gd.lib
vtkFiltersStatistics-8.2-gd.lib
vtkFiltersTexture-8.2-gd.lib
vtkFiltersTopology-8.2-gd.lib
vtkFiltersVerdict-8.2-gd.lib
vtkfreetype-8.2-gd.lib
vtkGeovisCore-8.2-gd.lib
vtkgl2ps-8.2-gd.lib
vtkglew-8.2-gd.lib
vtkGUISupportMFC-8.2-gd.lib
vtkhdf5-8.2-gd.lib
vtkhdf5_hl-8.2-gd.lib
vtkImagingColor-8.2-gd.lib
vtkImagingCore-8.2-gd.lib
vtkImagingFourier-8.2-gd.lib
vtkImagingGeneral-8.2-gd.lib
vtkImagingHybrid-8.2-gd.lib
vtkImagingMath-8.2-gd.lib
vtkImagingMorphological-8.2-gd.lib
vtkImagingSources-8.2-gd.lib
vtkImagingStatistics-8.2-gd.lib
vtkImagingStencil-8.2-gd.lib
vtkInfovisCore-8.2-gd.lib
vtkInfovisLayout-8.2-gd.lib
vtkInteractionImage-8.2-gd.lib
vtkInteractionStyle-8.2-gd.lib
vtkInteractionWidgets-8.2-gd.lib
vtkIOAMR-8.2-gd.lib
vtkIOAsynchronous-8.2-gd.lib
vtkIOCityGML-8.2-gd.lib
vtkIOCore-8.2-gd.lib
vtkIOEnSight-8.2-gd.lib
vtkIOExodus-8.2-gd.lib
vtkIOExport-8.2-gd.lib
vtkIOExportOpenGL2-8.2-gd.lib
vtkIOExportPDF-8.2-gd.lib
vtkIOGeometry-8.2-gd.lib
vtkIOImage-8.2-gd.lib
vtkIOImport-8.2-gd.lib
vtkIOInfovis-8.2-gd.lib
vtkIOLegacy-8.2-gd.lib
vtkIOLSDyna-8.2-gd.lib
vtkIOMINC-8.2-gd.lib
vtkIOMovie-8.2-gd.lib
vtkIONetCDF-8.2-gd.lib
vtkIOParallel-8.2-gd.lib
vtkIOParallelXML-8.2-gd.lib
vtkIOPLY-8.2-gd.lib
vtkIOSegY-8.2-gd.lib
vtkIOSQL-8.2-gd.lib
vtkIOTecplotTable-8.2-gd.lib
vtkIOVeraOut-8.2-gd.lib
vtkIOVideo-8.2-gd.lib
vtkIOXML-8.2-gd.lib
vtkIOXMLParser-8.2-gd.lib
vtkjpeg-8.2-gd.lib
vtkjsoncpp-8.2-gd.lib
vtklibharu-8.2-gd.lib
vtklibxml2-8.2-gd.lib
vtklz4-8.2-gd.lib
vtklzma-8.2-gd.lib
vtkmetaio-8.2-gd.lib
vtkNetCDF-8.2-gd.lib
vtkogg-8.2-gd.lib
vtkParallelCore-8.2-gd.lib
vtkpng-8.2-gd.lib
vtkproj-8.2-gd.lib
vtkpugixml-8.2-gd.lib
vtkRenderingAnnotation-8.2-gd.lib
vtkRenderingContext2D-8.2-gd.lib
vtkRenderingContextOpenGL2-8.2-gd.lib
vtkRenderingCore-8.2-gd.lib
vtkRenderingExternal-8.2-gd.lib
vtkRenderingFreeType-8.2-gd.lib
vtkRenderingGL2PSOpenGL2-8.2-gd.lib
vtkRenderingImage-8.2-gd.lib
vtkRenderingLabel-8.2-gd.lib
vtkRenderingLOD-8.2-gd.lib
vtkRenderingOpenGL2-8.2-gd.lib
vtkRenderingVolume-8.2-gd.lib
vtkRenderingVolumeOpenGL2-8.2-gd.lib
vtksqlite-8.2-gd.lib
vtksys-8.2-gd.lib
vtktheora-8.2-gd.lib
vtktiff-8.2-gd.lib
vtkverdict-8.2-gd.lib
vtkViewsContext2D-8.2-gd.lib
vtkViewsCore-8.2-gd.lib
vtkViewsInfovis-8.2-gd.lib
vtkzlib-8.2-gd.lib
En este punto, se han configurado todas las propiedades. Haga clic derecho en "PCL1.11.1" y haga clic en "Guardar PCL1.11.1". De esta manera, cuando cree un nuevo proyecto en el futuro, puede seleccionar "Agregar tabla de propiedades existente" y agregue PCL1.11.1 directamente sin reconfigurarlo.
4. Código de prueba
La configuración del entorno se ha completado, probemos el código para ver si tiene éxito. Ingrese el código en "source.cpp".
El código se muestra a continuación:
#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int
main(int argc, char** argv)
{
srand((unsigned int)time(NULL));
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 创建点云数据
cloud->width = 1000;
cloud->height = 1;
cloud->points.resize(cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size(); ++i)
{
cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
}
pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(0.1);
octree.setInputCloud(cloud);
octree.addPointsFromInputCloud();
pcl::PointXYZ searchPoint;
searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f);
searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f);
searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f);
//半径内近邻搜索
vector<int>pointIdxRadiusSearch;
vector<float>pointRadiusSquaredDistance;
float radius = 256.0f * rand() / (RAND_MAX + 1.0f);
cout << "Neighbors within radius search at (" << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z
<< ") with radius=" << radius << endl;
if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
cout << " " << cloud->points[pointIdxRadiusSearch[i]].x
<< " " << cloud->points[pointIdxRadiusSearch[i]].y
<< " " << cloud->points[pointIdxRadiusSearch[i]].z
<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << endl;
}
// 初始化点云可视化对象
boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("显示点云"));
viewer->setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
// 对点云着色可视化 (red).
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(cloud, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZ>(cloud, target_color, "target cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target cloud");
// 等待直到可视化窗口关闭
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
return (0);
}
El resultado es el siguiente: