在c++MFC下用PCL顯示操作點雲文件 MFC對話框顯示操作PCL點雲


原文作者:aircraft

原文地址:https://www.cnblogs.com/DOMLX/p/13115873.html

 

第一步 下載PCL庫  我的版本是1.8.1的

 

 

你都要MFC下跑PCL了 你不會不知道怎么下載吧 ( 不會吧  不會吧  不會有人真的不知道怎么下載吧。。。)

 

第二步 新建一個MFC對話框程序(這個不要人教的把 )

打開VS2017 新建項目-MFC應用程序-基於對話框

 

第三步 配置PCL

點開屬性管理器 debugx64下新建一個屬性頁命名PCL_ALLINONE  (因為我是debug x64  你們32就32咯)

 

 

 

然后右鍵打開其屬性

 

在包含目錄編輯 將自己的PCL庫包含  注意找你們自己PCL的路徑  這個要是來問我 我不錘爆你們的狗頭!!!!

 

 

庫目錄包含

 

 在到鏈接器-》輸入-》附加依賴項包含自己PCL庫的lib文件名字

(注意!!!如果你們庫跟我一樣可以直接用我的)  如果不一樣 那么到相應的lib庫文件位置 打開cmd 然后用命令行將文件名都輸入到一個文件保存就行了   好像是 dir \b >>1.txt    (不太記得了  然后復制里面lib結尾的名字粘貼就行了)

