Configuration de la bibliothèque de nuages de points PCL1.11.1 dans l'environnement Win10+VS2019 (super détaillé)
1. Téléchargez PCL1.11.1 depuis le site officiel
Recherchez les versions dans le github de la bibliothèque de nuages de points PCL. Adresse de téléchargement : https://github.com/PointCloudLibrary/pcl/releases
. Téléchargez ces trois fichiers. Le processus de téléchargement peut être lent. Il a été téléchargé ici et peut être téléchargé sur Baidu. Le disque réseau peut être extrait tout seul.
Lien : https://pan.baidu.com/s/1y1MkpTzp5F_2mtabRrYH9A
Code d'extraction : 1rh4
2. Installez PCL1.11.1
1. Ouvrez le fichier téléchargé « PCL-1.11.1-AllInOne-msvc2019-win64.exe »
(1) Sélectionnez le second, ajoutez automatiquement des variables d'environnement et créez un raccourci sur le bureau en bas.
Si le processus d'installation indique que la variable d'environnement ne peut pas être ajoutée, vous devez l'ajouter manuellement. La méthode d'ajout manuel sera présentée plus tard.
(2) Sélectionnez le répertoire d'installation et essayez de ne pas installer sur le lecteur C. Le chemin que j'ai défini ici est : H:\PCL\PCL 1.11.1
N'oubliez pas votre emplacement d'installation !
(3) Cliquez ensuite sur « Suivant » puis sur « Installer ».
[Remarque] : La fenêtre d'installation d'OpenNI2 apparaîtra pendant le processus d'installation. Installez OpenNI2 dans le fichier 3rdParty de PCL. La sélection du chemin est : H:\PCL\PCL 1.11.1\3rdParty\OpenNI2.
(4) Une fois l'installation terminée, le contenu du dossier PCL est le suivant :
Le contenu du dossier OpenNI2 est le suivant :
(5) Enfin, décompressez le contenu du fichier « pcl-1.11.1-pdb-msvc2019-win64.zip » et copiez-le dans le fichier « H:\PCL\PCL 1.11.1\bin ».
À ce stade, le processus d'installation se termine.
2. Configurez les variables d'environnement.
Si le processus d'installation affiche « Impossible d'ajouter des variables d'environnement car le chemin est trop long », vous devez ajouter les variables d'environnement manuellement.
Faites un clic droit sur cet ordinateur et sélectionnez « Propriétés », ouvrez « Paramètres système avancés » et sélectionnez « Variables d'environnement ».
(1) Comme on peut le voir dans les variables système, le répertoire racine de PCL et le répertoire d'OpenNI2 ont été ajoutés.
Sinon, ajoutez-le manuellement. Notez que le chemin est cohérent avec le chemin d'installation que vous avez défini.
(2) Double-cliquez ensuite sur "Chemin" dans les variables système et ajoutez le chemin suivant à la variable d'environnement. (Selon vos propres paramètres de chemin d'installation)
Le contenu supplémentaire spécifique est le suivant :
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%
Après avoir ajouté les variables d'environnement, redémarrez l'ordinateur.
3. Configurez l'environnement de développement dans VS2019
1. Créez un nouveau projet vide,
définissez le nom du projet et le chemin de stockage, puis cliquez sur « OK ».
(1) Après la création, sélectionnez Debug pour la configuration de la solution et x64 pour la plateforme de solution.
(2) Créez ensuite un nouveau fichier source .cpp dans le fichier source.
2. Définissez les propriétés.
Cliquez avec le bouton droit sur le projet et sélectionnez "Propriétés"
(1) Sélectionnez d'abord "Debug" pour la configuration et "x64" pour la plate-forme, puis sélectionnez Propriétés de configuration – Débogage – Environnement. Sélectionnez Modifier
dans l'environnement et ajoutez le contenu suivant.
Le contenu spécifique est le suivant :
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) Sélectionnez ensuite "Langue" en C++, remplacez "Conforme au modèle" par "Non",
continuez à sélectionner "Toutes les options" en C++, remplacez "SDL Check" par "Non"
(3) Sélectionnez "Property Manager" ” , faites un clic droit dans « Debug|x64 » et sélectionnez « Ajouter une nouvelle feuille de propriétés de projet ».
Nommez-le "PCL1.11.1" et sélectionnez l'emplacement de stockage, afin de pouvoir choisir directement de modifier les propriétés de la configuration de l'environnement à l'avenir.
Après l'ajout, double-cliquez pour ouvrir la page de propriétés et démarrer la configuration.
(4) Sélectionnez « Inclure le répertoire » dans le répertoire VC++, cliquez sur Modifier et ajoutez 7 contenus.
Le contenu spécifique est le suivant :
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) Sélectionnez "Répertoire de la bibliothèque" dans le répertoire VC++, cliquez sur Modifier et ajoutez 6 contenus.
Le contenu spécifique est le suivant :
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) Sélectionnez « Préprocesseur » en C/C++, sélectionnez « Définition du préprocesseur », cliquez sur Modifier et ajoutez du contenu.
Le contenu spécifique est le suivant :
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
(7) Remplacez « SDL Check » pour toutes les options en C/C++ par « Non ».
(8) Sélectionnez « Entrée » dans le connecteur, sélectionnez « Dépendances supplémentaires », cliquez sur Modifier et ajoutez du contenu.
Le contenu ajouté est le fichier lib dans le répertoire racine PCL (H:\PCL\PCL 1.11.1\lib) et le fichier lib dans PCL\3rdParty\VTK (H:\PCL\PCL 1.11.1\3rdParty\VTK\ lib) , le nom de fichier de la version de débogage a le suffixe "-gd".
Le contenu spécifique est le suivant :
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
À ce stade, toutes les propriétés ont été définies. Cliquez avec le bouton droit sur "PCL1.11.1" et cliquez sur "Enregistrer PCL1.11.1". De cette façon, lors de la création future d'un nouveau projet, vous pourrez sélectionner "Ajouter une table de propriétés existante" et ajoutez PCL1.11.1 directement sans le reconfigurer.
4. Tester le code
La configuration de l'environnement est terminée. Testons le code pour voir s'il réussit. Entrez le code dans "source.cpp".
le code s'affiche comme ci-dessous :
#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);
}
Le résultat est le suivant :