PCLlab(1)基于MFC单文档框架的pcd文件显示
来源:互联网 发布:文登政府网通知公告栏 编辑:程序博客网 时间:2024/06/05 17:35
pointcloud library(PCL)是目前发展势头最猛的三维点云处理库,并且在许多领域都扮演者重要的角色。为了能让大家更好的了解和使用pcl库,我们现在正在着手名为PCLlab的项目,目标是集成pcl中的算法实现类似meshlab功能的软件。对于pcl的操作,我们需要借助MFC,QT之类的平台来实现界面操作。目前我们主要以MFC平台来集成各个算法。
所以第一个问题就是最基本的显示功能:如何将pcl中产生的分离窗口与MFC窗口结合。
要实现该功能需要以下几个关键设置:不需要重新继承其他类,只需要做一些简单设置即可实现
(1)实例化的初始设置
pcl::visualization::PCLVisualizer m_viewer("PCL",false);
注意:初始化时必须设置成false,否则窗口始终是分离。如果要在类中实例化,由于这种实例化方式不允许,所以可以在pcl_visualizer.h中将构造函数的默认值改为false。
(2)设置显示窗口的父窗口
m_win =m_viewer.getRenderWindow();
m_win->SetParentId(this->m_hWnd);
(3)添加点云前要删除所有点云,否则无法显示。如果只是一次性载入的话,可以省略这步。
m_viewer.removeAllPointClouds();
核心程序
PCLlabView.h
视图类头文件
#include <iostream>
#include "pcd_io.h"
// PCL
#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>
变量定义
//Implementation
private:
pcl::PCLPointCloud2::Ptr m_cloud;
pcl::visualization::PCLVisualizer m_viewer;
vtkSmartPointer<vtkRenderWindow> m_win;
vtkSmartPointer<vtkRenderWindowInteractor> m_iren;
PCLlabView.cpp
主要设置构造函数和OnDraw函数
CPCLlabView::CPCLlabView()
{
// TODO: addconstruction code here
m_win = m_viewer.getRenderWindow();
m_iren = vtkRenderWindowInteractor::New();//重新申请地址
}
void CPCLlabView::OnDraw(CDC* /*pDC*/)
{
CPCLlabDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(!pDoc)
return;
// TODO: adddraw code for native data here
std::string filename ="pcl_logo.pcd";
if(pcl::io::loadPCDFile(filename,*m_cloud ) == -1)// load the file
{
PCL_ERROR ("Couldn't read file");
}
m_viewer.setBackgroundColor( 0.0, 0.0,0.0 );
m_viewer.removeAllPointClouds();//该函数不加则不显示
//显示不同类型pcd文件
Eigen::Vector4f sensor_origin =Eigen::Vector4f::Zero();
Eigen::Quaternionf sensor_orientation =Eigen::Quaternionf::Identity ();
if(pcl::getFieldIndex(*m_cloud,"rgb") > 0)
{
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2>::Ptrrgb_handler
(newpcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2>(m_cloud));
m_viewer.addPointCloud(m_cloud,rgb_handler, sensor_origin, sensor_orientation);
}
else
{
pcl::visualization::PointCloudGeometryHandlerXYZ<pcl::PCLPointCloud2>::Ptrxyz_handler
(newpcl::visualization::PointCloudGeometryHandlerXYZ<pcl::PCLPointCloud2>(m_cloud));
m_viewer.addPointCloud(m_cloud,xyz_handler, sensor_origin, sensor_orientation);
}
m_viewer.resetCamera();//使点云显示在屏幕中间,并绕中心操作
CRect rect;
GetClientRect(&rect);//实时获取MFC窗口大小
m_win = m_viewer.getRenderWindow();
m_win->SetSize(rect.right-rect.left,rect.bottom-rect.top);
m_win->SetParentId(this->m_hWnd);//将vtk窗口结合到MFC窗口中
m_iren->SetRenderWindow(m_win);
m_viewer.createInteractor();//由于初始化设置为false,该处重新创建PCL风格的Interactor
m_win->Render();
}
(2)附件中是测试文件,结果如下:
- PCLlab(1)基于MFC单文档框架的pcd文件显示
- 基于MFC单文档的PCL显示
- MFC 单文档框架最大化显示
- MFC基于单文档写unicode的文件
- 基于+文件流的txt点云转pcd
- 基于MFC单文档SDI的OpenGL图形程序的基本框架
- 基于MFC的单文档,多文档,对话框应用程序
- MFC 单文档框架的主菜单创建时间
- MFC单文档框架理解
- MFC 单文档 显示图片
- 修改基于formView的MFC单文档背景颜色
- 基于MFC单文档程序的CheckBox运用
- VC MFC基于单文档的皮肤更换
- MFC基于单文档菜单栏调用对话框的实现
- MFC单文档打开文件
- MFC单文档打开文件
- MFC单文档打开文件
- MFC单文档打开文件
- 思维误区
- 紧跟电商步伐,切勿误入歧途
- JAVA学习第八课(构造函数及其特点+构造代码块)
- nyoj 44 子串和
- Cocos2d-x Box2d中实现刚体的移动
- PCLlab(1)基于MFC单文档框架的pcd文件显示
- POJ-1990
- 链表的基本操作
- strstr()函数的具体实现
- sqoop 1.4.5 增量导入hive 0.12.0
- wordpress备份
- 利用Calabash-Android刷广告
- 链表的逆序,排序等
- ASP.NET CS文件中输出JavaScript脚本的3种方法以及区别