vtknetcdf_c++-gd.lib pcl_common_debug.lib pcl_features_debug.lib pcl_filters_debug.lib pcl_io_ply_debug.lib pcl_io_debug.lib pcl_kdtree_debug.lib pcl_keypoints_debug.lib pcl_ml_debug.lib pcl_octree_debug.lib pcl_outofcore_debug.lib pcl_people_debug.lib pcl_recognition_debug.lib pcl_registration_debug.lib pcl_sample_consensus_debug.lib pcl_search_debug.lib pcl_segmentation_debug.lib pcl_stereo_debug.lib pcl_surface_debug.lib pcl_tracking_debug.lib pcl_visualization_debug.lib libboost_atomic-vc141-mt-gd-1_64.lib libboost_bzip2-vc141-mt-gd-1_64.lib libboost_chrono-vc141-mt-gd-1_64.lib libboost_container-vc141-mt-gd-1_64.lib libboost_context-vc141-mt-gd-1_64.lib libboost_coroutine-vc141-mt-gd-1_64.lib libboost_date_time-vc141-mt-gd-1_64.lib libboost_exception-vc141-mt-gd-1_64.lib libboost_fiber-vc141-mt-gd-1_64.lib libboost_filesystem-vc141-mt-gd-1_64.lib libboost_graph-vc141-mt-gd-1_64.lib libboost_graph_parallel-vc141-mt-gd-1_64.lib libboost_iostreams-vc141-mt-gd-1_64.lib libboost_locale-vc141-mt-gd-1_64.lib libboost_log-vc141-mt-gd-1_64.lib libboost_log_setup-vc141-mt-gd-1_64.lib libboost_math_c99-vc141-mt-gd-1_64.lib libboost_math_c99f-vc141-mt-gd-1_64.lib libboost_math_c99l-vc141-mt-gd-1_64.lib libboost_math_tr1-vc141-mt-gd-1_64.lib libboost_math_tr1f-vc141-mt-gd-1_64.lib libboost_math_tr1l-vc141-mt-gd-1_64.lib libboost_mpi-vc141-mt-gd-1_64.lib libboost_numpy3-vc141-mt-gd-1_64.lib libboost_numpy-vc141-mt-gd-1_64.lib libboost_prg_exec_monitor-vc141-mt-gd-1_64.lib libboost_program_options-vc141-mt-gd-1_64.lib libboost_python3-vc141-mt-gd-1_64.lib libboost_python-vc141-mt-gd-1_64.lib libboost_random-vc141-mt-gd-1_64.lib libboost_regex-vc141-mt-gd-1_64.lib libboost_serialization-vc141-mt-gd-1_64.lib libboost_signals-vc141-mt-gd-1_64.lib libboost_system-vc141-mt-gd-1_64.lib libboost_test_exec_monitor-vc141-mt-gd-1_64.lib libboost_thread-vc141-mt-gd-1_64.lib libboost_timer-vc141-mt-gd-1_64.lib libboost_type_erasure-vc141-mt-gd-1_64.lib libboost_unit_test_framework-vc141-mt-gd-1_64.lib libboost_wave-vc141-mt-gd-1_64.lib libboost_wserialization-vc141-mt-gd-1_64.lib libboost_zlib-vc141-mt-gd-1_64.lib flann-gd.lib flann_cpp-gd.lib flann_cpp_s-gd.lib flann_s-gd.lib qhull_d.lib qhullcpp_d.lib qhullstatic_d.lib qhullstatic_r_d.lib qhull_p_d.lib qhull_r_d.lib vtkalglib-8.0-gd.lib vtkChartsCore-8.0-gd.lib vtkCommonColor-8.0-gd.lib vtkCommonComputationalGeometry-8.0-gd.lib vtkCommonCore-8.0-gd.lib vtkCommonDataModel-8.0-gd.lib vtkCommonExecutionModel-8.0-gd.lib vtkCommonMath-8.0-gd.lib vtkCommonMisc-8.0-gd.lib vtkCommonSystem-8.0-gd.lib vtkCommonTransforms-8.0-gd.lib vtkDICOMParser-8.0-gd.lib vtkDomainsChemistry-8.0-gd.lib vtkexoIIc-8.0-gd.lib vtkexpat-8.0-gd.lib vtkFiltersAMR-8.0-gd.lib vtkFiltersCore-8.0-gd.lib vtkFiltersExtraction-8.0-gd.lib vtkFiltersFlowPaths-8.0-gd.lib vtkFiltersGeneral-8.0-gd.lib vtkFiltersGeneric-8.0-gd.lib vtkFiltersGeometry-8.0-gd.lib vtkFiltersHybrid-8.0-gd.lib vtkFiltersHyperTree-8.0-gd.lib vtkFiltersImaging-8.0-gd.lib vtkFiltersModeling-8.0-gd.lib vtkFiltersParallel-8.0-gd.lib vtkFiltersParallelImaging-8.0-gd.lib vtkFiltersPoints-8.0-gd.lib vtkFiltersProgrammable-8.0-gd.lib vtkFiltersSelection-8.0-gd.lib vtkFiltersSMP-8.0-gd.lib vtkFiltersSources-8.0-gd.lib vtkFiltersStatistics-8.0-gd.lib vtkFiltersTexture-8.0-gd.lib vtkFiltersTopology-8.0-gd.lib vtkFiltersVerdict-8.0-gd.lib vtkfreetype-8.0-gd.lib vtkGeovisCore-8.0-gd.lib vtkgl2ps-8.0-gd.lib vtkhdf5-8.0-gd.lib vtkhdf5_hl-8.0-gd.lib vtkImagingColor-8.0-gd.lib vtkImagingCore-8.0-gd.lib vtkImagingFourier-8.0-gd.lib vtkImagingGeneral-8.0-gd.lib vtkImagingHybrid-8.0-gd.lib vtkImagingMath-8.0-gd.lib vtkImagingMorphological-8.0-gd.lib vtkImagingSources-8.0-gd.lib vtkImagingStatistics-8.0-gd.lib vtkImagingStencil-8.0-gd.lib vtkInfovisCore-8.0-gd.lib vtkInfovisLayout-8.0-gd.lib vtkInteractionImage-8.0-gd.lib vtkInteractionStyle-8.0-gd.lib vtkInteractionWidgets-8.0-gd.lib vtkIOAMR-8.0-gd.lib vtkIOCore-8.0-gd.lib vtkIOEnSight-8.0-gd.lib vtkIOExodus-8.0-gd.lib vtkIOExport-8.0-gd.lib vtkIOExportOpenGL-8.0-gd.lib vtkIOGeometry-8.0-gd.lib vtkIOImage-8.0-gd.lib vtkIOImport-8.0-gd.lib vtkIOInfovis-8.0-gd.lib vtkIOLegacy-8.0-gd.lib vtkIOLSDyna-8.0-gd.lib vtkIOMINC-8.0-gd.lib vtkIOMovie-8.0-gd.lib vtkIONetCDF-8.0-gd.lib vtkIOParallel-8.0-gd.lib vtkIOParallelXML-8.0-gd.lib vtkIOPLY-8.0-gd.lib vtkIOSQL-8.0-gd.lib vtkIOTecplotTable-8.0-gd.lib vtkIOVideo-8.0-gd.lib vtkIOXML-8.0-gd.lib vtkIOXMLParser-8.0-gd.lib vtkjpeg-8.0-gd.lib vtkjsoncpp-8.0-gd.lib vtklibharu-8.0-gd.lib vtklibxml2-8.0-gd.lib vtklz4-8.0-gd.lib vtkmetaio-8.0-gd.lib vtkNetCDF-8.0-gd.lib vtkoggtheora-8.0-gd.lib vtkParallelCore-8.0-gd.lib vtkpng-8.0-gd.lib vtkproj4-8.0-gd.lib vtkRenderingAnnotation-8.0-gd.lib vtkRenderingContext2D-8.0-gd.lib vtkRenderingContextOpenGL-8.0-gd.lib vtkRenderingCore-8.0-gd.lib vtkRenderingFreeType-8.0-gd.lib vtkRenderingGL2PS-8.0-gd.lib vtkRenderingImage-8.0-gd.lib vtkRenderingLabel-8.0-gd.lib vtkRenderingLIC-8.0-gd.lib vtkRenderingLOD-8.0-gd.lib vtkRenderingOpenGL-8.0-gd.lib vtkRenderingVolume-8.0-gd.lib vtkRenderingVolumeOpenGL-8.0-gd.lib vtksqlite-8.0-gd.lib vtksys-8.0-gd.lib vtktiff-8.0-gd.lib vtkverdict-8.0-gd.lib vtkViewsContext2D-8.0-gd.lib vtkViewsCore-8.0-gd.lib vtkViewsInfovis-8.0-gd.lib vtkzlib-8.0-gd.lib opengl32.lib

 

