把pcl的VTK显示融合到MFC(代码找原作者)
转自PCL中国,原文链接:http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=223&extra=page%3D1
1:系统平台:XP/win7(我都做过,可以实现)
其中源文件和头文件,如图1所示:
为工程添加额外引用路径(根据自己程序安装路径而定)
C:\Program Files\VTK5.10\include\vtk-5.10;
C:\Program Files\PCL 1.6.0\3rdParty\Boost\include;
C:\Program Files\PCL 1.6.0\include\pcl-1.6;
C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include;
C:\Program Files\PCL 1.6.0\3rdParty\Flann\include;
D:\Program\VS2010\Project\PCLDialog\PCLDialog;
添加附加库路径(根据自己程序安装路径而定)
C:\Program Files\PCL 1.6.0\3rdParty\Qhull\lib;
C:\Program Files\VTK5.10\lib;
C:\Program Files\PCL 1.6.0\3rdParty\Boost\lib;
C:\Program Files\PCL 1.6.0\lib;
C:\Program Files\PCL 1.6.0\3rdParty\Flann\lib;
C:\Program Files\OpenNI\Lib;
C:\Program Files\PCL 1.6.0\3rdParty\Eigen\bin;
为工程添加附加依赖项(我把所有需要的*.lib;文件都添加了,不一定都用的着)
附加项,见附件
在工程属性字符集中选择UseMulti-Byte Character Set,如果用Unicode, PCL源文件有太多要改,后面编译通不过。(总之我试着解决了,总是出错,后来就放弃了,请高手指点)
在PCLDialog.h中添加
#include "pcl\point_cloud.h"
#include "pcl\point_types.h"
#include "pclvisualization_mfc\include\pcl_mfc_visualizer.h"
#include "vtkRenderer.h"
#include <pcl/io/pcd_io.h>
复制代码
private:
//视图窗口
pcl::mfc_visualization::PCLVisualizer *viewer;
//vtkRenderer *pvtkRenderer;
POINT ptBorder;
//数据点
sensor_msgs::PointCloud2::Ptr binary_blob;
//数据点句柄
pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2>::Ptr xyz_Handler;
pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2>::Ptr color_Handler;
//传感器位置方向矩阵
Eigen::Vector4f sensor_origin;
Eigen::Quaternion<float> sensor_orientation;
复制代码
初始化
CPCLDialogDlg::CPCLDialogDlg(CWnd* pParent /*=NULL*/): CDialogEx(CPCLDialogDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
///////////////////////////////////////////////////////////////////////////////////////////////////
//begin tyz
//初始化
this->viewer = NULL;
sensor_origin = Eigen::Vector4f::Zero();
sensor_orientation = Eigen::Quaternionf::Identity ();
}
复制代码
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//利用PictControl控件加载PCD窗口
CWnd *viewer_pcWnd;
viewer_pcWnd = this->GetDlgItem(IDC_PCDVIWER);
this->viewer = new pcl::mfc_visualization::PCLVisualizer(viewer_pcWnd);
CRect cRectPCL;
this->viewer->GetClientRect(&cRectPCL);
CRect cRectClient;
GetClientRect(&cRectClient);
this->ptBorder.x = cRectClient.Width() - cRectPCL.Width();
this->ptBorder.y = cRectClient.Height() - cRectPCL.Height();
////////////////////////////////////////////////////////////////////////////////////////////////////////////
添加消息WM_SIZE响应函数OnSize,保证PCLVisualizer窗口viewer随对话框变化。
void CPCLDialogDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (::IsWindow(this->GetSafeHwnd())) {
if (this->viewer){
cx -= ptBorder.x;
cy -= ptBorder.y;
this->GetDlgItem(IDC_PCLVIWER)->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
this->viewer->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
}
}
}
复制代码
新建button控件,caption:Open PCD,ID:IDC_OPENPCD,为控件添加响应函OnBnClickedOpenpcd()
void CPCLDialogDlg::OnBnClickedOpenpcd()
{
this->viewer->removeAllPointClouds ();
// TODO: Add your control notification handler code here
static TCHAR BASED_CODE szFilter[] = _T("PCD (*.pcd )|*.pcd||");
CFileDialog cFileDialog(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT| OFN_NOCHANGEDIR ,szFilter);
if (cFileDialog.DoModal() == IDOK)
{
/////////////////////////////////////////////////////////////////////////////
//文档名称
std::string filename;
filename = cFileDialog.GetFileName();
//reset data
this->binary_blob.reset();
binary_blob = sensor_msgs::PointCloud2::Ptr (new sensor_msgs::PointCloud2);
// read new data
//*.pcd文件
pcl::PCDReader pcd_reader;
if (pcd_reader.read ((char*)_bstr_t(filename.c_str()), *binary_blob) != 0) //* load the file
{
MessageBox (_T("Couldn't read PCData file!"));
return;
}
}
if (binary_blob == NULL)
{
MessageBox("Please load PCD file firstly!");
return;
}
else
{
//其他句柄
if (pcl::getFieldIndex(*binary_blob, "rgb") > 0)
{
color_Handler = pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2>::Ptr
(new pcl::mfc_visualization::PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2> (binary_blob));
this->viewer->addPointCloud(binary_blob, color_Handler, sensor_origin, sensor_orientation);
}
else
{
xyz_Handler = pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2>::Ptr
(new pcl::mfc_visualization::PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2> (binary_blob));
this->viewer->addPointCloud(binary_blob, xyz_Handler, sensor_origin, sensor_orientation);
}
this->viewer->resetCamera();
}
}
<em>复制代码</em>
:最终效果,图4所示
由于级别不够所以附件大小限制,这里只给出图4和图5,图1~3不重要,所以不给出了。压缩文件是修改好的源代码(如有需要请回复留下邮箱,我可以发给大家),按说明操作即可。
修改源代码的使用请看如何实现基于MFC对话框的PCL显示(4)——关于修改源代码的使用。
-
图5 实现多功能对话框的效果图.png(264.06 KB, 下载次数: 11)
-
图4 最终效果图.png(71.08 KB, 下载次数: 6)
附加注释:
转载请注明出处(http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=227&extra=)
所提供的修改源代码(如有需要,回复留下邮箱,我发给大家)是基于PCL官网提供的源文件(PCL-1.6.0-Source.tar.bz2)内的visualization文件夹下的相关源文件和头文件的基础上修改完成的。主要思想是基于vtkMFCWindow类实现的,将PCL显示窗口类pcl::visualization::PCLVisualizer由原来的基于vtkRenderWindow类改成基于vtkMFCWindow类的新类pcl::mfc_visualization::PCLVisualizer。而且新类需要指向所依托显示的子窗口句柄(有机会在慢慢解释给大家吧,还没太理顺,大概就是这么个思想)。
修改源代码 相当于对原pcl::visualization Namespace 修改得pcl::mfc_visualization Namespace,所以在使用过程中,相关功能的实现可以参照官网教程,但是涉及到pcl::visualization Namespace的全部修改为pcl::mfc_visualization。
例如前面在新建pcl::visualization::PCLVisualizer类时MFC对话框应用中需要新建pcl::mfc_visualization::PCLVisualizer类,其他的也类似,如数据点句柄(参见如何实现基于MFC对话框的PCL显示
2的新建私有变量代码)。
对象pcl::mfc_visualization::PCLVisualizer *viewer的初始化,在构造对话框时
this->viewer=NULL;
对话框初始化时将viewer指向Picture Control的窗口句柄
CWnd *viewer_pcWnd;
viewer_pcWnd = this->GetDlgItem(IDC_PCDVIWER);
this->viewer = new pcl::mfc_visualization::PCLVisualizer(viewer_pcWnd);<em>复制代码</em>
经过以上几步就可完成窗口的基本建设,剩下的都是MFC对话框的基本性质了。还有我在
pcl::mfc_visualization Namespace中新加了几个函数,随后给大家解释和用法。
最新文章
- java MAVEN 项目出现红叉
- 操作TAB文件和TStringGrid赋值;
- Android和Java的轻巧Wire协议缓冲器
- Java集合类详解
- Foreign Exchange(交换生换位置)
- ffmpeg合并多个视频
- LeetCode:36. Valid Sudoku,数独是否有效
- Ansible - 简介和应用自动化基础实践
- 【前端】Vue2全家桶案例《看漫画》之一、添加四个导航页
- DB2开发系列之三——SQL函数
- 结对作业NO.2
- ng-model-options 时延
- Mysql 数据类型、约束类型
- Java过滤器与SpringMVC拦截器的差异学习笔记
- 加载JS代码
- HTTP 请求头 Header
- jQuery-选择器-查找标签
- 【20181031T2】几串字符【数位DP思想+组合数】
- StreamSets 部署 Pipelines 到 SDC Edge
- onvif 开发中的一些重要函数介绍
热门文章
- 关于如何利用js判断IE浏览器各种版本问题
- 解决windows文件在linux系统中显示乱码的问题
- 了解CSS overflow属性 标签: htmlcss属性 2016-12-31 14:38 75人阅读 评论(1)
- elementUI 图片上传限制上传图片的宽高
- 痛苦的Windows下的temp目录
- 百度之星2014初赛 - 1002 - Grids
- CodeForces - 340 C - Tourist Problem
- logstash-input-jdbc实现mysql 与elasticsearch实时同步(ES与关系型数据库同步)
- 关于使用sudo命令后找不到JAVA_HOME的问题
- Servlet 实现訪问量的统计小案例