PCL点云之旅01-实现一个预览点云的桌面软件

623 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

本篇文章要实现效果

58TJC1%2Q4OWJX}F~HC4F.png

实现上面这样一个能够预览点云的桌面程序

步骤拆分

  • 搭建C++环境,下载Visual studio 2017 & Point cloud library
  • 安装Visual Studio 和 Point cloud library到合适的位置
  • 新建一个C++桌面软件项目
  • 配置项目引入PCL
  • 编写代码,实现加载pcd点云资源
  • 编译代码,生成exe文件并发布

过程详解

安装Visual Studio 2017

百度网盘下载安装包:pan.baidu.com/share/init?… 提取码是:ub6c

下载完成之后点击安装,安装好之后到达如图的这个界面,勾选如图的内容。

QQ图片20220816153301.png

然后点击修改/安装,visual studio 2017 这个环境我们就算是配置好了

安装Point Cloud library到您的机器

百度网盘下载安装包: pan.baidu.com/s/1fuXzHl8n… 提取码是: eqm6

下载完成之后点击下图的这个文件进行point cloud library的安装

QQ图片20220816153711.png

请确保安装的时候如下内容都进行了勾选

image.png

在安装的过程中,应该会弹出OpenNI的安装程序,更改安装路径为您已经安装好的PCL下面的3rdParty文件夹下面的OpenNI2这个文件夹下面。

如果说您没有弹出OpenNI的安装框。我们可以来到 D:\PCL 1.8.1\3rdParty\OpenNI2 这个位置下面 手动进行OpenNI的安装。

image.png

如果说您上面的这些步骤都能够正常完成了,那么我们的Point Cloud Libarary环境和Visual Studio C++环境就算是配置完成了。

项目搭建及代码编写

  • 新建一个C++项目

QQ图片20220816154656.png

  • 配置这个C++项目的属性

image.png

  • 配置项目编译环境为x64环境,不然编译的时候会报错

image.png

  • 编辑项目包含目录,导入PCL包含目录

image.png

将如下代码一行一行复制到上面的文本框上去

D:\PCL 1.8.1\include\pcl-1.8\
D:\PCL 1.8.1\3rdParty\VTK\include\vtk-8.0
D:\PCL 1.8.1\3rdParty\Qhull\include\
D:\PCL 1.8.1\3rdParty\OpenNI2\Include\
D:\PCL 1.8.1\3rdParty\FLANN\include\
D:\PCL 1.8.1\3rdParty\Eigen\eigen3\
D:\PCL 1.8.1\3rdParty\Boost\include\boost-1_64
  • 编辑项目的库目录,导入PCL库目录

{0KA1WPQI6LVH(B1CJQ3}GL.png

将如下代码一行一行的复制到上面的文本框上去

D:\PCL 1.8.1\3rdParty\VTK\lib\
D:\PCL 1.8.1\3rdParty\OpenNI2\Lib\
D:\PCL 1.8.1\3rdParty\Boost\lib\
D:\PCL 1.8.1\3rdParty\FLANN\lib\
D:\PCL 1.8.1\lib
  • 编写代码,在项目源文件目录处右键选择添加->新建项->新建一个cpp文件,命名为源

QQ图片20220816155847.png

在这个CPP文件中编写如下代码:

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingOpenGL);

int user_data;

void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
	pcl::PointXYZ o;
	o.x = 1.0;
	o.y = 0;
	o.z = 0;
	std::cout << "i only run once" << std::endl;
}

void viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
	static unsigned count = 0;
	std::stringstream ss;
	ss << "Once per viewer loop: " << count++;
	viewer.removeShape("text", 0);
	viewer.addText(ss.str(), 200, 300, "text", 0);

	//FIXME: possible race condition here:
	user_data++;
}

int main()
{
	pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
	pcl::io::loadPCDFile("hbgtdl.pcd", *cloud);
	pcl::visualization::CloudViewer viewer("Cloud Viewer");
	//blocks until the cloud is actually rendered
	viewer.showCloud(cloud);

	//use the following functions to get access to the underlying more advanced/powerful
	//PCLVisualizer

	//This will only get called once
	viewer.runOnVisualizationThreadOnce(viewerOneOff);

	//This will get called once per visualization iteration
	viewer.runOnVisualizationThread(viewerPsycho);
	while (!viewer.wasStopped())
	{
		//you can also do cool processing here
		//FIXME: Note that this is running in a separate thread from viewerPsycho
		//and you should guard against race conditions yourself...
		user_data++;
	}
	return 0;
}

以上注意,您需要有一个pointcloud文件,该文件格式为pcd或者las或者ply,您需要将这个文件放到您的项目的根目录下,与源.cpp同级。当您将这个点云文件放置好了之后,您需要再修改36行的代码为您的点云文件的名字。这样我么你的程序编写部分就没问题了

现在我们就已经有一个cpp文件在我们的项目中了,接下来我们要配置C++的编译属性了。

  • 配置C++的编译属性

image.png

输入以下代码:

_CRT_SECURE_NO_WARNINGS\
_SCL_SECURE_NO_WARNINGS\
_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING
  • 配置编译器的输入属性

image.png

输入如下依赖项

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

Ctrl+F5运行程序

image.png

参考文献

【PCL点云之旅01-实现一个预览点云的桌面软件】 到此结束,如果您觉得对您有帮助的话,可以点赞收藏一下哦。您的支持就是对我最大的鼓励,能让我得到更多的推送流量,帮助到更多的人,最后感谢您花费宝贵的时间认真的阅读这篇文章。如果说您有什么需要我改进的建议欢迎到评论区一起和我讨论❤❤❤