转自PCL中国,原文链接:http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=223&extra=page%3D1

本人做了少量修改!

1:系统平台:XP/win7(我都做过,可以实现)
工具:visual studio 2010,PCL-1.6.0-AllInOne-msvc2010-win32,VTK5.10(用Cmake编译一下,网上都有教程,注意:PCL-1.6.0-AllInOne-msvc2010-win32中提供的VTK5.8缺少关键文件vtkMFCWindow.h和vktMFC.lib,所以无法实现)

2 实现过程
2.1 建立基于对话框的工程:PCLDialog
(我的工程路径D:\Program\VS2010\Project\PCLDialog)图1所示

2.2将我提供pclvisualization_mfc文件夹(修改过的源代码)放到自己所建的工程中文件夹下(如有需要,请回复留下邮箱,我可以发给大家)
(D:\Program\VS2010\Project\PCLDialog\PCLDialog\pclvisualization_mfc)

其中源文件和头文件,如图1所示:

将源文件和头文件添加到工程中,如图2所示
**********************************************************************************************
2.3 具体实现

2.3.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;

2.3.2
添加附加库路径(根据自己程序安装路径而定)
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;

2.3.3
为工程添加附加依赖项(我把所有需要的*.lib;文件都添加了,不一定都用的着)

附加项,见附件

2.3.4
在工程属性字符集中选择UseMulti-Byte Character Set,如果用Unicode, PCL源文件有太多要改,后面编译通不过。(总之我试着解决了,总是出错,后来就放弃了,请高手指点)

2.3.5在对话框中插入picture control控件ID:IDC_PCDVIEWER。

2.3.6
在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;

复制代码

2.3.7
初始化
    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 ();
}

复制代码

2.3.8 在BOOL CPCLDialogDlg::OnInitDialog()函数中添加
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
//利用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();
////////////////////////////////////////////////////////////////////////////////////////////////////////////

2.3.9
添加消息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);
}
}
}

复制代码

2.3.10
新建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>
2.3.11
:最终效果,图4所示

2.3.12:实现多项功能的程序效果,如图5所示

由于级别不够所以附件大小限制,这里只给出图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中新加了几个函数,随后给大家解释和用法。

把pcl的VTK显示融合到MFC(代码找原作者)的更多相关文章

  1. 一段显示隐藏列表HTML代码

    一段显示隐藏列表HTML代码, 技巧在于把页面上的元素(“返回首页”)和控制显示/隐藏的元素(id=navs-menu)放在一个共同的div上,并在该div上绑定onmouseover和onmouse ...

  2. div 显示滚动条的CSS代码

    div 显示滚动条的CSS代码   div显示上下左右滚动条 <div style="width:260px;height:120px; overflow:scroll; border ...

  3. 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码

    直接拨号.将电话号码传入拨号程序.调用拨号程序.调用系统浏览器浏览网页.调用系统程序查看联系人.显示系统设置界面和显示Wi-Fi设置界面代码 拨打号码的代码如下: Intent callIntent= ...

  4. vue打包后js和css、图片不显示,引用的字体找不到问题

    vue打包后js和css.图片不显示,引用的字体找不到问题:图片一般都是背景图片. 一.vue打包出现js和css不显示问题: 1.不使用mode:'history' 2.使用mode:'histor ...

  5. PCL Save VTK File With Texture Coordinates 使用PCL库来保存带纹理坐标的VTK文件

    我之前有一篇博客Convert PLY to VTK Using PCL 1.6.0 or PCL 1.8.0 使用PCL库将PLY格式转为VTK格式展示了如何将PLY格式文件转化为VTK格式的文件, ...

  6. OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

    OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...

  7. 十ITK读取一张dcm图像然后通过vtk显示

    一.功能 通过ITK读取一张图片(dcm格式),然后通过vtk显示出来. 版本:VS2019 itk5.0.1 vtk 8.2.0 二.程序主要思路 1-读取dcm格式图片 2-转换为vtk可以读取的 ...

  8. occ+vtk显示igs模型

    使用Opencascade读取igs文件内模型,使用vtk进行显示. 本案例环境:Opencascade6.6.0 +  vtk-5.10 + VS2005(win32) 使用CMake管理工程. C ...

  9. VTK显示.vtk格式文件

    void ReadandShowVTKFile () { vtkSmartPointer<vtkRenderer > aRenderer = vtkSmartPointer<vtkR ...

随机推荐

  1. vue.js层叠轮播

    最近写公司项目有涉及到轮播banner,一般的ui框架无法满足产品需求:所以自己写了一个层叠式轮播组件:现在分享给大家: 主要技术栈是vue.js ;javascript;jquery:确定实现思路因 ...

  2. tree:以树形结构显示目录下的内容

    tree命令 1.命令详解 [功能说明] tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容包括所有文件.子目录及子目录里的目录和文件. [语法格式] tree [option] ...

  3. __call__ 和 __str__ 魔术方法

    魔术方法,在python中,是通过触发的形式调用,之所以称为魔术方法,是因为不需要特地的打印或调用它,在某些特定的时候,他会自己调用,所谓的特定的时候,也是我们自己所输入的代码操作的,不是莫名其妙的触 ...

  4. 淘宝的开源分布式文件系统TFS

    TFS(Taobao FileSystem)是淘宝团队开源的海量非结构化数据存储设计的分布式系统.构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问.高可扩展.高可用.高性能.面向 ...

  5. Spring深入理解(三)

    Spring 中 AOP 特性详解 动态代理的实现原理 要了解 Spring 的 AOP 就必须先了解动态代理的原理,因为 AOP 就是基于动态代理实现的.动态代理还要从 JDK 本身说起. 在 Jd ...

  6. PHP扩展开发-测验成功

    原文:http://kimi.it/496.html http://blog.csdn.net/u011957758/article/details/72234075 ---------------- ...

  7. POJ 2019 Cornfields 二维线段树的初始化与最值查询

    模板到不行.. 连更新都没有.. .存个模板. 理解留到小结的时候再写. #include <algorithm> #include <iostream> #include & ...

  8. swift 声明特性 类型特性

    原文地址:http://www.cocoachina.com/newbie/basic/2014/0612/8801.html 特性提供了关于声明和类型的很多其它信息.在Swift中有两类特性,用于修 ...

  9. linux下Oracle11g RAC搭建(七)

    linux下Oracle11g RAC搭建(七) 六.安装Grid 启动GRID安装界面 方式一:redhat下调整分辨率 [root@node1 ~]# xhost +       //授权 [ro ...

  10. HDOJ GCD 2588【欧拉函数】

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...