pcl::visualization::PCLVisualizer::addSphere运行报错“no override found for ‘vtkPolyDataMapper‘解决办法参考

开发环境、软件版本以及问题简述

在win10+vs2017+PCL1.8.1+vtk8.0.0下开发遇到如下问题:
引用头文件

#include <pcl/visualization/pcl_visualizer.h>

成功创建可视化界面:

pcl::visualization::PCLVisualizer viewer("cloud viewer");

界面背景等必要设置也都没问题后,使用以下函数在界面窗口中添加3D球体:

viewer.addSphere(point1, 20.0, 255, 0, 0, "sphere");

编译通过,没有报错,但是运行出现如下报错窗口:
在这里插入图片描述
百度上大多数解决方法都说在程序最开头(注意一定是最开头,所有#include之前)添加如下代码用以初始化vtk模块:

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL);

初始化vtk模块的语句根据具体情况有不同,比如好像vtk7.0以上的版本就需要用

VTK_MODULE_INIT(vtkRenderingOpenGL2);

我用的8.0还是写

VTK_MODULE_INIT(vtkRenderingOpenGL);

的原因我后面会说。除此之外,我看到网上还有提到用以下语句的:

VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType)

所以具体大家可能会用到什么语句自己去摸索吧,重点还是后面怎么解决编译报错的问题。
根据本人这两天不断摸索踩坑的经验,其实以上方法应该只对那些用自己通过cmake编译出来的vtk包的人有效,如果使用PCL自带的vtk包,在编译的时候就会报类似于以下的一些错误:
unresolved external symbol “void __cdecl vtkRenderingOpenGL2_AutoInit_Construct(void)” (?vtkRenderingOpenGL2_AutoInit_Construct@@YAXXZ) referenced in function “public: __thiscall vtkRenderingOpenGL2_ModuleInit::vtkRenderingOpenGL2_ModuleInit(void)” (??0vtkRenderingOpenGL2_ModuleInit@@QAE@XZ)

unresolved external symbol “void __cdecl vtkRenderingOpenGL2_AutoInit_Destruct(void)” (?vtkRenderingOpenGL2_AutoInit_Destruct@@YAXXZ) referenced in function “public: __thiscall vtkRenderingOpenGL2_ModuleInit::~vtkRenderingOpenGL2_ModuleInit(void)” (??1vtkRenderingOpenGL2_ModuleInit@@QAE@XZ)

所以说白了我的解决方法就是删除PCL自带的VTK,用cmake自己编译VTK。

Cmake与VTK源码包的准备

注意!!!因为我PCL自带的vtk版本是8.0.0,并且我已经在VS2017里面配置了包含头文件路径,库路径以及外部依赖,懒得再重新改,所以我选择编译同样是8.0.0的VTK,大家如果有需要的话可以换与自己原来版本不同的vtk,但是一定要记得在VS里面重新配置。
Cmake的下载链接:
https://cmake.org/download/
安装教程参考:
https://blog.youkuaiyun.com/u011231598/article/details/80338941
vtk8.0.0官方下载链接:
https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0
vtk8.0.0百度云下载链接:
https://pan.baidu.com/s/1atMaTJzKuPx3j1nuKmJFNA
提取码:kl3v

Cmake编译VTK并配置

参考链接1(该链接也包含PCL1.8.1以及Qt5.9的安装过程,大家可以参考):
https://blog.youkuaiyun.com/Fengyueshengqi/article/details/80619006
参考链接2:
https://blog.youkuaiyun.com/u013598629/article/details/82818128
参考链接3:
https://blog.youkuaiyun.com/sinat_25923849/article/details/78889674

Cmake编译vtk的过程大家多摸索尝试一下,不同版本的cmake选项可能有所不同。以上链接都提到要安装Qt,cmake的时候也有与Qt相关的选项,本人比较怂,还是老老实实去装了Qt,但是后来直觉告诉我应该不装也没什么问题,Cmake与Qt相关的选项跳过就行,有精力的朋友可以尝试一下。还是另外如果一步步按以上链接操作有可能在configure的时候出现报错:
在这里插入图片描述
出现报错不要慌,仔细看下报错的原因,我遇到的原因是说Qt版本不对应,然后改了Cmake里面的一些选项就好了,具体参考上面的链接2。
配置过程比较简单,上面的参考链接讲得比较清楚,网上也有很多教程和。如果大家已经安装过PCL的话相信没什么大问题了,可能就是个别外部依赖项需要进行删改,这里就不赘述了。

