pcl经典算法60例——(1)打开并显示点云,窗口PCLVisualizer嵌入MFC的picture control及源码下载

一、搭建MFC框架

1、环境说明

本教程为vs2022,pcl1.12.1版本,其他版本自己进行适当修改,仅供参考。

2、方法步骤

(1)新建项目,选择“基于对话框”,然后点击“下一步”

 

二、配置pcl环境

关于配置环境,网上很多教程,本人的“pcl专栏”里面也有详细说明,自己慢慢做,不要着急,最后配置完成后就可以进行下一步了。

PCL 1.12.1库目录、包含目录及输入lib库文件名称详细配置说明_大胡子大叔的博客-CSDN博客

pcl1.12.1重新安装boost库_大胡子大叔的博客-CSDN博客

三、添加picture control和button,显示渐变色点云代码

在窗口中添加picture control,id为“IDC_STATIC”

        网上很多的资料写的都是获取MFC窗口的大小,实际是不对的,如果可着整个MFC窗口绘制picture control
        比例上是可以这么用的,但是我的窗口除了picture control还有很多按钮,占用了MFC的面积
       所以直接用MFC窗口的尺寸是有问题的,尤其是在给窗口分割成好几个窗口的时候,会发现比例是不对的

        GetClientRect(&rect);//实时获取MFC窗口大小

        用下面的这句,就可以获得picture control的尺寸了,窗口分割的时候就不会发生问题了
        GetDlgItem(IDC_STATIC)->GetClientRect(&rect);

 放到头文件里的声明

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

 放到cpp文件里的代码,在“BOOL CMFCPCLSHFDlg::OnInitDialog()”里面插入窗口的初始化代码

//==========================将viewer窗口结合到MFC图像控件上===========================

	//显示窗口初始化

	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;
	//网上很多的资料写的都是获取MFC窗口的大小,实际是不对的,如果可着整个MFC窗口绘制picture control
	// 比例上是可以这么用的,但是我的窗口除了picture control还有很多按钮,占用了MFC的面积
	// 所以直接用MFC窗口的尺寸是有问题的,尤其是在给窗口分割成好几个窗口的时候,会发现比例是不对的
	//GetClientRect(&rect);//实时获取MFC窗口大小
	//用下面的这句,就可以获得picture control的尺寸了,窗口分割的时候就不会发生问题了
	GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
	m_win->SetSize(rect.right - rect.left, rect.bottom - rect.top);//根据当前窗口的大小设置vtk 窗口的大小
	CWnd* viewer_pcWnd;
	viewer_pcWnd = this->GetDlgItem(IDC_STATIC);//获取对应的wnd
	m_win->SetParentId(viewer_pcWnd->m_hWnd);//设置vtk窗口的句柄
	m_iren->SetRenderWindow(m_win);//将vtk交互对象与vtk window绑定 
	m_viewer->createInteractor();
	m_win->Render();//开始渲染

	vtkOutputWindow::SetGlobalWarningDisplay(0);//不弹出vtkOutputWindow窗口

 上图是本人写的一个pcl的c++框架,第一个“打开点云”按钮就是这样的效果了

button1按钮里面的代码

void CMFCPCLSHFDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	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> color_h(pcd_src, 0, 255, 0);//点云为绿色
		//按照z方向深度进行渲染(带渐变色)
		pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color_h(cloud, "z");
		m_viewer->addPointCloud<pcl::PointXYZ >(cloud, color_h, "sample cloud");
		m_viewer->addText("show cloud", 0, 20);

	}
}

如果有帮助到你点个赞吧!

如果不想自己动手,上面的程序所有源码在下面的地址,自行下载

https://download.csdn.net/download/sunnyrainflower/88073746
------------------------------------------------------------

声明 | 未经允许,禁止转载!

作者 | 大胡子大叔

出品 | CSDN

-------------------------------------------------------------

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大胡子大叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值