天天看点

PCLVisualizer窗口(VTK)嵌入MFC单文档界面

最近在编写MFC单文档界面,用于处理点云,每次需要显示点云的时候都会弹出PCLVisualizer窗口,因此想能不能像OpenCV那样嵌入到界面中。在网上查了很多,但给出的资料很少,PCL也没有给出相关的信息,考虑到PCLVisualizer窗口是基于VTK的,因此从VTK窗口入手,将界面嵌入到MFC中。

主要的操作如下:

需要的头文件有(注意提前配置好PCL库,我因为工程部署的原因,使用的是旧版的PCL1.7):

#include <pcl/visualization/pcl_visualizer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
           

在需要嵌入的界面头文件类中声明成员变量(我这里是在CXXView的类中声明的):

pcl::visualization::PCLVisualizer m_viewer;
vtkSmartPointer<vtkRenderWindow> m_win;
vtkSmartPointer<vtkRenderWindowInteractor> m_iren;
           

然后在构造函数中对上述成员变量进行初始化,这里以我自己的为例:

CXXView::CXXView():
m_viewer("Viewer Test",false)
{
	m_win = m_viewer.getRenderWindow();
	m_iren = vtkRenderWindowInteractor::New();

	m_viewer.setBackgroundColor(1.0,1.0,1.0);

}
           

下面就是核心的部分了,在你需要显示或者嵌入的位置加上下面代码(我以在CXXView::OnDraw中加入为例):

void CCXXView::OnDraw(CDC* /*pDC*/)
{
	CCE5_PointCloudAnalysisDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

 	if (IsWindow(GetSafeHwnd())&&pDoc->ObstAnlys.UpdateView)
 	{
		pDoc->ObstAnlys.UpdateView=false;
 		CRect rect;
 		GetClientRect(&rect);
 		m_win->SetSize(rect.Width(),rect.Height());
 		m_win->SetParentId(this->m_hWnd);
 		m_iren->SetRenderWindow(m_win);

                //根据自己的需要在界面中添加需要显示的三维数据
		m_viewer.removeAllPointClouds();
		m_viewer.addPointCloud(pDoc->ObstAnlys.cloud_obstacle);
		m_viewer.resetCamera();

		m_viewer.createInteractor();
		m_win->Render();
	}
}
           

试试看,上面的代码已经可以将PCLVisualizer的窗口嵌入到MFC单文档的主窗口中了。