把pcl的VTK显示融合到MFC(代码找原作者)
生活随笔
收集整理的這篇文章主要介紹了
把pcl的VTK显示融合到MFC(代码找原作者)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自PCL中國,原文鏈接:http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=223&extra=page%3D1
本人做了少量修改!1:系統平臺:XP/win7(我都做過,可以實現) 工具:visual studio 2010,PCL-1.6.0-AllInOne-msvc2010-win32,VTK5.10(用Cmake編譯一下,網上都有教程,注意:PCL-1.6.0-AllInOne-msvc2010-win32中提供的VTK5.8缺少關鍵文件vtkMFCWindow.h和vktMFC.lib,所以無法實現)
2 實現過程 2.1 建立基于對話框的工程:PCLDialog (我的工程路徑D:\Program\VS2010\Project\PCLDialog)圖1所示
2.2將我提供pclvisualization_mfc文件夾(修改過的源代碼)放到自己所建的工程中文件夾下(如有需要,請回復留下郵箱,我可以發給大家) (D:\Program\VS2010\Project\PCLDialog\PCLDialog\pclvisualization_mfc)
其中源文件和頭文件,如圖1所示:
將源文件和頭文件添加到工程中,如圖2所示 ********************************************************************************************** 2.3 具體實現
2.3.1 為工程添加額外引用路徑(根據自己程序安裝路徑而定) C:\Program Files\VTK5.10\include\vtk-5.10; C:\Program Files\PCL 1.6.0\3rdParty\Boost\include; C:\Program Files\PCL 1.6.0\include\pcl-1.6; C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include; C:\Program Files\PCL 1.6.0\3rdParty\Flann\include; D:\Program\VS2010\Project\PCLDialog\PCLDialog;
2.3.2 添加附加庫路徑(根據自己程序安裝路徑而定) C:\Program Files\PCL 1.6.0\3rdParty\Qhull\lib; C:\Program Files\VTK5.10\lib; C:\Program Files\PCL 1.6.0\3rdParty\Boost\lib; C:\Program Files\PCL 1.6.0\lib; C:\Program Files\PCL 1.6.0\3rdParty\Flann\lib; C:\Program Files\OpenNI\Lib; C:\Program Files\PCL 1.6.0\3rdParty\Eigen\bin;
2.3.3 為工程添加附加依賴項(我把所有需要的*.lib;文件都添加了,不一定都用的著) 附加項, 見附件
2.3.4 在工程屬性字符集中選擇UseMulti-Byte Character Set,如果用Unicode, PCL源文件有太多要改,后面編譯通不過。(總之我試著解決了,總是出錯,后來就放棄了,請高手指點)
2.3.5在對話框中插入picture control控件ID:IDC_PCDVIEWER。
2.3.6 在PCLDialog.h中添加 頭文件 #include "pcl\point_cloud.h"#include "pcl\point_types.h"#include "pclvisualization_mfc\include\pcl_mfc_visualizer.h"#include "vtkRenderer.h"#include <pcl/io/pcd_io.h>
復制代碼 新建私有變量 private://視圖窗口pcl::mfc_visualization::PCLVisualizer *viewer;//vtkRenderer *pvtkRenderer;POINT ptBorder;//數據點sensor_msgs::PointCloud2::Ptr binary_blob;//數據點句柄pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2>::Ptr xyz_Handler;pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2>::Ptr color_Handler;//傳感器位置方向矩陣Eigen::Vector4f sensor_origin;Eigen::Quaternion<float> sensor_orientation;
復制代碼 2.3.7 初始化 CPCLDialogDlg::CPCLDialogDlg(CWnd* pParent /*=NULL*/): CDialogEx(CPCLDialogDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);/////begin tyz//初始化this->viewer = NULL;sensor_origin = Eigen::Vector4f::Zero();sensor_orientation = Eigen::Quaternionf::Identity ();}
復制代碼 2.3.8 在BOOL CPCLDialogDlg::OnInitDialog()函數中添加 //利用PictControl控件加載PCD窗口CWnd *viewer_pcWnd;viewer_pcWnd = this->GetDlgItem(IDC_PCDVIWER);this->viewer = new pcl::mfc_visualization::PCLVisualizer(viewer_pcWnd);CRect cRectPCL;this->viewer->GetClientRect(&cRectPCL);CRect cRectClient;GetClientRect(&cRectClient);this->ptBorder.x = cRectClient.Width() - cRectPCL.Width();this->ptBorder.y = cRectClient.Height() - cRectPCL.Height();
2.3.9 添加消息WM_SIZE響應函數OnSize,保證PCLVisualizer窗口viewer隨對話框變化。 void CPCLDialogDlg::OnSize(UINT nType, int cx, int cy) {CDialogEx::OnSize(nType, cx, cy);// TODO: Add your message handler code hereif (::IsWindow(this->GetSafeHwnd())) {if (this->viewer){cx -= ptBorder.x;cy -= ptBorder.y;this->GetDlgItem(IDC_PCLVIWER)->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);this->viewer->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);}} }
復制代碼 2.3.10 新建button控件,caption:Open PCD,ID:IDC_OPENPCD,為控件添加響應函OnBnClickedOpenpcd() void CPCLDialogDlg::OnBnClickedOpenpcd(){this->viewer->removeAllPointClouds ();// TODO: Add your control notification handler code herestatic TCHAR BASED_CODE szFilter[] = _T("PCD (*.pcd )|*.pcd||");CFileDialog cFileDialog(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT| OFN_NOCHANGEDIR ,szFilter);if (cFileDialog.DoModal() == IDOK){///文檔名稱std::string filename;filename = cFileDialog.GetFileName();//reset datathis->binary_blob.reset();binary_blob = sensor_msgs::PointCloud2::Ptr (new sensor_msgs::PointCloud2);// read new data//*.pcd文件pcl::PCDReader pcd_reader; if (pcd_reader.read ((char*)_bstr_t(filename.c_str()), *binary_blob) != 0) //* load the file{MessageBox (_T("Couldn't read PCData file!"));return;} }if (binary_blob == NULL){MessageBox("Please load PCD file firstly!");return;}else{//其他句柄if (pcl::getFieldIndex(*binary_blob, "rgb") > 0){color_Handler = pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2>::Ptr(new pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2> (binary_blob));this->viewer->addPointCloud(binary_blob, color_Handler, sensor_origin, sensor_orientation);}else{xyz_Handler = pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2>::Ptr(new pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2> (binary_blob));this->viewer->addPointCloud(binary_blob, xyz_Handler, sensor_origin, sensor_orientation);} this->viewer->resetCamera();}} <em>復制代碼</em> 2.3.11 :最終效果,圖4所示
2.3.12:實現多項功能的程序效果,如圖5所示
? ?? ?由于級別不夠所以附件大小限制,這里只給出圖4和圖5,圖1~3不重要,所以不給出了。壓縮文件是修改好的源代碼(如有需要請回復留下郵箱,我可以發給大家),按說明操作即可。
? ?? ? 修改源代碼的使用請看如何實現基于MFC對話框的PCL顯示(4)——關于修改源代碼的使用。
圖5 實現多功能對話框的效果圖.png(264.06 KB, 下載次數: 11)
圖4 最終效果圖.png(71.08 KB, 下載次數: 6)
附加注釋:
???????? 轉載請注明出處(http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=227&extra=)? ?? ? 所提供的修改源代碼(如有需要,回復留下郵箱,我發給大家)是基于PCL官網提供的源文件(PCL-1.6.0-Source.tar.bz2)內的visualization文件夾下的相關源文件和頭文件的基礎上修改完成的。主要思想是基于vtkMFCWindow類實現的,將PCL顯示窗口類pcl::visualization::PCLVisualizer由原來的基于vtkRenderWindow類改成基于vtkMFCWindow類的新類pcl::mfc_visualization::PCLVisualizer。而且新類需要指向所依托顯示的子窗口句柄(有機會在慢慢解釋給大家吧,還沒太理順,大概就是這么個思想)。
? ?? ?修改源代碼 相當于對原pcl::visualization Namespace 修改得pcl::mfc_visualization Namespace,所以在使用過程中,相關功能的實現可以參照官網教程,但是涉及到pcl::visualization Namespace的全部修改為pcl::mfc_visualization。
? ?? ? 例如前面在新建pcl::visualization::PCLVisualizer類時MFC對話框應用中需要新建pcl::mfc_visualization::PCLVisualizer類,其他的也類似,如數據點句柄(參見如何實現基于MFC對話框的PCL顯示 2的新建私有變量代碼)。
? ?? ???對象pcl::mfc_visualization::PCLVisualizer *viewer的初始化,在構造對話框時 this->viewer=NULL; 對話框初始化時將viewer指向Picture Control的窗口句柄 CWnd *viewer_pcWnd;viewer_pcWnd = this->GetDlgItem(IDC_PCDVIWER);this->viewer = new pcl::mfc_visualization::PCLVisualizer(viewer_pcWnd);<em>復制代碼</em> ? ?? ?? ?經過以上幾步就可完成窗口的基本建設,剩下的都是MFC對話框的基本性質了。還有我在 pcl::mfc_visualization Namespace中新加了幾個函數,隨后給大家解釋和用法。
總結
以上是生活随笔為你收集整理的把pcl的VTK显示融合到MFC(代码找原作者)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暖心瞬间让人感动的句子124个
- 下一篇: 湖北人的特点