环境是vs2015,pcl1.8.1,vtk8.1。不知道其他vtk版本有没有问题。。。感觉vtk还是很烦。。动不动就报错。。。

完整代码https://github.com/izhangrui/MFCPCLDemo

创建一个简单的MFC对话框

添加picture control控件,把id改为IDC_FRAME(当然用默认名也可以),添加一个打开点云按钮

在当前界面的cpp文件顶部加入包含库


#include <opencv2/opencv.hpp> 
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h> 
#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>  


#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

using namespace pcl;
using namespace std;

大概就这些

然后在下面申明一些全局变量,一个窗口和两个句柄

vtkSmartPointer<vtkRenderWindow> m_win;
vtkSmartPointer<vtkRenderWindowInteractor> m_iren;

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer", false));

在:OnInitDialog()中添加代码将窗口和之前的图像控件绑定

	//==========================将viewer窗口结合到MFC图像控件上===========================
	CRect rect;
	m_iren = vtkRenderWindowInteractor::New();//重新申请地址
	m_win = viewer->getRenderWindow();//获取viewer的句柄
	GetDlgItem(IDC_FRAME)->GetClientRect(&rect);//获取图像控件的实际大小
	m_win->SetSize(rect.right - rect.left, rect.bottom - rect.top);//将viewer大小设置为图像控件大小
	m_win->SetParentId(GetDlgItem(IDC_FRAME)->m_hWnd);//将vtk窗口结合到MFC窗口中
	viewer->resetCamera();
	m_iren->SetRenderWindow(m_win);
	viewer->createInteractor();//由于初始化设置为false,该处重新创建PCL风格的Interactor
	m_win->Render();
	//========================================================================================

完成这一步,界面上的控件和窗口就绑定了。大概就这个样子

最后在打开点云按钮下面添加代码,打开当前目录下的cloud.pcd文件并显示

	PointCloudT::Ptr cloud(new PointCloudT);
	pcl::io::loadPCDFile("cloud.pcd", *cloud);
	viewer->addPointCloud(cloud);

最后结果

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