• pcl点云mfc单文档显示


    pointcloud library(PCL)是目前发展势头最猛的三维点云处理库,并且在许多领域都扮演者重要的角色。为了能让大家更好的了解和使用PCL库,我们现在正在着手名为PCLlab的项目,目标是集成PCL中的算法实现类似meshlab功能的软件。而对于PCL的操作,我们需要借助MFC,QT之类的平台来实现界面操作。目前我们主要以MFC平台来集成各个算法。这里要处理的第一个问题就是最基本的显示功能:如何将PCL中产生的分离窗口与MFC窗口结合。

    要实现该功能需要以下几个关键设置:不需要重新继承其他类,只需要做一些简单设置即可实现

    (1)实例化的初始设置

    pcl::visualization::PCLVisualizer m_viewer("PCL",false);

    注意:初始化时必须设置成false,否则窗口始终是分离。如果要在类中实例化,由于这种实例化方式不允许,所以可以在pcl_visualizer.h中将构造函数的默认值改为false。

    (2)设置显示窗口的父窗口

    m_win =m_viewer.getRenderWindow();

    m_win->SetParentId(this->m_hWnd);

    (3)添加点云前要删除所有点云,否则无法显示。如果只是一次性载入的话,可以省略这步

    m_viewer.removeAllPointClouds();

     

    核心程序 

    PCLlabView.h

    视图类头文件配置

    复制代码
    // PCL
    #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>
    复制代码

    私有成员变量

    //Implementation
    private:
           pcl::PCLPointCloud2::Ptr m_cloud;
           pcl::visualization::PCLVisualizer m_viewer;
           vtkSmartPointer<vtkRenderWindow> m_win;
           vtkSmartPointer<vtkRenderWindowInteractor> m_iren;

     

    PCLlabView.cpp

    主要设置构造函数和OnDraw函数

    复制代码
    CPCLlabView::CPCLlabView()
    {
           // TODO: addconstruction code here
           m_win = m_viewer.getRenderWindow();
           m_iren = vtkRenderWindowInteractor::New();//重新申请地址
    }
     
    void CPCLlabView::OnDraw(CDC* /*pDC*/)
    {
           CPCLlabDoc* pDoc = GetDocument();
           ASSERT_VALID(pDoc);
           if(!pDoc)
                  return;
     
           // TODO: adddraw code for native data here
           std::string filename ="pcl_logo.pcd";
           if(pcl::io::loadPCDFile(filename,*m_cloud ) == -1)// load the file
           {
                  PCL_ERROR ("Couldn't read file");
           }
           m_viewer.setBackgroundColor( 0.0, 0.0,0.0 );
           m_viewer.removeAllPointClouds();//该函数不加则不显示
    
           //显示不同类型pcd文件
           Eigen::Vector4f sensor_origin =Eigen::Vector4f::Zero();
           Eigen::Quaternionf sensor_orientation =Eigen::Quaternionf::Identity ();
           if(pcl::getFieldIndex(*m_cloud,"rgb") > 0)
           {                         
           pcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2>::Ptrrgb_handler
                         (newpcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2>(m_cloud));
              m_viewer.addPointCloud(m_cloud,rgb_handler, sensor_origin, sensor_orientation);
           }
           else
           {
              pcl::visualization::PointCloudGeometryHandlerXYZ<pcl::PCLPointCloud2>::Ptrxyz_handler
                         (newpcl::visualization::PointCloudGeometryHandlerXYZ<pcl::PCLPointCloud2>(m_cloud));
              m_viewer.addPointCloud(m_cloud,xyz_handler, sensor_origin, sensor_orientation);
           }
           m_viewer.resetCamera();//使点云显示在屏幕中间,并绕中心操作
     
           CRect rect;
           GetClientRect(&rect);//实时获取MFC窗口大小
           m_win = m_viewer.getRenderWindow();
           m_win->SetSize(rect.right-rect.left,rect.bottom-rect.top);
           m_win->SetParentId(this->m_hWnd);//将vtk窗口结合到MFC窗口中
           m_iren->SetRenderWindow(m_win);
           m_viewer.createInteractor();//由于初始化设置为false,该处重新创建PCL风格的Interactor
     
           m_win->Render();
    }
    复制代码

    注意:(1)为了突出设置的重点,上面程序只是载入固定的点云,若实现打开不同文件显示的功能,可以参考MFC的相关内容。

    结果显示:

    最好在win7 环境下进行编译,在win8下编译后pcl的窗口和mfc的视图是分离的。

  • 相关阅读:
    LeetCode --- 字符串系列 --- 解码字母到整数映射
    LeetCode --- 字符串系列 --- 上升下降字符串
    LeetCode --- 字符串系列 --- 机器人能否返回原点
    集合 Set
    LeetCode --- 字符串系列 --- 唯一摩尔斯密码词
    LeetCode --- 字符串系列 --- 转换成小写字母
    LeetCode --- 字符串系列 --- 分割平衡字符串
    LeetCode --- 字符串系列 --- IP 地址无效化
    LeetCode --- 字符串系列 --- 左旋转字符串
    Revit二次开发八 事务标签值
  • 原文地址:https://www.cnblogs.com/zfluo/p/5131844.html
Copyright © 2020-2023  润新知