《VS2010(X64)&PCL点云库学习》Part 2 A simple test of PCL in MFC
本文主要介绍如何将PCL的控制台程序移植到MFC中,基本内容还是按照上一篇PCL配置博文来继续讲解的。
1、新建MFC程序
2、应用程序类型对话框中,勾选基于对话框,一直下一步,或者直接点击完成。
3、配置环境:主要包括添加include文件夹、lib文件夹和添加.lib库文件
(1)添加include文件夹
你可以把安装目录D:\Program Files\PCL 1.6.0\改成自己的安装目录 项目右击—>属性—>C/C++—>附加包含目录:
Include: D:\Program Files\PCL 1.6.0\3rdParty\Boost\include;D:\Program Files\PCL 1.6.0\3rdParty\Eigen\include;D:\Program Files\PCL 1.6.0\3rdParty\FLANN\include;D:\Program Files\PCL 1.6.0\3rdParty\Qhull\include;D:\Program Files\PCL 1.6.0\3rdParty\VTK\include\vtk-5.8;D:\Program Files\OpenNI\Include;D:\Program Files\PCL 1.6.0\include\pcl-1.6
(2)添加bin文件夹
项目右击—>属性—>链接器—>常规—>附加库目录:
<strong><span style="color:#ff0000;">lib:——注意OpenNI\Lib64</span></strong>
D:\Program Files\PCL 1.6.0\3rdParty\Boost\lib;D:\Program Files\PCL 1.6.0\3rdParty\Qhull\lib;D:\Program Files\PCL 1.6.0\3rdParty\FLANN\lib;D:\Program Files\PCL 1.6.0\3rdParty\VTK\lib\vtk-5.8;D:\Program Files\PCL 1.6.0\lib;D:\Program Files\OpenNI\Lib64
(3)添加.lib库文件
dubug模式,链接器->输入->附加依赖项 添加(注意和Lib文件夹下的.lib文件比对,一般后缀带_debug和_gd的为调试模式):
opengl32.lib pcl_kdtree_debug.lib pcl_io_debug.lib pcl_search_debug.lib pcl_segmentation_debug.lib pcl_apps_debug.lib pcl_features_debug.lib pcl_filters_debug.lib pcl_visualization_debug.lib pcl_common_debug.lib flann_cpp_s-gd.lib libboost_system-vc100-mt-gd-1_47.lib libboost_filesystem-vc100-mt-gd-1_47.lib libboost_thread-vc100-mt-gd-1_47.lib libboost_date_time-vc100-mt-gd-1_47.lib libboost_iostreams-vc100-mt-gd-1_47.lib vtkalglib-gd.lib vtkCharts-gd.lib vtkCommon-gd.lib vtkDICOMParser-gd.lib vtkexoIIc-gd.lib vtkexpat-gd.lib vtkFiltering-gd.lib vtkfreetype-gd.lib vtkftgl-gd.lib vtkGenericFiltering-gd.lib vtkGeovis-gd.lib vtkGraphics-gd.lib vtkhdf5-gd.lib vtkHybrid-gd.lib vtkImaging-gd.lib vtkInfovis-gd.lib vtkIO-gd.lib vtkjpeg-gd.lib vtklibxml2-gd.lib vtkmetaio-gd.lib vtkNetCDF-gd.lib vtkNetCDF_cxx-gd.lib vtkpng-gd.lib vtkproj4-gd.lib vtkRendering-gd.lib vtksqlite-gd.lib vtksys-gd.lib vtktiff-gd.lib vtkverdict-gd.lib vtkViews-gd.lib vtkVolumeRendering-gd.lib vtkWidgets-gd.lib vtkzlib-gd.lib
(4)修改平台为活动(x64),此步很关键,不然64位机没法编译通过。
4、添加代码
(1)添加基本的include文件和相关的全局变量以及部分代码的修改
// PCL_MFCDlg.cpp : 实现文件 // #include "stdafx.h" #include "PCL_MFC.h" #include "PCL_MFCDlg.h" #include "afxdialogex.h" #undef min //新加代码// #undef max //新加代码// //pcl #include <pcl/visualization/cloud_viewer.h> #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> //#ifdef _DEBUG //注释掉// //#define new DEBUG_NEW //注释掉// //#endif //注释掉// using namespace pcl; //新加代码// // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 int user_data; void viewerOneOff (pcl::visualization::PCLVisualizer& viewer) { viewer.setBackgroundColor (1.0, 0.5, 1.0); pcl::PointXYZ o; o.x = 1.0; o.y = 0; o.z = 0; viewer.addSphere (o, 0.25, "sphere", 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++; } // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx……//后面是MFC自动生成的函数
(2)在资源视图中的主对话框视图中,拖入按钮控件,caption设置为TestPCL,ID设置为IDC_TEST。
(3)设置完毕后,双击按钮,会回到PCL_MFCDlg.cpp文件中,光标定位到函数CPCL_MFCDlg::OnBnClickedTest()。添加源代码,此处的代码是第一篇文章的源码,只有最后一句稍作修改。
void CPCL_MFCDlg::OnBnClickedTest() { // TODO: 在此添加控件通知处理程序代码 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>); pcl::io::loadPCDFile ("bridge2.pcd", *cloud); pcl::visualization::CloudViewer viewer("Cloud Viewer"); //showCloud函数是同步的,在此处等待直到渲染显示为止 viewer.showCloud(cloud); //该注册函数在可视化时只调用一次 viewer.runOnVisualizationThreadOnce (viewerOneOff); //该注册函数在渲染输出时每次都调用 viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { //在此处可以添加其他处理 user_data++; } UpdateData(FALSE); //由cloud_viewer中的return 0; 改为UpdateData(FALSE); }
5、调试运行:
小结:
1)将控制台程序转移到MFC中的基本步骤如上所示,基本的函数都没有太大的变化,只有很少的地方有改动;
2)MFC中的程序是可以调用控制台程序运行的,在功能上是一样的,只是界面上略有区别。