一、新建一个MFC对话框程序
打开VS2019 新建项目-MFC应用程序-基于对话框
二、配置PCL
1、在VC++目录->包含目录中编辑 ,将自己的PCL库包含 注意找你们自己PCL的路径
2、VC++目录->库目录包含
3、在到链接器->输入->附加依赖项包含自己PCL库的lib文件名字
三、编辑代码
1、编辑对话框
添加一个pictrue_control控件 改ID为IDC_PCDVIEW 添加一个按钮改名为openFILE
2、双击openFile按钮进入按钮事件编辑 粘贴代码:
CString strFile = _T("");
CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.pcd)|*.pcd|All Files (*.*)|*.*||"), NULL);
if (dlgFile.DoModal())
{
strFile = dlgFile.GetPathName();
//Cstring 转string
CString theCStr;
std::string STDStr(CW2A(strFile.GetString()));
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new
pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(STDStr, *cloud) == -1)//*打开点云文件
{
AfxMessageBox(_T("读入点云数据失败"));
}
m_viewer->removeAllPointClouds();//将前一次点云移除
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
m_viewer->addPointCloud<pcl::PointXYZ >(cloud, single_color, "sample cloud");
}
代码就是打开文件选取PCD点云 然后显示
3、在 某某某dlg.h下添加头文件
#include <pcl/console/parse.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/visualization/pcl_visualizer.h>
//vtk
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace pcl;
4、并且在这个dlg.h的文件类里添加:
private:
boost::shared_ptr<pcl::visualization::PCLVisualizer> m_viewer;//要共享指针类型的,要不然,显示窗口会跳出MFC界面
vtkRenderWindow* m_win; //vtk渲染的窗口句柄
vtkRenderWindowInteractor* m_iren;//vtk交互的对象
5、然后在dlg.cpp文件的OnInitDialog()初始化函数下添加: (函数里的直接复制过去就行了 毕竟我工程名字乱打的)
BOOL CMFCApplication3Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//pcl显示窗口初始化
m_viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));//初始化viewer对象
m_viewer->addCoordinateSystem(); //设置对应的坐标系
m_viewer->setBackgroundColor(0, 0, 0);//设置背景颜色
m_viewer->initCameraParameters();//初始化相机的参数
m_win = m_viewer->getRenderWindow();//将view中的渲染窗口的句柄传递给vtk window
m_iren = vtkRenderWindowInteractor::New(); //初始化vtkwindow交互的对象
m_viewer->resetCamera();//使点云显示在屏幕中间,并绕中心操作
CRect rect;
GetClientRect(&rect);//实时获取MFC窗口大小
m_win->SetSize(rect.right - rect.left, rect.bottom - rect.top);//根据当前窗口的大小设置vtk 窗口的大小
CWnd *viewer_pcWnd;
viewer_pcWnd = this->GetDlgItem(IDC_PCDVIEW);//获取对应的wnd
m_win->SetParentId(viewer_pcWnd->m_hWnd);//设置vtk窗口的句柄
m_iren->SetRenderWindow(m_win);//将vtk交互对象与vtk window绑定
m_viewer->createInteractor();
m_win->Render();//开始渲染
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
最后结果
运行点击打开选了一个bunny.pcd打开显示这样