MFC中嵌入VTK显示点云数据

最近折腾MFC中的PCL点云显示,折腾了很久,尝试过OpenGL方案、VTK方案等,最终整理出一套最优的方案,决定使用VTK来显示点云。博主将显示整理成一个CVtkViewer类,该类继承自CStatic,直接修改Picture控件变量的类型就可以实现显示,对点云和图像接口进行封装,使用较为方便和安全。并且使用VTK显示的类封装可以在多个窗口分别显示,如左图所示可以在两个以上的窗口分别显示不同的点云,如果使用OpenGL来实现会相当麻烦。还有就是VTK这种上层接口封装非常全面,OpenGL太偏底层了,比如VTK会自动设置合适的相机位置,而OpenGL实现同样的效果就需要自己解算位置,这也是博主放弃OpenGL的重要原因。

在这篇博客之前,你需要对VTK开发有基本了解,博主使用的是VTK7.0,PCL1.8.0,博客中对博主遇到的编译错误、运行错误等都做了详细解释,希望能有帮助。

博主参考了大量资料,前排放一些有价值的参考链接:

http://blog.****.net/wishchin/article/details/45887561

http://blog.****.net/wishchin/article/details/45951543

http://blog.sina.com.cn/s/blog_e7783fcf0102xqip.html

http://tieba.baidu.com/p/5131946762

创建CVtkViewer类

下面提供了CVtkViewer类的源码,这里对源码做简单的解释:

1.该类继承自CStatic,支持CStatic的几乎所有操作,但是MoveWindow会改变位置,不会改变大小,所以类中有对MoveWindow的重载

2.显示接口有两个,一个是自定义的RGBXYZ点云裸数据接口,ReadPointCloud,另一个是vtkImageData接口,vtkImageData不仅支持二维图像,也支持三维图像,更多消息请移步百度

3.注意头文件中这样一段代码#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkInteractionStyle) VTK_MODULE_INIT(vtkRenderingFreeType),你可以先去掉这一段代码,在Debug模式下看看VTK是否有错误消息,如果没有错误消息就不要加这几行代码,这是由于使用本地编译器编译VTK时有些宏没有定义,会导致一些错误。vtk还有很多奇葩错误,参见我前一篇博客。

4.点云显示的接口,有一段注释掉了,如果你只想显示单色点云,那么可以使用被注释掉的那段代码,如果想显示彩色点云,就不需要修改

5.头文件最后还注释掉了一个类,如果你想多串口同步移动相机,可以通过这个类同时向多个窗口发送命令,详细参见开头给出的链接,虽仍然博主想到其它更简单的方法,但是没有博主的项目没有需求,就没有加进来。

6.在Debug模式下,关闭窗口时会有VTK Error 1208,应该和OpenGL或者Render有关,目前还没有查出来,如果你解决了这个问题,非常希望你能留言告知,这是这个类中(目前发现的)唯一的瑕疵,博主将非常感激。

好了,粘代码吧,首先是头文件:

然后是cpp文件:

在对话框类中使用

首先拖几个Picture Control进来,然后修改控件ID为IDC_VTK1,这里小心IDC_STATIC是不能接收消息的,必须修改成其它的,然后右键添加环境变量为CStatic,然后将其改为CVtkViewer类型

MFC中嵌入VTK显示点云数据

这时候你可以编译下,会发现这些Picture Control直接变成了黑色,这就说明VTK窗口工作了。

然后就是添加电源数据显示了,在对话框窗口的OnPaint函数中进行绘制,使用方法非常简单,就像下面这样

这是博主目前一个软件的显示效果图:

MFC中嵌入VTK显示点云数据

好了,最后还是非常感谢开头链接给出的参考代码。

分享到微信





zhuan :http://www.p-chao.com/2017-09-28/mfc%E4%B8%AD%E5%B5%8C%E5%85%A5vtk%E6%98%BE%E7%A4%BA%E7%82%B9%E4%BA%91%E6%95%B0%E6%8D%AE/