C#调用C++编写VTK控件显示点云
文章目录
前言
最近在做三维点云相关的事情,中途需要设计一个基于C#的点云显示控件,由于自己的算法是用C++写的,在网上找了一圈之后决定用VTK做这个事情,因为PCL的点云显示底层用的也是VTK,但是在网上找了一圈之后发现基于C#的VTK没有源码,只有相关库,这个对后续出现Bug后的排查十分不优化,因此这个方法便被我排除了。后续在厕所沉思时突然来了灵感(哈哈哈,请大家忽略这个地点),用CLI的方式,在中间层用C++调用VTK编写一个可以供C#调用的类,然后再在C#端将其封装成一个控件即可。说时迟那时快,我便按着这个思路开始实践了。
一、VTK是什么?
VTK具体介绍请大家移步到这: 钢铁男儿查看
二、实现步骤
1.编译或下载VTK库(我个人推荐自己编译VTK库)
VTK源码地址:VTK
VTK利用源码编译库的方法:参考博主风烟倦
2.VS2017配置VTK
配置地址:参考博主知识海洋里的咸鱼
3.CLI调用VTK,编写点云显示类(重点)
以下是Display.cpp的具体:
Display.cpp
#include "pch.h"
#include "DIsplay3dData.h"
#include <iostream>
#include <vector>
#include <string>
#include <opencv2/core.hpp>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPLYReader.h>
#include <vtkAxesActor.h>
#include <vtkNamedColors.h>
#include <vtkOrientationMarkerWidget.h>
#include <vtkInteractorStyleTrackballCamera.h >
#include <vtkPointData.h>
void Release();
bool realTimeRefreshCloudPoint(vtkSmartPointer<vtkPoints> &points, vtkSmartPointer<vtkUnsignedCharArray> &rgb,
int cloudPointSize, List<double>^ x, List<double>^ y, List<double>^ z, List<unsigned char>^ r, List<unsigned char>^ g, List<unsigned char>^ b);
void startInteractor(vtkSmartPointer<vtkRenderWindowInteractor> interactor);
vtkSmartPointer<vtkRenderer> m_Renderer;
vtkSmartPointer<vtkRenderWindow> m_RenderWindow;
vtkSmartPointer<vtkRenderWindowInteractor>m_RenderWindowInteractor;
vtkSmartPointer<vtkAxesActor> m_Axes;
vtkSmartPointer<vtkOrientationMarkerWidget> m_AxesWidget;
vtkSmartPointer<vtkPoints> m_Points;
vtkSmartPointer<vtkCellArray> m_Vertices;
vtkSmartPointer<vtkPolyData> m_PointCloud;
vtkSmartPointer<vtkPolyDataMapper> m_Mapper;
vtkSmartPointer<vtkActor> m_Actor;
vtkSmartPointer<vtkCamera> m_Camera;
vtkSmartPointer<vtkInteractorStyleTrackballCamera> m_Style;
vtkSmartPointer<vtkInteractorStyleTrackballCamera>m_Interator;
vtkSmartPointer<vtkUnsignedCharArray> m_RgbColors;
Display::Display()
{
m_ImageNums = 0;
m_CloudPointSize = 0;
m_CylinderRadius = 0.08f;
m_CylinderLength = 0.2f;
m_IsFirstLoadRes = true;
isStart = false;
m_isDestroy = false;
m_XColor = Color::Red;
m_YColor = Color::Yellow;
m_ZColor = Color::Blue;
}
Display::~Display()
{
m_Renderer->RemoveAllViewProps();
Release();
m_RenderWindow->Render();
if (m_Renderer != nullptr)
{
m_RenderWindow->RemoveRenderer(m_Renderer);
m_Renderer = nullptr;