官方地址参考: 地址
环境配置参考: 地址
===========
首先要下载PCL的安装包: 地址
安装完包括OPENNI后就可以配置环境啦~
包含目录
C:\Program Files\PCL 1.8.1\include\pcl-1.8 C:\Program Files\PCL 1.8.1\3rdParty\Boost\include\boost-1_64 C:\Program Files\PCL 1.8.1\3rdParty\Eigen\eigen3 C:\Program Files\PCL 1.8.1\3rdParty\FLANN\include C:\Program Files\PCL 1.8.1\3rdParty\OpenNI2\OPENNI\Include C:\Program Files\PCL 1.8.1\3rdParty\Qhull\include C:\Program Files\PCL 1.8.1\3rdParty\VTK\include\vtk-8.0
库目录
C:\Program Files\PCL 1.8.1\lib C:\Program Files\PCL 1.8.1\3rdParty\Boost\lib C:\Program Files\PCL 1.8.1\3rdParty\FLANN\lib C:\Program Files\PCL 1.8.1\3rdParty\OpenNI2\OPENNI\Lib C:\Program Files\PCL 1.8.1\3rdParty\Qhull\lib C:\Program Files\PCL 1.8.1\3rdParty\VTK\lib
连接器-输入(debug模式)
vtknetcdf_c++-gd.lib pcl_common_debug.lib pcl_features_debug.lib pcl_filters_debug.lib pcl_io_ply_debug.lib pcl_io_debug.lib pcl_kdtree_debug.lib pcl_keypoints_debug.lib pcl_ml_debug.lib pcl_octree_debug.lib pcl_outofcore_debug.lib pcl_people_debug.lib pcl_recognition_debug.lib pcl_registration_debug.lib pcl_sample_consensus_debug.lib pcl_search_debug.lib pcl_segmentation_debug.lib pcl_stereo_debug.lib pcl_surface_debug.lib pcl_tracking_debug.lib pcl_visualization_debug.lib libboost_atomic-vc141-mt-gd-1_64.lib libboost_bzip2-vc141-mt-gd-1_64.lib libboost_chrono-vc141-mt-gd-1_64.lib libboost_container-vc141-mt-gd-1_64.lib libboost_context-vc141-mt-gd-1_64.lib libboost_coroutine-vc141-mt-gd-1_64.lib libboost_date_time-vc141-mt-gd-1_64.lib libboost_exception-vc141-mt-gd-1_64.lib libboost_fiber-vc141-mt-gd-1_64.lib libboost_filesystem-vc141-mt-gd-1_64.lib libboost_graph-vc141-mt-gd-1_64.lib libboost_graph_parallel-vc141-mt-gd-1_64.lib libboost_iostreams-vc141-mt-gd-1_64.lib libboost_locale-vc141-mt-gd-1_64.lib libboost_log-vc141-mt-gd-1_64.lib libboost_log_setup-vc141-mt-gd-1_64.lib libboost_math_c99-vc141-mt-gd-1_64.lib libboost_math_c99f-vc141-mt-gd-1_64.lib libboost_math_c99l-vc141-mt-gd-1_64.lib libboost_math_tr1-vc141-mt-gd-1_64.lib libboost_math_tr1f-vc141-mt-gd-1_64.lib libboost_math_tr1l-vc141-mt-gd-1_64.lib libboost_mpi-vc141-mt-gd-1_64.lib libboost_numpy3-vc141-mt-gd-1_64.lib libboost_numpy-vc141-mt-gd-1_64.lib libboost_prg_exec_monitor-vc141-mt-gd-1_64.lib libboost_program_options-vc141-mt-gd-1_64.lib libboost_python3-vc141-mt-gd-1_64.lib libboost_python-vc141-mt-gd-1_64.lib libboost_random-vc141-mt-gd-1_64.lib libboost_regex-vc141-mt-gd-1_64.lib libboost_serialization-vc141-mt-gd-1_64.lib libboost_signals-vc141-mt-gd-1_64.lib libboost_system-vc141-mt-gd-1_64.lib libboost_test_exec_monitor-vc141-mt-gd-1_64.lib libboost_thread-vc141-mt-gd-1_64.lib libboost_timer-vc141-mt-gd-1_64.lib libboost_type_erasure-vc141-mt-gd-1_64.lib libboost_unit_test_framework-vc141-mt-gd-1_64.lib libboost_wave-vc141-mt-gd-1_64.lib libboost_wserialization-vc141-mt-gd-1_64.lib libboost_zlib-vc141-mt-gd-1_64.lib flann-gd.lib flann_cpp-gd.lib flann_cpp_s-gd.lib flann_s-gd.lib qhull_d.lib qhullcpp_d.lib qhullstatic_d.lib qhullstatic_r_d.lib qhull_p_d.lib qhull_r_d.lib vtkalglib-8.0-gd.lib vtkChartsCore-8.0-gd.lib vtkCommonColor-8.0-gd.lib vtkCommonComputationalGeometry-8.0-gd.lib vtkCommonCore-8.0-gd.lib vtkCommonDataModel-8.0-gd.lib vtkCommonExecutionModel-8.0-gd.lib vtkCommonMath-8.0-gd.lib vtkCommonMisc-8.0-gd.lib vtkCommonSystem-8.0-gd.lib vtkCommonTransforms-8.0-gd.lib vtkDICOMParser-8.0-gd.lib vtkDomainsChemistry-8.0-gd.lib vtkexoIIc-8.0-gd.lib vtkexpat-8.0-gd.lib vtkFiltersAMR-8.0-gd.lib vtkFiltersCore-8.0-gd.lib vtkFiltersExtraction-8.0-gd.lib vtkFiltersFlowPaths-8.0-gd.lib vtkFiltersGeneral-8.0-gd.lib vtkFiltersGeneric-8.0-gd.lib vtkFiltersGeometry-8.0-gd.lib vtkFiltersHybrid-8.0-gd.lib vtkFiltersHyperTree-8.0-gd.lib vtkFiltersImaging-8.0-gd.lib vtkFiltersModeling-8.0-gd.lib vtkFiltersParallel-8.0-gd.lib vtkFiltersParallelImaging-8.0-gd.lib vtkFiltersPoints-8.0-gd.lib vtkFiltersProgrammable-8.0-gd.lib vtkFiltersSelection-8.0-gd.lib vtkFiltersSMP-8.0-gd.lib vtkFiltersSources-8.0-gd.lib vtkFiltersStatistics-8.0-gd.lib vtkFiltersTexture-8.0-gd.lib vtkFiltersTopology-8.0-gd.lib vtkFiltersVerdict-8.0-gd.lib vtkfreetype-8.0-gd.lib vtkGeovisCore-8.0-gd.lib vtkgl2ps-8.0-gd.lib vtkhdf5-8.0-gd.lib vtkhdf5_hl-8.0-gd.lib vtkImagingColor-8.0-gd.lib vtkImagingCore-8.0-gd.lib vtkImagingFourier-8.0-gd.lib vtkImagingGeneral-8.0-gd.lib vtkImagingHybrid-8.0-gd.lib vtkImagingMath-8.0-gd.lib vtkImagingMorphological-8.0-gd.lib vtkImagingSources-8.0-gd.lib vtkImagingStatistics-8.0-gd.lib vtkImagingStencil-8.0-gd.lib vtkInfovisCore-8.0-gd.lib vtkInfovisLayout-8.0-gd.lib vtkInteractionImage-8.0-gd.lib vtkInteractionStyle-8.0-gd.lib vtkInteractionWidgets-8.0-gd.lib vtkIOAMR-8.0-gd.lib vtkIOCore-8.0-gd.lib vtkIOEnSight-8.0-gd.lib vtkIOExodus-8.0-gd.lib vtkIOExport-8.0-gd.lib vtkIOExportOpenGL-8.0-gd.lib vtkIOGeometry-8.0-gd.lib vtkIOImage-8.0-gd.lib vtkIOImport-8.0-gd.lib vtkIOInfovis-8.0-gd.lib vtkIOLegacy-8.0-gd.lib vtkIOLSDyna-8.0-gd.lib vtkIOMINC-8.0-gd.lib vtkIOMovie-8.0-gd.lib vtkIONetCDF-8.0-gd.lib vtkIOParallel-8.0-gd.lib vtkIOParallelXML-8.0-gd.lib vtkIOPLY-8.0-gd.lib vtkIOSQL-8.0-gd.lib vtkIOTecplotTable-8.0-gd.lib vtkIOVideo-8.0-gd.lib vtkIOXML-8.0-gd.lib vtkIOXMLParser-8.0-gd.lib vtkjpeg-8.0-gd.lib vtkjsoncpp-8.0-gd.lib vtklibharu-8.0-gd.lib vtklibxml2-8.0-gd.lib vtklz4-8.0-gd.lib vtkmetaio-8.0-gd.lib vtkNetCDF-8.0-gd.lib vtkoggtheora-8.0-gd.lib vtkParallelCore-8.0-gd.lib vtkpng-8.0-gd.lib vtkproj4-8.0-gd.lib vtkRenderingAnnotation-8.0-gd.lib vtkRenderingContext2D-8.0-gd.lib vtkRenderingContextOpenGL-8.0-gd.lib vtkRenderingCore-8.0-gd.lib vtkRenderingFreeType-8.0-gd.lib vtkRenderingGL2PS-8.0-gd.lib vtkRenderingImage-8.0-gd.lib vtkRenderingLabel-8.0-gd.lib vtkRenderingLIC-8.0-gd.lib vtkRenderingLOD-8.0-gd.lib vtkRenderingOpenGL-8.0-gd.lib vtkRenderingVolume-8.0-gd.lib vtkRenderingVolumeOpenGL-8.0-gd.lib vtksqlite-8.0-gd.lib vtksys-8.0-gd.lib vtktiff-8.0-gd.lib vtkverdict-8.0-gd.lib vtkViewsContext2D-8.0-gd.lib vtkViewsCore-8.0-gd.lib vtkViewsInfovis-8.0-gd.lib vtkzlib-8.0-gd.lib opengl32.lib
SDL检查改为否
C/C++ - 预处理定义
_SCL_SECURE_NO_WARNINGS _CRT_SECURE_NO_WARNINGS如果报语法错误(为了兼容VC8的那三行,注释掉那三行源码即可)
官网的代码:
#include <iostream> #include <string> #include <pcl/io/ply_io.h> #include <pcl/point_types.h> #include <pcl/registration/icp.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/console/time.h> // TicToc typedef pcl::PointXYZ PointT; typedef pcl::PointCloud<PointT> PointCloudT; bool next_iteration = false; void print4x4Matrix(const Eigen::Matrix4d & matrix) { printf("Rotation matrix :\n"); printf(" | %6.3f %6.3f %6.3f | \n", matrix(0, 0), matrix(0, 1), matrix(0, 2)); printf("R = | %6.3f %6.3f %6.3f | \n", matrix(1, 0), matrix(1, 1), matrix(1, 2)); printf(" | %6.3f %6.3f %6.3f | \n", matrix(2, 0), matrix(2, 1), matrix(2, 2)); printf("Translation vector :\n"); printf("t = < %6.3f, %6.3f, %6.3f >\n\n", matrix(0, 3), matrix(1, 3), matrix(2, 3)); } void keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event, void* nothing) { if (event.getKeySym() == "space" && event.keyDown()) next_iteration = true; } int main(int argc, char* argv[]) { // The point clouds we will be using PointCloudT::Ptr cloud_in(new PointCloudT); // Original point cloud PointCloudT::Ptr cloud_tr(new PointCloudT); // Transformed point cloud PointCloudT::Ptr cloud_icp(new PointCloudT); // ICP output point cloud /* // Checking program arguments if (argc < 2) { printf("Usage :\n"); printf("\t\t%s file.ply number_of_ICP_iterations\n", argv[0]); PCL_ERROR("Provide one ply file.\n"); system("pause"); return (-1); }*/ int iterations = 20; // Default number of ICP iterations /* if (argc > 2) { // If the user passed the number of iteration as an argument iterations = atoi(argv[2]); if (iterations < 1) { PCL_ERROR("Number of initial iterations must be >= 1\n"); system("pause"); return (-1); } }*/ pcl::console::TicToc time; time.tic(); if (pcl::io::loadPLYFile("cat-2.ply", *cloud_in) < 0) { PCL_ERROR("Error loading cloud %s.\n", "dragon.ply"); system("pause"); return (-1); } std::cout << "\nLoaded file " << "dragon.ply" << " (" << cloud_in->size() << " points) in " << time.toc() << " ms\n" << std::endl; // Defining a rotation matrix and translation vector Eigen::Matrix4d transformation_matrix = Eigen::Matrix4d::Identity(); // A rotation matrix (see https://en.wikipedia.org/wiki/Rotation_matrix) double theta = M_PI / 8; // The angle of rotation in radians transformation_matrix(0, 0) = cos(theta); transformation_matrix(0, 1) = -sin(theta); transformation_matrix(1, 0) = sin(theta); transformation_matrix(1, 1) = cos(theta); // A translation on Z axis (0.4 meters) transformation_matrix(2, 3) = 0.4; // Display in terminal the transformation matrix std::cout << "Applying this rigid transformation to: cloud_in -> cloud_icp" << std::endl; print4x4Matrix(transformation_matrix); // Executing the transformation pcl::transformPointCloud(*cloud_in, *cloud_icp, transformation_matrix); *cloud_tr = *cloud_icp; // We backup cloud_icp into cloud_tr for later use // The Iterative Closest Point algorithm time.tic(); pcl::IterativeClosestPoint<PointT, PointT> icp; icp.setMaximumIterations(iterations); icp.setInputSource(cloud_icp); icp.setInputTarget(cloud_in); icp.align(*cloud_icp); icp.setMaximumIterations(1); // We set this variable to 1 for the next time we will call .align () function std::cout << "Applied " << iterations << " ICP iteration(s) in " << time.toc() << " ms" << std::endl; if (icp.hasConverged()) { std::cout << "\nICP has converged, score is " << icp.getFitnessScore() << std::endl; std::cout << "\nICP transformation " << iterations << " : cloud_icp -> cloud_in" << std::endl; transformation_matrix = icp.getFinalTransformation().cast<double>(); print4x4Matrix(transformation_matrix); } else { PCL_ERROR("\nICP has not converged.\n"); system("pause"); return (-1); } // Visualization pcl::visualization::PCLVisualizer viewer("ICP demo"); // Create two vertically separated viewports int v1(0); int v2(1); viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1); viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2); // The color we will be using float bckgr_gray_level = 0.0; // Black float txt_gray_lvl = 1.0 - bckgr_gray_level; // Original point cloud is white pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_in_color_h(cloud_in, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl); viewer.addPointCloud(cloud_in, cloud_in_color_h, "cloud_in_v1", v1); viewer.addPointCloud(cloud_in, cloud_in_color_h, "cloud_in_v2", v2); // Transformed point cloud is green pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_tr_color_h(cloud_tr, 20, 180, 20); viewer.addPointCloud(cloud_tr, cloud_tr_color_h, "cloud_tr_v1", v1); // ICP aligned point cloud is red pcl::visualization::PointCloudColorHandlerCustom<PointT> cloud_icp_color_h(cloud_icp, 180, 20, 20); viewer.addPointCloud(cloud_icp, cloud_icp_color_h, "cloud_icp_v2", v2); // Adding text descriptions in each viewport viewer.addText("White: Original point cloud\nGreen: Matrix transformed point cloud", 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_1", v1); viewer.addText("White: Original point cloud\nRed: ICP aligned point cloud", 10, 15, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "icp_info_2", v2); std::stringstream ss; ss << iterations; std::string iterations_cnt = "ICP iterations = " + ss.str(); viewer.addText(iterations_cnt, 10, 60, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "iterations_cnt", v2); // Set background color viewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v1); viewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v2); // Set camera position and orientation viewer.setCameraPosition(-3.68332, 2.94092, 5.71266, 0.289847, 0.921947, -0.256907, 0); viewer.setSize(1280, 1024); // Visualiser window size // Register keyboard callback : viewer.registerKeyboardCallback(&keyboardEventOccurred, (void*)NULL); // Display the visualiser while (!viewer.wasStopped()) { viewer.spinOnce(); // The user pressed "space" : if (next_iteration) { // The Iterative Closest Point algorithm time.tic(); icp.align(*cloud_icp); std::cout << "Applied 1 ICP iteration in " << time.toc() << " ms" << std::endl; if (icp.hasConverged()) { printf("\033[11A"); // Go up 11 lines in terminal output. printf("\nICP has converged, score is %+.0e\n", icp.getFitnessScore()); std::cout << "\nICP transformation " << ++iterations << " : cloud_icp -> cloud_in" << std::endl; transformation_matrix *= icp.getFinalTransformation().cast<double>(); // WARNING /!\ This is not accurate! For "educational" purpose only! print4x4Matrix(transformation_matrix); // Print the transformation between original pose and current pose ss.str(""); ss << iterations; std::string iterations_cnt = "ICP iterations = " + ss.str(); viewer.updateText(iterations_cnt, 10, 60, 16, txt_gray_lvl, txt_gray_lvl, txt_gray_lvl, "iterations_cnt"); viewer.updatePointCloud(cloud_icp, cloud_icp_color_h, "cloud_icp_v2"); } else { PCL_ERROR("\nICP has not converged.\n"); system("pause"); return (-1); } } next_iteration = false; } system("pause"); return (0); }
ply模型可以自己随便下个,233,我这里用的 地址 里的几个模型,还不错。
最后结果: