《PCL点云库学习&VS2010(X64)》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中的程序是可以调用控制台程序运行的,在功能上是一样的,只是界面上略有区别。