MFC+PCL点云(pcd文件)显示(VS2022+PCL1.13)

1.PCL安装(略过)

参考:PCL入门笔记 - PCL 1.13.0 的安装和配置(Windows) | FunnyWii Zone

        如果配过环境,只需要将PCL1.13.props文件加到属性管理器里,找到 Debug | x64,右键打开后选择添加现有属性表:

 2.MFC显示点云

 参考在c++MFC下用PCL显示操作点云文件 MFC对话框显示操作PCL点云-腾讯云开发者社区-腾讯云 (tencent.com)

 2.1控件添加

        首先添加一个pictrue_control控件,在属性里改ID为IDC_PCDVIEW,添加变量,名称改为m_pcl_view,后面再添加一个按钮控件改名为“打开PCL”。ps:不要写成下面变量名称m_viewer,否则报错,如下图。

2.2添加头文件

     在项目的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;

          并且在这个的dlg.h文件类CStatic m_pcl_view(前面窗口变量名)后面添加:

private:
	CStatic m_pcl_view;
	boost::shared_ptr<pcl::visualization::PCLVisualizer> m_viewer;//要共享指针类型的,要不然,显示窗口会跳出MFC界面
	vtkRenderWindow* m_win;   //vtk渲染的窗口句柄
	vtkRenderWindowInteractor* m_iren;//vtk交互的对象

      头文件添加完编译成功

2.3源文件

        在dlg.cpp文件的OnInitDialog()初始化函数下(TODO和return之间)添加。

// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
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

        双击“打开PCL”按钮进入按钮事件,添加如下代码。

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");

        }

      编译运行出错,

       只需将在dlg.cpp文件的如下代码注释即可运行成功

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

3.运行结果

     编译成功

    运行结果如下所示,点击“打开PCL”按钮,会进入文件目录,选择pcd文件打开如图所示。ps:好像只支持pcd文件,运行ply文件会崩溃出错

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值