继承PCL可视化类,实现坐标轴、PNG图片、颜色表的显示

pcl::visualization::PCLVisualizer是pcl中的可视化类,支持点云显示,点云拾取,点云框选等,但是无法添加图片和颜色表。通过继承PCLVisualizer类可以灵活添加坐标轴、图片和颜色表。

参考了pcl源码之后实现了上面几个功能,效果如下。

左下角添加了坐标轴,其位置通过参数给出,固定不可移动
右上角添加了一个PNG图片显示
右下角添加了一个颜色条

实现代码

main.cpp

#include <vtkRenderWindow.h>
#include <vtkPNGReader.h>
#include <vtkImageData.h>
#include <vtkLogoRepresentation.h>
#include <vtkLogoWidget.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>
#include <vtkScalarBarWidget.h>
#include <vtkScalarBarActor.h>
#include <vtkScalarBarRepresentation.h>
#include <vtkColorTransferFunction.h>#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/point_cloud_color_handlers.h>using namespace std;/*继承了PCL的可视化类 pcl::visualization::PCLVisualizer,实现坐标轴/LOGO图片/颜色表的显示*/
class My_View :public pcl::visualization::PCLVisualizer
{public:My_View(string name, bool initIterator) :pcl::visualization::PCLVisualizer(name, initIterator){;}/** \brief Adds a widget which shows an Logo image display*  \param[in] interactor - Pointer to the vtk interactor object used by the PCLVisualizer window*  \param[in] name - imagefilename*  \param[in] x - x-position*  \param[in] y - y-position*  \param[in] x_wide - x-scalar*  \param[in] y_wide - y-scalar*  \param[in] opaticy - opaticy*/void addLogoWidgetToview(vtkRenderWindowInteractor* interactor, const std::string &name, double &x, double &y, double &x_wide, double &y_wide, double &opaticy);/** \brief Adds a widget which shows an vtkScalarBarWidget*  \param[in] interactor - Pointer to the vtk interactor object used by the PCLVisualizer window*  \param[in] lut - lookuptable*  \param[in] x - x-position*  \param[in] y - y-position*  \param[in] x_wide - x-scalar*  \param[in] y_wide - y-scalar*/void addScalarBarWidgetToView(vtkRenderWindowInteractor* interactor, vtkLookupTable* lut, double &x, double &y, double &x_wide, double &y_wide);vtkSmartPointer<vtkScalarBarWidget> getScalarBarWidgetMember();/** \brief Adds a widget which shows an interactive axes display for orientation*  \param[in] interactor - Pointer to the vtk interactor object used by the PCLVisualizer window*  \param[in] x - x-position*  \param[in] y - y-position*  \param[in] x_wide - x-scalar*  \param[in] y_wide - y-scalar*/void addOrientationMarkerWidgetAxesToview(vtkRenderWindowInteractor* interactor, double x, double y, double x_wide, double y_wide);private:/** \brief Internal pointer to widget which contains a logo_Widget_ */vtkSmartPointer<vtkLogoWidget> logo_Widget_member_;/** \brief Internal pointer to widget which contains a scalarbar_Widget_ */vtkSmartPointer<vtkScalarBarWidget> scalarbar_Widget_member_;/** \brief Internal pointer to widget which contains a set of axes */vtkSmartPointer<vtkOrientationMarkerWidget> axes_widget_member_;};vtkSmartPointer<vtkScalarBarWidget> My_View::getScalarBarWidgetMember()
{return scalarbar_Widget_member_;
}void My_View::addLogoWidgetToview(vtkRenderWindowInteractor* interactor, const std::string &name, double &x, double &y, double &x_wide, double &y_wide, double &opaticy)
{if (!logo_Widget_member_){vtkSmartPointer<vtkPNGReader> reader = vtkSmartPointer<vtkPNGReader>::New();reader->SetFileName(name.c_str());/*no multiple coding format*/reader->Update();vtkSmartPointer<vtkLogoRepresentation> logoRepresentation = vtkSmartPointer<vtkLogoRepresentation>::New();logoRepresentation->SetImage(reader->GetOutput());logoRepresentation->SetPosition(x, y);logoRepresentation->SetPosition2(x_wide, y_wide);/*0.12, 0.05*/logoRepresentation->GetImageProperty()->SetOpacity(opaticy);/*0.9*/logoRepresentation->SetShowBorderToOff();/*no edgeline*/logo_Widget_member_ = vtkSmartPointer<vtkLogoWidget>::New();logo_Widget_member_->SetInteractor(interactor);logo_Widget_member_->SetRepresentation(logoRepresentation);logo_Widget_member_->SetEnabled(true);/*enable show*/logo_Widget_member_->ProcessEventsOff();/*disable move*/}else{logo_Widget_member_->SetEnabled(true);pcl::console::print_warn(stderr, "LogoWidget Widget already exists, just enabling it");}
}void My_View::addScalarBarWidgetToView(vtkRenderWindowInteractor* interactor, vtkLookupTable* lut, double &x, double &y, double &x_wide, double &y_wide)
{if (!scalarbar_Widget_member_){/*Scalarbar Actor*/vtkSmartPointer< vtkScalarBarActor > scalarBarActor = vtkSmartPointer< vtkScalarBarActor >::New();scalarBarActor->SetOrientationToHorizontal();scalarBarActor->SetLookupTable(lut);/*ScalarBar Widget*/scalarbar_Widget_member_ = vtkSmartPointer< vtkScalarBarWidget >::New();scalarbar_Widget_member_->SetInteractor(interactor);scalarbar_Widget_member_->SetScalarBarActor(scalarBarActor);//scalarBarWidget->setscalarbar_Widget_member_->On();}else{/*Scalarbar Actor*/vtkSmartPointer< vtkScalarBarActor > scalarBarActor = vtkSmartPointer< vtkScalarBarActor >::New();scalarBarActor->SetOrientationToHorizontal();scalarBarActor->SetLookupTable(lut);/*ScalarBar Widget*///scalarbar_Widget_.scalarbar_Widget_member_ = vtkSmartPointer< vtkScalarBarWidget >::New();scalarbar_Widget_member_->SetInteractor(interactor);scalarbar_Widget_member_->SetScalarBarActor(scalarBarActor);//scalarBarWidget->setscalarbar_Widget_member_->On();}
}void My_View::addOrientationMarkerWidgetAxesToview(vtkRenderWindowInteractor* interactor, double x, double y, double x_wide, double y_wide)
{if (!axes_widget_member_){vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();axes_widget_member_ = vtkSmartPointer<vtkOrientationMarkerWidget>::New();axes_widget_member_->SetOutlineColor(0.9300, 0.5700, 0.1300);axes_widget_member_->SetOrientationMarker(axes);axes_widget_member_->SetInteractor(interactor);axes_widget_member_->SetViewport(x, y, x_wide, y_wide);axes_widget_member_->SetEnabled(true);axes_widget_member_->InteractiveOn();axes_widget_member_->InteractiveOff();}else{axes_widget_member_->SetEnabled(true);pcl::console::print_warn(stderr, "Orientation Widget Axes already exists, just enabling it");}
}int main(int argc, char *argv[])
{/*初始化视图*/boost::shared_ptr<My_View> viewer_;viewer_.reset(new My_View("viewer", true));/*添加Logo图片到视图左上角*/std::string logofilename = "png.png";double x = 0.80, y = 0.80/*0.93*/, x_wide = 0.2/*0.12*/, y_wide = 0.1/*0.05*/, opacity = 0.9;viewer_->addLogoWidgetToview(viewer_->getRenderWindow()->GetInteractor(), logofilename, x, y, x_wide, y_wide, opacity);/*添加坐标轴到视图的左下角*/viewer_->addOrientationMarkerWidgetAxesToview(viewer_->getRenderWindow()->GetInteractor(), 0.0, 0.0, 0.2, 0.2);/*添加颜色列表到视图右下角*/vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();color->AddRGBPoint(0.0, 1.0,0.0,0.0);/*red*/color->AddRGBPoint(0.5, 0.0, 1.0, 0.0);/*green*/color->AddRGBPoint(1.0, 0.0, 0.0, 1.0);/*blue*/color->SetColorSpaceToRGB();color->SetNanColor(1.0, 1.0, 0);vtkSmartPointer< vtkLookupTable > lut = vtkSmartPointer< vtkLookupTable >::New();lut->SetNumberOfColors(64);for (int i = 0; i < 64; i++){double d[3] = { 0.0 };double *pd = color->GetColor(i / 64.0);d[0] = pd[0]; d[1] = pd[1]; d[2] = pd[2];lut->SetTableValue(i, d[0], d[1], d[2]);}lut->SetTableRange(0.0, 1.0);lut->Build();double x1 = 0.9, y1 = 0.0,/*0.93*/ x_wide1 = 0.08/*0.12*/, y_wide1 = 0.35;/*0.05*/int maxsize[2] = { 50, 100 };int minsize[2] = { 50, 100 };vtkSmartPointer<vtkScalarBarRepresentation > scalarBarRep = vtkSmartPointer<vtkScalarBarRepresentation >::New();scalarBarRep->SetPosition(x1, y1);/*在pcl visual中的位置*/scalarBarRep->SetPosition2(x_wide1, y_wide1);/*0.2, 0.2等效于上面的两行代码*///scalarBarRep->SetMaximumSize(20, 50);/*最大*/    //scalarBarRep->SetMinimumSize(minsize);/*最小*/scalarBarRep->SetShowBorderToOn();/*Invalid*/scalarBarRep->SetShowBorder(true); //scalarBarRep->SetShowBorderToActive();//scalarBarRep->SetShowHorizontalBorder(true); //scalarBarRep->SetShowVerticalBorder(true);viewer_->addScalarBarWidgetToView(viewer_->getRenderWindow()->GetInteractor(), lut, x1, y1, x_wide1, y_wide1);/*添加Widget到View*/scalarBarRep->SetScalarBarActor(viewer_->getScalarBarWidgetMember()->GetScalarBarActor());/*设置代理对象为Widget*/viewer_->getScalarBarWidgetMember()->SetRepresentation(scalarBarRep);/*为Widget设置代理*/viewer_->getScalarBarWidgetMember()->GetScalarBarActor()->SetLabelFormat("%5.2f");/*尺度的刻度值*/viewer_->getScalarBarWidgetMember()->GetScalarBarActor()->SetMaximumWidthInPixels(70);viewer_->spin();}

CMakeLists

cmake_minimum_required (VERSION 2.6 FATAL_ERROR)project(pcl_visualization_test)
find_package (VTK REQUIRED)
find_package (PCL 1.8.1 REQUIRED)include_directories(${Boost_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS})
link_directories    (${PCL_LIBRARY_DIRS})
add_definitions     (${PCL_DEFINITIONS})ADD_DEFINITIONS(-D _XKEYCHECK_H)
ADD_EXECUTABLE  (Demo main.cpp)TARGET_LINK_LIBRARIES (Demo ${PCL_LIBRARIES} ${VTK_LIBRARIES})

参考资料

VTK的数据结构

在PCLVisualizer中添加坐标轴和图片和颜色表相关推荐

  1. Altium Designer 19如何在PCB中添加自己的图片Logo

    Altium Designer 19如何在PCB中添加自己的图片Logo 如何为自己的PCB添加图片Logo呢?其实很简单,接下来我就和大家分享一下我的学习总结,如有不足请各位巨佬指正,感谢!!! 准 ...

  2. android项目添加图片,安卓开发:往项目中添加并使用图片

    一 往项目中添加图片文件 (1)iOS项目 在iOS项目中,如果往项目中添加的图片是png格式的,就是往Assets.xcassets文件夹中添加. 如果不是png格式,比如jpg格式的图片,就不能往 ...

  3. html表格中加入内容吗,制作html帖第二课:在表格中添加文字和图片

    3.在html格式下插入图片代码及图片地址 帖图基本格式如下: 称图形标记,主要用来插入图形标记. 方法:在表格中输入"内容"两字,点开html将你编辑好的代码及图片地址粘贴上, ...

  4. 使用Adobe Acrobat X Pro在PDF中添加文字和图片

    在pdf中添加文字: 使用右侧"工具">"内容">"添加或编辑文本框"来打开"打字机"工具栏.单击pdf中的 ...

  5. svg.draggable.js 实现动态向svg中添加图形和图片并可以拖拽

    源码: <!doctype html> <html> <head><meta charset="utf-8"><title&g ...

  6. java实现在pdf中添加文字和图片

    一.在pom文件中引入对应的包: <dependency><groupId>com.itextpdf</groupId><artifactId>itex ...

  7. ListView条目item中 添加按钮或者图片 弹出对话框

    UI布局 效果 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPEAAACPCAYAAAAr4z24AAAgAElE ...

  8. 在Flutter中添加图片

    先看效果图 配置:需要支持多分辨率的本地图片(红色框是1.0x图片,想支持更多分辨率也可以新建对应几X文件) 注意 1:橙色的assets和上面的橙色的uses-material-design对齐 2 ...

  9. java 多行 n_Java实现向Word添加多行图片水印

    码农公社  210.net.cn  210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图 ...

最新文章

  1. VMware虚拟化技术培训(11) 小结
  2. StringUtils 正则校验
  3. TypeError系列之:TypeError: only size-1 arrays can be converted to Python scalars
  4. linux——客户端服务器文件传输
  5. GitHub推出“AI程序员”插件 !
  6. 58岁退休女士,想出去旅游却很难约到合适的伴,怎么办?
  7. 马云自评英语水平;支付宝推刷脸支付;苹果研发基带芯片 | 极客头条
  8. 计算机网络2020秋--第四次测验
  9. mysql hash索引_mysql hash索引
  10. VS2015安装教程详细步骤及配置Opencv4.1.1(亲测)
  11. 谷歌VR展示360度全景图
  12. 从零开始iOS8编程【HelloWorld】
  13. 为什么python代码运行不了_Python | 为什么优化代码?
  14. 关于微信公众号开发【微信JS-SDK】报错:config invalid url domian
  15. 迪克斯特拉(Dijkstra)算法之MATLAB实现
  16. 如何将svg格式图片转换为其他格式图片,如png
  17. 无法启动此程序因为计算机丢失msvcr110.dll,Win7运行程序提示计算机中丢失msvcr110.dll如何解决...
  18. 硬盘盒CE认证-EMC测试标准与流程
  19. vuejs的render渲染函数
  20. 【语音识别】语音识别技术入门

热门文章

  1. 爬取古诗文网的推荐古诗
  2. 【转】磁场传感器和方位(上)
  3. chatgpt智能提效职场办公-ppt怎么设置背景图片
  4. oracle 根据符号分列,oracle 树结构数据层次分列显示
  5. background-image无法显示图片
  6. MAC | svn: E175002: DAV request failed: 411 Content length required.
  7. python项目实战:控制Windows电脑桌面壁纸
  8. 新手必看的模具设计十大分模法,干货满满!!!
  9. bash shell脚本实例合集
  10. 展示 用户画像_到底如何做用户画像?