最近在编写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单文档的主窗口中了。