配置完畢 以后其他mfc就不用重復配置  將這個配置文件PCL_ALLINONG復制添加就行了

 

第四步 編輯代碼

 

 編輯對話框  添加一個pictrue_control控件 改ID為IDC_PCDVIEW   添加一個按鈕改名為openFILE

 

 

雙擊openFile按鈕進入按鈕事件編輯 粘貼代碼:

CString strFile = _T(""); CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.pcd)|*.pcd|All Files (*.*)|*.*||"), NULL); if (dlgFile.DoModal()) { strFile = dlgFile.GetPathName(); //Cstring 轉string
 CString theCStr; std::string STDStr(CW2A(strFile.GetString())); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>(STDStr, *cloud) == -1)//*打開點雲文件
 { AfxMessageBox(_T("讀入點雲數據失敗")); } m_viewer->removeAllPointClouds();//將前一次點雲移除 
            pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0); m_viewer->addPointCloud<pcl::PointXYZ >(cloud, single_color, "sample cloud"); }

代碼就是打開文件選取PCD點雲 然后顯示

 

在  某某某dlg.h下添加頭文件

#include <pcl/console/parse.h> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/visualization/pcl_visualizer.h>
//vtk
#include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace pcl;

 

如果上面這個頭文件會報錯試試下面這套 不報錯就用上面的 (因為我的MFC有時候用第一套會報錯)

#undef min                                         //新加代碼//
#undef max     
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/console/parse.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/visualization/pcl_visualizer.h>
//vtk
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
using namespace pcl;

 

 

並且在這個dlg.h的文件類里添加:

private: boost::shared_ptr<pcl::visualization::PCLVisualizer> m_viewer;//要共享指針類型的,要不然,顯示窗口會跳出MFC界面
       vtkRenderWindow* m_win;   //vtk渲染的窗口句柄
       vtkRenderWindowInteractor* m_iren;//vtk交互的對象

然后在dlg.cpp文件的OnInitDialog()初始化函數下添加: (函數里的直接復制過去就行了  畢竟我工程名字亂打的)

BOOL CMFCApplication3Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動 // 執行此操作
    SetIcon(m_hIcon, TRUE);            // 設置大圖標
    SetIcon(m_hIcon, FALSE);        // 設置小圖標 // TODO: 在此添加額外的初始化代碼 //pcl顯示窗口初始化
    m_viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));//初始化viewer對象
    m_viewer->addCoordinateSystem(); //設置對應的坐標系
    m_viewer->setBackgroundColor(0, 0, 0);//設置背景顏色
    m_viewer->initCameraParameters();//初始化相機的參數
    m_win = m_viewer->getRenderWindow();//將view中的渲染窗口的句柄傳遞給vtk window
    m_iren = vtkRenderWindowInteractor::New(); //初始化vtkwindow交互的對象 
    m_viewer->resetCamera();//使點雲顯示在屏幕中間,並繞中心操作
 CRect rect; GetClientRect(&rect);//實時獲取MFC窗口大小
    m_win->SetSize(rect.right - rect.left, rect.bottom - rect.top);//根據當前窗口的大小設置vtk 窗口的大小
    CWnd *viewer_pcWnd; viewer_pcWnd = this->GetDlgItem(IDC_PCDVIEW);//獲取對應的wnd
    m_win->SetParentId(viewer_pcWnd->m_hWnd);//設置vtk窗口的句柄
    m_iren->SetRenderWindow(m_win);//將vtk交互對象與vtk window綁定 
    m_viewer->createInteractor(); m_win->Render();//開始渲染
    return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}

 如果這頁的開頭附近有下面這個 直接注釋掉 不然就會報錯 error C2661: “pcl::PointCloud::operator new”: 沒有重載函數接受 3 個參數

//#ifdef _DEBUG
//#define new DEBUG_NEW
//#endif

 

 

最后結果

運行點擊打開選了一個bunny.pcd打開顯示這樣    就這么簡單搞定了   根本不需要網上的其他什么MFC教程 又要cmake編譯啊  又要單文檔得    (TMen都是呆子)

(bunny.pcd文件不要找我拿  你都要顯示點雲了  一個點雲文件沒有?那你心里可能沒有點B數啊)

 

如果你們編譯運行錯誤 自己復制錯誤去百度啊  難道來問我   難道我知道?

 

 

若有興趣交流分享技術,可關注本人公眾號,里面會不定期的分享各種編程教程,和共享源碼,諸如研究分享關於c/c++,python,前端,后端,opencv,halcon,opengl,機器學習深度學習之類有關於基礎編程,圖像處理和機器視覺開發的知識

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM