天天看點

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單文檔的主視窗中了。