最近在編寫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單文檔的主視窗中了。