一、搭建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);
}
}
如果有帮助到你点个赞吧!
------------------------------------------------------------
声明 | 未经允许,禁止转载!
作者 | 大胡子大叔
出品 | CSDN
-------------------------------------------------------------