需要特别提醒的一点是,在Cmake编译vtk的时候有一项VTK_REMDERING_BACKND:
在这里插入图片描述
后面选择OpenGL或者OpenGL2,上面的参考链接1中说不要选择OpenGL2,否则pcl显示框会出错,但是个人觉得其实是可以选择OpenGL2的,如果大家的显卡和显卡驱动比较新的话,我认为选择OpenGL2是没什么问题的。由于时间和精力不足我并没有尝试,所以各位保险的话就先选OpenGL吧,想冒个险的就选OpenGL2~
但是请各位一定要记住自己到底选的OpenGL还是OpenGL2,因为这可能关系到我最开始说的vtk初始化模块语句是

VTK_MODULE_INIT(vtkRenderingOpenGL);

还是

VTK_MODULE_INIT(vtkRenderingOpenGL2);

(此处未经严谨验证,本人Cmake的时候选的是OpenGL,完成之后想着有大神说7.0以上的vtk得用VTK_MODULE_INIT(vtkRenderingOpenGL2);结果编译就报错了,然后改成VTK_MODULE_INIT(vtkRenderingOpenGL);就能成功运行了。)

但很神奇的一点是,PCL添加球体有三个函数重载,其中使用函数

bool pcl::visualization::PCLVisualizer::addSphere	(	const pcl::ModelCoefficients & 	coefficients,
const std::string & 	id = "sphere",
int 	viewport = 0 
)	

的时候不会报错,但是使用


bool pcl::visualization::PCLVisualizer::addSphere	(	const PointT & 	center,
double 	radius,
double 	r,
double 	g,
double 	b,
const std::string & 	id = "sphere",
int 	viewport = 0 
)	

就会出现上述问题。之所以我要用第二个函数是因为需要编辑球体颜色,所以大家没这个需要的话就可以直接用上面第一个函数来添加3D球体。

以上就是本人在使用PCL添加3D球体函数时候遇到的问题和解决方法。由于这是本人第一次写文章,如果条理和排版不太好的话请各位谅解,谢谢大家支持~

### 如何使用 `pcl::visualization::PCLVisualizer` 进行点云可视化 #### 创建并初始化 PCLVisualizer 对象 为了使用 `pcl::visualization::PCLVisualizer` 类进行点云可视化,首先需要创建一个可视化的实例。这可以通过调用默认构造函数完成: ```cpp #include <pcl/visualization/pcl_visualizer.h> // 定义一个智能指针指向 PCLVisualizer 实例 pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer")); ``` 此代码片段展示了如何声明一个新的 `PCLVisualizer` 对象,并给定窗口名称 "3D Viewer"[^2]。 #### 设置背景颜色和其他属性 可以自定义视觉效果,比如改变背景的颜色: ```cpp viewer->setBackgroundColor (0, 0, 0); // 黑色背景 ``` 这段代码设置了渲染器的背景为黑色。 #### 添加点云到视图中 一旦有了要显示的数据集(即点云集),就可以将其添加至可视化对象内: ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr cloud; // 假设已经有一个有效的 point cloud 数据结构 viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud"); ``` 这里假设存在名为 `cloud` 的有效点云计算结果;接着通过指定 ID `"sample cloud"` 将其加入到查看器当中。 #### 显示窗口并与用户交互 最后一步就是启动 GUI 循环以便实际呈现图像以及允许用户互动: ```cpp while (!viewer->wasStopped ()) { viewer->spinOnce (); } ``` 上述循环会一直运行直到用户关闭应用程序为止,在每次迭代期间都会刷新屏幕上的内容。 #### 注册点击事件回调 如果希望捕获用户的鼠标点击动作,则可注册相应的回调机制: ```cpp struct callback_args { pcl::PointCloud<pcl::PointXYZ>::Ptr clicked_points_3d; pcl::visualization::PCLVisualizer::Ptr viewerPtr; }; void pickPoint(const pcl::visualization::PointPickingEvent& event, void* args) { double x, y, z; int idx = event.getPointIndex(); if(idx == -1){ return ; } event.getPoint(x,y,z); std::cout << "You have clicked on Point with index " << idx << " at position "<< x<< ", " <<y<<", "<<z<<std::endl; } callback_args cb_args; cb_args.clicked_points_3d.reset(new pcl::PointCloud<pcl::PointXYZ>); cb_args.viewerPtr=viewer; viewer->registerPointPickingCallback(pickPoint,(void*)&cb_args); ``` 以上代码实现了当用户在图形界面上选择某个特定点时触发回调函数 `pickPoint()` 来获取所选位置的信息[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微小岳在线debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值