修改之后的3rdparty目录结构:
D:\VS_workspace\PCL_cmakeProj>tree.exe -L 3
.
|-- 3rdparty
| |-- BOOST-1.78
| | |-- bin
| | |-- include
| | `-- lib
| |-- Boost
| | |-- include
| | `-- lib
| |-- Eigen
| | `-- eigen3
| |-- FLANN
| | |-- bin
| | |-- include
| | `-- lib
| |-- OpenNI2
| | |-- Redist
| | |-- include
| | `-- lib
| |-- PCL-1.12.1
| | |-- bin
| | |-- include
| | `-- lib
| |-- Qhull
| | |-- bin
| | |-- include
| | |-- lib
| | `-- share
| `-- VTK
| |-- bin
| |-- include
| `-- lib
|-- CMakeLists.txt
|-- CMakeSettings.json
|-- PCL_Demo
| |-- inc
| |-- src
| `-- unit_test
| `-- main.cpp
|-- README.txt
`-- out
`-- build
`-- x64-Release
38 directories, 4 files
其中BOOST-1.78是新的,Boost是PCL自带的,在CMakeLists.txt中注释掉了。CMakeLists.txt:
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.10)
project ("PCL_CMAKE_PROJECT" LANGUAGES CXX CUDA)
add_definitions(-DBOOST_USE_WINDOWS_H -DBOOST_ALL_NO_LIB -DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE)
SET(3RDPARTY_ROOT ./3rdparty)
SET(PCL_Demo_ROOT ./PCL_Demo)
SET(INC_DIR
${3RDPARTY_ROOT}/Boost/include/boost-1_78 # PCL自带的Boost
#${3RDPARTY_ROOT}/BOOST-1.78/include # 从下载的exe文件中提取出的BOOST库
${3RDPARTY_ROOT}/Eigen/eigen3
${3RDPARTY_ROOT}/FLANN/include
${3RDPARTY_ROOT}/OpenNI2/include
${3RDPARTY_ROOT}/PCL-1.12.1/include/pcl-1.12
${3RDPARTY_ROOT}/Qhull/include
${3RDPARTY_ROOT}/VTK/include/vtk-9.1
)
SET(LIB_DIR
#${3RDPARTY_ROOT}/Boost/lib # PCL自带的Boost,使用静态库链接,不需要${3RDPARTY_ROOT}/Boost/lib
#${3RDPARTY_ROOT}/BOOST-1.78/lib # 从下载的exe文件中提取出的BOOST库
${3RDPARTY_ROOT}/FLANN/lib
${3RDPARTY_ROOT}/OpenNI2/lib
${3RDPARTY_ROOT}/PCL-1.12.1/lib
${3RDPARTY_ROOT}/Qhull/lib
${3RDPARTY_ROOT}/VTK/lib
)
# 设置(使用)boost静态库
SET(BOOST_STATIC_LIBS
libboost_atomic-vc142-mt-x64-1_78.lib
libboost_bzip2-vc142-mt-x64-1_78.lib
libboost_chrono-vc142-mt-x64-1_78.lib
libboost_container-vc142-mt-x64-1_78.lib
libboost_context-vc142-mt-x64-1_78.lib
libboost_contract-vc142-mt-x64-1_78.lib
libboost_coroutine-vc142-mt-x64-1_78.lib
libboost_date_time-vc142-mt-x64-1_78.lib
libboost_exception-vc142-mt-x64-1_78.lib
libboost_filesystem-vc142-mt-x64-1_78.lib
libboost_graph_parallel-vc142-mt-x64-1_78.lib
libboost_graph-vc142-mt-x64-1_78.lib
libboost_iostreams-vc142-mt-x64-1_78.lib
libboost_json-vc142-mt-x64-1_78.lib
libboost_locale-vc142-mt-x64-1_78.lib
libboost_log_setup-vc142-mt-x64-1_78.lib
libboost_log-vc142-mt-x64-1_78.lib
libboost_math_c99f-vc142-mt-x64-1_78.lib
libboost_math_c99l-vc142-mt-x64-1_78.lib
libboost_math_c99-vc142-mt-x64-1_78.lib
libboost_math_tr1f-vc142-mt-x64-1_78.lib
libboost_math_tr1l-vc142-mt-x64-1_78.lib
libboost_math_tr1-vc142-mt-x64-1_78.lib
libboost_mpi-vc142-mt-x64-1_78.lib
libboost_nowide-vc142-mt-x64-1_78.lib
libboost_numpy38-vc142-mt-x64-1_78.lib
libboost_prg_exec_monitor-vc142-mt-x64-1_78.lib
libboost_program_options-vc142-mt-x64-1_78.lib
libboost_python38-vc142-mt-x64-1_78.lib
libboost_random-vc142-mt-x64-1_78.lib
libboost_regex-vc142-mt-x64-1_78.lib
libboost_serialization-vc142-mt-x64-1_78.lib
libboost_system-vc142-mt-x64-1_78.lib
libboost_test_exec_monitor-vc142-mt-x64-1_78.lib
libboost_thread-vc142-mt-x64-1_78.lib
libboost_timer-vc142-mt-x64-1_78.lib
libboost_type_erasure-vc142-mt-x64-1_78.lib
libboost_unit_test_framework-vc142-mt-x64-1_78.lib
libboost_wave-vc142-mt-x64-1_78.lib
libboost_wserialization-vc142-mt-x64-1_78.lib
libboost_zlib-vc142-mt-x64-1_78.lib)
# 设置(使用)boost动态库
SET(BOOST_LIBS # 从下载的exe文件中提取出的BOOST库
boost_atomic-vc142-mt-x64-1_78
boost_bzip2-vc142-mt-x64-1_78
boost_chrono-vc142-mt-x64-1_78
boost_container-vc142-mt-x64-1_78
boost_context-vc142-mt-x64-1_78
boost_contract-vc142-mt-x64-1_78
boost_coroutine-vc142-mt-x64-1_78
boost_date_time-vc142-mt-x64-1_78
boost_filesystem-vc142-mt-x64-1_78
boost_graph-vc142-mt-x64-1_78
boost_iostreams-vc142-mt-x64-1_78
boost_json-vc142-mt-x64-1_78
boost_locale-vc142-mt-x64-1_78
boost_log_setup-vc142-mt-x64-1_78
boost_log-vc142-mt-x64-1_78
boost_math_c99f-vc142-mt-x64-1_78
boost_math_c99l-vc142-mt-x64-1_78
boost_math_c99-vc142-mt-x64-1_78
boost_math_tr1f-vc142-mt-x64-1_78
boost_math_tr1l-vc142-mt-x64-1_78
boost_math_tr1-vc142-mt-x64-1_78
boost_nowide-vc142-mt-x64-1_78
boost_prg_exec_monitor-vc142-mt-x64-1_78
boost_program_options-vc142-mt-x64-1_78
boost_python310-vc142-mt-x64-1_78
boost_random-vc142-mt-x64-1_78
boost_regex-vc142-mt-x64-1_78
boost_serialization-vc142-mt-x64-1_78
boost_system-vc142-mt-x64-1_78
boost_thread-vc142-mt-x64-1_78
boost_timer-vc142-mt-x64-1_78
boost_type_erasure-vc142-mt-x64-1_78
boost_unit_test_framework-vc142-mt-x64-1_78
boost_wave-vc142-mt-x64-1_78
boost_wserialization-vc142-mt-x64-1_78
boost_zlib-vc142-mt-x64-1_78)
SET(FLANN_LIBS flann flann_cpp)
SET(OPENNI2_LIBS OpenNI2)
SET(PCL_LIBS
pcl_common
pcl_features
pcl_filters
pcl_io
pcl_io_ply
pcl_kdtree
pcl_keypoints
pcl_ml
pcl_octree
pcl_outofcore
pcl_people
pcl_recognition
pcl_registration
pcl_sample_consensus
pcl_search
pcl_segmentation
pcl_stereo
pcl_surface
pcl_tracking
pcl_visualization)
SET(QHULL_LIBS qhull_r)
SET(VTK_LIBS
vtkcgns-9.1
vtkChartsCore-9.1
vtkCommonColor-9.1
vtkCommonComputationalGeometry-9.1
vtkCommonCore-9.1
vtkCommonDataModel-9.1
vtkCommonExecutionModel-9.1
vtkCommonMath-9.1
vtkCommonMisc-9.1
vtkCommonSystem-9.1
vtkCommonTransforms-9.1
vtkDICOMParser-9.1
vtkDomainsChemistry-9.1
vtkDomainsChemistryOpenGL2-9.1
vtkdoubleconversion-9.1
vtkexodusII-9.1
vtkexpat-9.1
vtkFiltersAMR-9.1
vtkFiltersCore-9.1
vtkFiltersExtraction-9.1
vtkFiltersFlowPaths-9.1
vtkFiltersGeneral-9.1
vtkFiltersGeneric-9.1
vtkFiltersGeometry-9.1
vtkFiltersHybrid-9.1
vtkFiltersHyperTree-9.1
vtkFiltersImaging-9.1
vtkFiltersModeling-9.1
vtkFiltersParallel-9.1
vtkFiltersParallelImaging-9.1
vtkFiltersPoints-9.1
vtkFiltersProgrammable-9.1
vtkFiltersSelection-9.1
vtkFiltersSMP-9.1
vtkFiltersSources-9.1
vtkFiltersStatistics-9.1
vtkFiltersTexture-9.1
vtkFiltersTopology-9.1
vtkFiltersVerdict-9.1
vtkfmt-9.1
vtkfreetype-9.1
vtkGeovisCore-9.1
vtkgl2ps-9.1
vtkglew-9.1
vtkhdf5-9.1
vtkhdf5_hl-9.1
vtkImagingColor-9.1
vtkImagingCore-9.1
vtkImagingFourier-9.1
vtkImagingGeneral-9.1
vtkImagingHybrid-9.1
vtkImagingMath-9.1
vtkImagingMorphological-9.1
vtkImagingSources-9.1
vtkImagingStatistics-9.1
vtkImagingStencil-9.1
vtkInfovisCore-9.1
vtkInfovisLayout-9.1
vtkInteractionImage-9.1
vtkInteractionStyle-9.1
vtkInteractionWidgets-9.1
vtkIOAMR-9.1
vtkIOAsynchronous-9.1
vtkIOCGNSReader-9.1
vtkIOChemistry-9.1
vtkIOCityGML-9.1
vtkIOCONVERGECFD-9.1
vtkIOCore-9.1
vtkIOEnSight-9.1
vtkIOExodus-9.1
vtkIOExport-9.1
vtkIOExportGL2PS-9.1
vtkIOExportPDF-9.1
vtkIOGeometry-9.1
vtkIOHDF-9.1
vtkIOImage-9.1
vtkIOImport-9.1
vtkIOInfovis-9.1
vtkIOIOSS-9.1
vtkIOLegacy-9.1
vtkIOLSDyna-9.1
vtkIOMINC-9.1
vtkIOMotionFX-9.1
vtkIOMovie-9.1
vtkIONetCDF-9.1
vtkIOOggTheora-9.1
vtkIOParallel-9.1
vtkIOParallelXML-9.1
vtkIOPLY-9.1
vtkIOSegY-9.1
vtkIOSQL-9.1
vtkioss-9.1
vtkIOTecplotTable-9.1
vtkIOVeraOut-9.1
vtkIOVideo-9.1
vtkIOXML-9.1
vtkIOXMLParser-9.1
vtkjpeg-9.1
vtkjsoncpp-9.1
vtkkissfft-9.1
vtklibharu-9.1
vtklibproj-9.1
vtklibxml2-9.1
vtkloguru-9.1
vtklz4-9.1
vtklzma-9.1
vtkmetaio-9.1
vtknetcdf-9.1
vtkogg-9.1
vtkParallelCore-9.1
vtkParallelDIY-9.1
vtkpng-9.1
vtkpugixml-9.1
vtkRenderingAnnotation-9.1
vtkRenderingContext2D-9.1
vtkRenderingContextOpenGL2-9.1
vtkRenderingCore-9.1
vtkRenderingFreeType-9.1
vtkRenderingGL2PSOpenGL2-9.1
vtkRenderingImage-9.1
vtkRenderingLabel-9.1
vtkRenderingLOD-9.1
vtkRenderingOpenGL2-9.1
vtkRenderingSceneGraph-9.1
vtkRenderingUI-9.1
vtkRenderingVolume-9.1
vtkRenderingVolumeOpenGL2-9.1
vtkRenderingVtkJS-9.1
vtksqlite-9.1
vtksys-9.1
vtkTestingRendering-9.1
vtktheora-9.1
vtktiff-9.1
vtkverdict-9.1
vtkViewsContext2D-9.1
vtkViewsCore-9.1
vtkViewsInfovis-9.1
vtkWrappingTools-9.1
vtkzlib-9.1)
SET(LINK_LIBS ${BOOST_STATIC_LIBS} ${FLANN_LIBS} ${OPENNI2_LIBS} ${PCL_LIBS} ${QHULL_LIBS} ${VTK_LIBS})
aux_source_directory( ${PCL_Demo_ROOT}/src PCL_Demo_SRC_LIST )
include_directories(${INC_DIR})
link_directories(${LIB_DIR})
ADD_EXECUTABLE(hello_PCL "${PCL_Demo_ROOT}/unit_test/main.cpp" ${PCL_Demo_SRC_LIST})
TARGET_LINK_LIBRARIES(hello_PCL ${LINK_LIBS})
测试代码:
#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);
}
测试结果: