2020年博主有写过几篇关于PCL的博客,这边想先回顾下,再增加点新内容。之前写的博客专栏如下链接。

https://blog.csdn.net/jiugeshao/category_11993239.html?spm=1001.2014.3001.5482https://blog.csdn.net/jiugeshao/category_11993239.html?spm=1001.2014.3001.5482

一.PCL官网资料

之前多篇博客中都提过,要善于利用官方去学习一个新的东西,好的东西,其官网大多必然讲些详细。现在官网的一些资源都会放到github上,比如之前博主讲到的OpenVINO。

OpenVINO使用介绍(一)_竹叶青lvye的博客-CSDN博客_openvino

OpenVINO示例介绍_竹叶青lvye的博客-CSDN博客_openvino 示例

PLC的官网链接如下:

Point Cloud Library | The Point Cloud Library (PCL) is a standalone, large scale, open project for 2D/3D image and point cloud processing.

Docs入口是API的介绍文档,PCL里模块分的很清楚,若想直接看对应模块的API,也可以直接从点击大方对应图标进入。

Tutorials是详细的手册介绍,里面还会有一些示例,方便整体知道如何去使用,了解一些算子原理

github网址如下

GitHub - PointCloudLibrary/pcl: Point Cloud Library (PCL)

可看到最新的版本是1.12.1

tags可以下载到常用的平台下源码编译出来的安装文件,如果没有满足自己平台的,那么可以自己去编译下。(源码编译和交叉编译方法可以参考如下两篇博客),这里不再赘叙。

Ubuntu下源码编译OpenCV静态库及使用(勾选WITH_QT)_竹叶青lvye的博客-CSDN博客_opencv静态库使用

Ubuntu下交叉编译OpenCV(WITH_QT)_竹叶青lvye的博客-CSDN博客_opencv编译with_qt

二. PCL安装和配置

这一步主要可参考之前的博客:

vs2017配置PCL1.8.1 QT5.12.1(一)- 配置步骤_竹叶青lvye的博客-CSDN博客_vs2017配置pcl

这里博主选择了新的版本,vs2019 + PCL1.12.1

这篇博客需要补充的地方是,中间在输入目标链接库名字时,可以用python脚本批量去获得lib库的名字。

脚本如下:

# author:"jiugeshao"
# data:2022/9/3 2:16import os
def ListFilesToTxt(Currentdir, outfile, nameExtentisons, isIncludeSubDir, isDebug):""":param Currentdir: 需要统计的目录:param outfile: 需要输出到的txt文件:param nameExtentisons: 后缀列表:param isIncludeSubDir: 是否需要统计子目录:return:"""exts = nameExtentisons.split(" ")files = os.listdir(Currentdir)for name in files:fullname = os.path.join(Currentdir, name)if (os.path.isdir(fullname) & isIncludeSubDir):ListFilesToTxt(fullname, outfile, nameExtentisons, isIncludeSubDir, isDebug)else:for ext in exts:if (name.endswith(ext)):if(isDebug == True):if("gd" in name or "d.lib" in name):outfile.write(name + "\n")breakelse:if("gd" not in name or "d.lib" in name):outfile.write(name + "\n")breakdef Read(Currentdir, outfile, isDebug):""":param Currentdir:需要统计的目录:param outfile:需要输出到的txt文本:return:"""nameExtensons = ".lib"  #若要支持多种后缀统计,可以空格隔开,再加其它后缀名file = open(outfile,"w")if not file:print("cannot open the fule %s" % outfile)ListFilesToTxt(Currentdir, file, nameExtensons, 1, isDebug)file.close()dir = "C:\\Program Files\\PCL 1.12.1\\3rdParty"debug_txt = "D:\\PCL\\debug_3rdparty.txt"
release_txt = "D:\\PCL\\release_3rdparty.txt"Read(dir, debug_txt, isDebug=True)
Read(dir, release_txt, isDebug=False)

如上是去获取3rdParty目录及其子目录下满足条件设置的lib(debug版本和release版本也都做了区分)。生成的debug_3rdparty.txt和release_3rdparty.txt文本如下:

             

大家可在此脚本基础上做其它演变。

测试工程执行效果如下(工程也上传百度网盘):

链接:https://pan.baidu.com/s/1RFLs3zvOIVR3ao_wR0lVfA 
提取码:u4l9 
c++代码如下:

// test_vtk63.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <tchar.h>#include "vtkAutoInit.h"
//VTK_MODULE_INIT(vtkRenderingOpenGL2);
//VTK_MODULE_INIT(vtkInteractionStyle);
//#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/PCLPointCloud2.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <iostream>using namespace pcl;
using namespace pcl::io;
using namespace std;int testpointcloudToPcd()
{vtkObject::GlobalWarningDisplayOff();pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);char strfilepath[256] = "D:\\PCL\\rabbit.pcd";//第一种读入方法较多场合如此if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) {cout << "error input!" << endl;return -1;}boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("PointsCloud Recognition"));viewer->addPointCloud(cloud, "model_cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}}int _tmain(int argc, _TCHAR* argv[])
{testpointcloudToPcd();return 0;
}

运行效果如下:

此版本对应的VTK版本是9.1

三.在VTK控件中显示PCL点云

1.直接用vtk去显示自定义的一个锥体

// test_vtk63.cpp : 定义控制台应用程序的入口点。
//#include <map>
#include <tchar.h>
#include "vtkConeSource.h"
#include "vtkConeSource.h"
#include "vtkCommand.h"
#include "vtkCamera.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkTransform.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include <vtkSmartPointer.h>
#include <vtkDoubleArray.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkDataSet.h>
#include <vtkLookupTable.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkArcSource.h>
#include <vtkAppendPolyData.h>
#include <vtkScalarBarActor.h>
#include <vtkKdTree.h>
#include <vtkLODActor.h>
#include <vtkMath.h>
#include <vtkWindowToImageFilter.h>
#include <vtkBMPWriter.h>
#include <vtkAutoInit.h>
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <windef.h>#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);void testvtk2()
{//创建数据源:创建一个圆锥,并设置其参数:高度、底面半径和分辨率vtkConeSource* cone = vtkConeSource::New();cone->SetHeight(3.0);cone->SetRadius(1.0);cone->SetResolution(100);//映射器:创建一个多边形映射器,用于把多边形数据映射为可以被计算机渲染的图元vtkPolyDataMapper* coneMapper = vtkPolyDataMapper::New();coneMapper->SetInputConnection(cone->GetOutputPort());//创建一个Actor,并关联一个映射器,从而确定Actor的形状vtkActor* coneActor = vtkActor::New();coneActor->SetMapper(coneMapper);//方法1:设置演员颜色coneActor->GetProperty()->SetColor(1.0, 0.0, 0.0);//设置对象颜色为红色//方法2:设置演员颜色//vtkProperty* coneProperty = vtkProperty::New();//设置一个Property对象//coneProperty->SetColor(1.0, 0.0, 0.0);//coneActor->SetProperty(coneProperty);//渲染器:创建一个渲染器,添加要渲染的演员vtkRenderer* ren1 = vtkRenderer::New();ren1->AddActor(coneActor);ren1->SetBackground(0.1, 0.2, 0.4);//渲染窗口:添加一个渲染窗口,供渲染器使用vtkRenderWindow* renWin = vtkRenderWindow::New();renWin->AddRenderer(ren1);renWin->SetSize(300, 300);//实例化一个交互对象vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::New();//交互对象加入renWin窗口中interactor->SetRenderWindow(renWin);renWin->Render();//绘制舞台上的东西interactor->Initialize();//交互对象初始化interactor->Start();//开始交互事件//释放内存cone->Delete();coneActor->Delete();coneMapper->Delete();ren1->Delete();renWin->Delete();interactor->Delete();
}int _tmain(int argc, _TCHAR* argv[])
{testvtk2();return 0;
}

运行出现如下报错:

严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK2019    无法解析的外部符号 "void __cdecl vtkRenderingOpenGL_AutoInit_Construct(void)" (?vtkRenderingOpenGL_AutoInit_Construct@@YAXXZ),函数 "public: __cdecl `anonymous namespace'::vtkRenderingOpenGL_ModuleInit::vtkRenderingOpenGL_ModuleInit(void)" (??0vtkRenderingOpenGL_ModuleInit@?A0xfeadf992@@QEAA@XZ) 中引用了该符号    PCL_config_console    D:\PCL\code\PCL_config_console\PCL_config_console\PCL_config_console.obj    1    

将代码中的VTK_MODULE_INIT(vtkRenderingOpenGL)修改为VTK_MODULE_INIT(vtkRenderingOpenGL2),即可!

 2.pcl读入点云,在vtk控件中显示

代码如下:

// test_vtk63.cpp : 定义控制台应用程序的入口点。
//// test_mfc_showDlg.h: 头文件
//#include <tchar.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);#include <boost/thread/thread.hpp> //多线程
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/point_types.h> //PCL中支持的点类型头文件。
#include <pcl/common/common_headers.h>
#include <pcl/console/parse.h>
#include <pcl/point_types.h>
#include <pcl/range_image/range_image.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>#include "vtkCommand.h"
#include "vtkRenderer.h"
#include "vtkCellPicker.h"
#include "vtkProperty.h"
#include "vtkPlaneSource.h"
#include "vtkMetaImageReader.h"#include "vtkImagePlaneWidget.h"
#include "vtkPlaneSource.h"
#include "vtkPlane.h" #include "vtkSmartPointer.h"
#include "vtkResliceCursorActor.h"
#include "vtkResliceCursorPolyDataAlgorithm.h"
#include "vtkResliceCursor.h"
#include "vtkResliceCursorWidget.h"
#include "vtkResliceCursorLineRepresentation.h"
#include "vtkResliceCursorThickLineRepresentation.h" #include <vtkVertexGlyphFilter.h>#include "vtkImageReader2Factory.h"
#include "vtkImageReader2.h"using namespace pcl;
using namespace pcl::io;
using namespace std;using pcl::visualization::PointCloudColorHandlerGenericField;
using pcl::visualization::PointCloudColorHandlerCustom;void testvtk2()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);char strfilepath[256] = "D:\\PCL\\rabbit.pcd";std::cout << "start to read" << std::endl;//第一种读入方法j较多场合如此if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) {cout << "error input!" << endl;}cout << cloud->points.size() << endl;vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();//key codevtkIdType size = cloud->points.size();int n = 0;for (vtkIdType rowId = 0; rowId < size; rowId++){auto dp = cloud->points.at(rowId);if (dp.z == 0) {continue;}points->InsertNextPoint(dp.x, dp.y, dp.z);//key coden++;}vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();glyphFilter->SetInputData(polydata);glyphFilter->Update();vtkPolyDataMapper* dataMapper = vtkPolyDataMapper::New();dataMapper->SetInputConnection(glyphFilter->GetOutputPort());vtkActor* coneActor = vtkActor::New();coneActor->SetMapper(dataMapper);coneActor->GetProperty()->SetColor(1.0, 0.0, 0.0);//设置对象颜色为红色//方法2:设置演员颜色//vtkProperty* coneProperty = vtkProperty::New();//设置一个Property对象//coneProperty->SetColor(1.0, 0.0, 0.0);//coneActor->SetProperty(coneProperty);//渲染器:创建一个渲染器,添加要渲染的演员vtkSmartPointer<vtkRenderer>     m_Renderer;vtkSmartPointer<vtkRenderWindow> m_RenderWindow;m_Renderer = vtkSmartPointer<vtkRenderer>::New();m_Renderer->AddActor(coneActor);m_Renderer->SetBackground(0.1, 0.2, 0.4);m_RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();m_RenderWindow->SetSize(500, 500);m_RenderWindow->AddRenderer(m_Renderer);vtkRenderWindowInteractor * interactor = vtkRenderWindowInteractor::New();//交互对象加入renWin窗口中interactor->SetRenderWindow(m_RenderWindow);m_RenderWindow->Render();//绘制舞台上的东西interactor->Initialize();//交互对象初始化interactor->Start();//开始交互事件polydata->Delete();glyphFilter->Delete();dataMapper->Delete();coneActor->Delete();m_Renderer->Delete();m_RenderWindow->Delete();interactor->Delete();//if (m_RenderWindow->GetInteractor() == NULL)//{//    vtkSmartPointer<vtkRenderWindowInteractor> RenderWindowInteractor =//        vtkSmartPointer<vtkRenderWindowInteractor>::New();//  RenderWindowInteractor->SetRenderWindow(m_RenderWindow);//   RenderWindowInteractor->Initialize();//}
}int _tmain(int argc, _TCHAR* argv[])
{testvtk2();return 0;
}

vtk中显示的效果如下:

3.VTK保存数据为vtk文件

在上面代码的基础上,增加头文件#include <vtkPolyDataWriter.h>

在增加如下代码(polydata->SetPoints(points)语句下面),即可以保存数据到vtk文件中

4.VTK API读取本地vtk文件,并在自己控件里显示

代码如下:

// test_vtk63.cpp : 定义控制台应用程序的入口点。
//// test_mfc_showDlg.h: 头文件
//#include <tchar.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);#include <boost/thread/thread.hpp> //多线程
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/point_types.h> //PCL中支持的点类型头文件。
#include <pcl/common/common_headers.h>
#include <pcl/console/parse.h>
#include <pcl/point_types.h>
#include <pcl/range_image/range_image.h>
#include <pcl/visualization/range_image_visualizer.h>#include <pcl/visualization/pcl_visualizer.h>
#include <vtkSimplePointsReader.h>
#include "vtkCommand.h"
#include "vtkRenderer.h"
#include "vtkCellPicker.h"
#include "vtkProperty.h"
#include "vtkPlaneSource.h"
#include "vtkMetaImageReader.h"#include "vtkImagePlaneWidget.h"
#include "vtkPlaneSource.h"
#include "vtkPlane.h" #include "vtkSimplePointsReader.h"#include "vtkSmartPointer.h"
#include "vtkResliceCursorActor.h"
#include "vtkResliceCursorPolyDataAlgorithm.h"
#include "vtkResliceCursor.h"
#include "vtkResliceCursorWidget.h"
#include "vtkResliceCursorLineRepresentation.h"
#include "vtkResliceCursorThickLineRepresentation.h" #include <vtkVertexGlyphFilter.h>#include "vtkImageReader2Factory.h"
#include "vtkImageReader2.h"#include <vtkPolyDataReader.h>using namespace pcl;
using namespace pcl::io;
using namespace std;using pcl::visualization::PointCloudColorHandlerGenericField;
using pcl::visualization::PointCloudColorHandlerCustom;void testvtk2()
{vtkNew<vtkPolyDataReader> reader;reader->SetFileName("D:\\PCL\\rabbit.vtk");reader->Update();vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(reader->GetOutput()->GetPoints());vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();glyphFilter->SetInputData(polydata);glyphFilter->Update();vtkPolyDataMapper* dataMapper = vtkPolyDataMapper::New();dataMapper->SetInputConnection(glyphFilter->GetOutputPort());vtkActor* coneActor = vtkActor::New();coneActor->SetMapper(dataMapper);coneActor->GetProperty()->SetColor(1.0, 0.0, 0.0);//设置对象颜色为红色//方法2:设置演员颜色//vtkProperty* coneProperty = vtkProperty::New();//设置一个Property对象//coneProperty->SetColor(1.0, 0.0, 0.0);//coneActor->SetProperty(coneProperty);//渲染器:创建一个渲染器,添加要渲染的演员vtkSmartPointer<vtkRenderer>     m_Renderer;vtkSmartPointer<vtkRenderWindow> m_RenderWindow;m_Renderer = vtkSmartPointer<vtkRenderer>::New();m_Renderer->AddActor(coneActor);m_Renderer->SetBackground(0.1, 0.2, 0.4);m_RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();m_RenderWindow->SetSize(500, 500);m_RenderWindow->AddRenderer(m_Renderer);vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::New();//交互对象加入renWin窗口中interactor->SetRenderWindow(m_RenderWindow);m_RenderWindow->Render();//绘制舞台上的东西interactor->Initialize();//交互对象初始化interactor->Start();//开始交互事件polydata->Delete();glyphFilter->Delete();dataMapper->Delete();coneActor->Delete();m_Renderer->Delete();m_RenderWindow->Delete();interactor->Delete();//if (m_RenderWindow->GetInteractor() == NULL)//{//    vtkSmartPointer<vtkRenderWindowInteractor> RenderWindowInteractor =//        vtkSmartPointer<vtkRenderWindowInteractor>::New();//  RenderWindowInteractor->SetRenderWindow(m_RenderWindow);//   RenderWindowInteractor->Initialize();//}
}int _tmain(int argc, _TCHAR* argv[])
{testvtk2();return 0;
}

执行效果如下:

 5.VTK保存数据到txt文本中

在上面代码的基础上增加如下代码(polydata->SetPoints(reader->GetOutput()->GetPoints()):

6.VTK读txt数据并转化为vtk数据

代码如下,读入一个txt文本,然后进行数据的转换

// test_vtk63.cpp : 定义控制台应用程序的入口点。
//// test_mfc_showDlg.h: 头文件
//#include <tchar.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);#include <boost/thread/thread.hpp> //多线程
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/point_types.h> //PCL中支持的点类型头文件。
#include <pcl/common/common_headers.h>
#include <pcl/console/parse.h>
#include <pcl/point_types.h>
#include <pcl/range_image/range_image.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>#include "vtkCommand.h"
#include "vtkRenderer.h"
#include "vtkCellPicker.h"
#include "vtkProperty.h"
#include "vtkPlaneSource.h"
#include "vtkMetaImageReader.h"#include "vtkImagePlaneWidget.h"
#include "vtkPlaneSource.h"
#include "vtkPlane.h" #include "vtkSmartPointer.h"
#include "vtkResliceCursorActor.h"
#include "vtkResliceCursorPolyDataAlgorithm.h"
#include "vtkResliceCursor.h"
#include "vtkResliceCursorWidget.h"
#include "vtkResliceCursorLineRepresentation.h"
#include "vtkResliceCursorThickLineRepresentation.h" #include <vtkVertexGlyphFilter.h>#include "vtkImageReader2Factory.h"
#include "vtkImageReader2.h"using namespace pcl;
using namespace pcl::io;
using namespace std;using pcl::visualization::PointCloudColorHandlerGenericField;
using pcl::visualization::PointCloudColorHandlerCustom;void testvtk2()
{//istringstream istr;//string line, str;//while (getline(cin, line))//从终端接收一行字符串,并放入字符串line中   //{//    istr.str(line);//把line中的字符串存入字符串流中   // while (istr >> str)//每次读取一个单词(以空格为界),存入str中   // {//     cout << str << endl;//  }//}//std::string filename = "Points.txt";// std::ifstream filestream(filename.c_str()); //文件流// std::string line;//  vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();// while(std::getline(filestream, line))  //整行读取文件//{// double x, y, z;// std::stringstream linestream;// linestream << line;// linestream >> x >> y >> z;// points->InsertNextPoint(x, y, z); //新读取的数据赋予点的几何结构// }// filestream.close();  //关闭文件流操作vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();//key codeifstream inFile;inFile.open("D:\\PCL\\rabbit.txt");double x, y, z;while (inFile >> x >> y >> z){points->InsertNextPoint(x, y, z);}vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();glyphFilter->SetInputData(polydata);glyphFilter->Update();vtkPolyDataMapper* dataMapper = vtkPolyDataMapper::New();dataMapper->SetInputConnection(glyphFilter->GetOutputPort());vtkActor* coneActor = vtkActor::New();coneActor->SetMapper(dataMapper);coneActor->GetProperty()->SetColor(1.0, 0.0, 0.0);//设置对象颜色为红色//方法2:设置演员颜色//vtkProperty* coneProperty = vtkProperty::New();//设置一个Property对象//coneProperty->SetColor(1.0, 0.0, 0.0);//coneActor->SetProperty(coneProperty);//渲染器:创建一个渲染器,添加要渲染的演员vtkSmartPointer<vtkRenderer>     m_Renderer;vtkSmartPointer<vtkRenderWindow> m_RenderWindow;m_Renderer = vtkSmartPointer<vtkRenderer>::New();m_Renderer->AddActor(coneActor);m_Renderer->SetBackground(0.1, 0.2, 0.4);m_RenderWindow = vtkSmartPointer<vtkRenderWindow>::New();m_RenderWindow->SetSize(500, 500);m_RenderWindow->AddRenderer(m_Renderer);vtkRenderWindowInteractor* interactor = vtkRenderWindowInteractor::New();//交互对象加入renWin窗口中interactor->SetRenderWindow(m_RenderWindow);m_RenderWindow->Render();//绘制舞台上的东西interactor->Initialize();//交互对象初始化interactor->Start();//开始交互事件polydata->Delete();glyphFilter->Delete();dataMapper->Delete();coneActor->Delete();m_Renderer->Delete();m_RenderWindow->Delete();interactor->Delete();//if (m_RenderWindow->GetInteractor() == NULL)//{//   vtkSmartPointer<vtkRenderWindowInteractor> RenderWindowInteractor =//        vtkSmartPointer<vtkRenderWindowInteractor>::New();//  RenderWindowInteractor->SetRenderWindow(m_RenderWindow);//   RenderWindowInteractor->Initialize();//}
}int _tmain(int argc, _TCHAR* argv[])
{testvtk2();return 0;
}

显示效果如下:

7.PCL读入txt数据显示

代码如下:

// test_vtk63.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <tchar.h>#include "vtkAutoInit.h"
//VTK_MODULE_INIT(vtkRenderingOpenGL2);
//VTK_MODULE_INIT(vtkInteractionStyle);
//#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/PCLPointCloud2.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <iostream>using namespace pcl;
using namespace pcl::io;
using namespace std;int testpointcloudToPcd()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);ifstream in0;in0.open("D:\\PCL\\rabbit.txt");if (!in0.is_open()){cout << "error open!" << endl;return -1;}//a,b为符号int count = 0;double x, y, z;while (in0 >> x >> y >> z){pcl::PointXYZ cltmp(x, y, z);       cloud->points.push_back(cltmp);count++;}std::cout << "start to save pointcloud...";cloud->width = count; //设置点云宽度cloud->height = 1; //设置点云高度cloud->is_dense = false;//判断points中的数据是否是有限的(有限为true)或者说是判断点云中的点是否包含 Inf/NaN这种值(包含为false)。//为false或者true并不影响结果,是否为密度点云//pcl::io::savePCDFileASCII("D:\\mycode\\0-PCL_VTK\\pryamid_yidong10.pcd", *cloud);/*pcl::io::savePCDFileBinary("D:\\mycode\\0-PCL_VTK\\pryamid1.pcd", *cloud);pcl::io::savePCDFile("D:\\mycode\\0-PCL_VTK\\pryamid2.pcd", *cloud);*/std::cout << "save completed!start to show" << std::endl;boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("PointsCloud Recognition"));viewer->addPointCloud(cloud, "model_cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}}int _tmain(int argc, _TCHAR* argv[])
{testpointcloudToPcd();return 0;
}

8.常见点云文件格式介绍

这边列举了一些博客用于参考

(1)PCD

点云库PCL入门1:存储点云数据的pcd文件简介 - 知乎

PCL:点云数据(*.pcd)文件格式详解_孙 悟 空的博客-CSDN博客_pcd格式

PCL中PCD(Point Cloud Data)文件格式解析_SOC罗三炮的博客-CSDN博客_pcd文件

(2) PLY

PLY文件格式 - 慕尘 - 博客园

(3) Step

一篇文章了解STEP文件格式 - 知乎

https://www.jianshu.com/p/ccfc77d0ee45

9.PCL读写点云文件

这边列举了一些博客用于参考

PCL读写pcd文件 - 知乎

PCL:读写pcd点云的两种方式_孙 悟 空的博客-CSDN博客_pcl读取pcd

ply las pcd等一些常见的基本点云文件格式的读写方法_qq_46084757的博客-CSDN博客_ply点云

PCL入门系列三——PCL进行数据读写 - 知乎

点云学习----PCL读写点云_刚上路DE小白的博客-CSDN博客_pcl读取点云

10.VTK数据处理

VTK图像处理(二)--vtkPolyData数据处理 - 知乎

11. 八叉树

如下的一些帖子,博主觉得可参考

百度安全验证

PCL学习笔记(六)-- k-d tree_看到我请叫我学C++的博客-CSDN博客

PCL学习笔记(七)-- 八叉树OcTree_八叉树写法_看到我请叫我学C++的博客-CSDN博客

https://www.cnblogs.com/z-web-2017/p/14111071.html

【图形学】基于点云生成树木模型_树木点云_wk_119的博客-CSDN博客

一文搞懂k近邻(k-NN)算法(一) - 知乎

win10环境下PCL安装和配置回顾(一)相关推荐

  1. RabbitMQ 在 Win10 环境下的安装与配置

    文章目录 1. RabbitMQ 环境配置(ErLang 10.4 + MQ 3.7.17) 1.1 ErLang 下载安装 1.2 RabbitMQ 下载安装 1.3 环境变量配置 1.3.1 新建 ...

  2. OpenSSL在Win10环境下的安装

    Win10环境下OpenSSL的安装 1,前言 2,OpenSSL在Win10环境下的安装 2.1,了解安装OpenSSL所需步骤: 2.2,根据步骤完成前期准备 2.2.1,安装Perl 2.2.2 ...

  3. windows ce 安装java,Windows环境下JDK安装和配置

    相信所有学习Java的朋友应该都在Windows操作系统中安装和配置过JDK,这里我们将详细介绍安装和配置过程! 在Linux环境下安装JDK可参考:Linux环境下JDK安装和配置 下面我们开始讲解 ...

  4. win10环境下下载安装openpose(only cpu)并在pycharm中运行代码(超详细)

    win10环境下下载安装openpose(only cpu)并在pycharm中运行代码(超详细) (一)前言 (二)准备工作 (三)友情提醒 (四)详细安装步骤 1.新建文件夹 2.下载OpenPo ...

  5. OpenVINO之二:Windows环境下OpenVINO安装与配置

    OpenVINO系列: OpenVINO之一:OpenVINO概述 OpenVINO之二:Windows环境下OpenVINO安装与配置 OpenVINO之三:Linux环境下OpenVINO安装与配 ...

  6. 【踩坑教程】win10环境下RTX3050Ti安装Tensorflow-gpu2.5+CUDA11.2.1+cudnn8.1.0

    友情提醒:所有蓝字均为超链接 目录 1 本机环境及碎碎念 2 排坑指南 2.1 TensorFlow及CUDA.cuDNN版本 2.2 CUDA版本选择 2.2 cuDNN版本选择 3 安装教程 3. ...

  7. mac下查看redis安装路径_干货!win10环境下Redis安装、启动教程

    " 本文详细介绍win10环境下Redis的安装.启动方法." 01 - 下载 Redis项目不正式支持Windows.但是,Microsoft开放技术小组开发和维护一个Windo ...

  8. windows环境下IDEA安装和配置和第一个IDEA项目运行加常用快捷键

    IDEA安装和配置和第一个IDEA项目运行加常用快捷键 IDEA开发工具是和eclipse.myeclipse差不多的java开发工具. IDEA是一个专门针对Java的集成开发工具(IDE),由Ja ...

  9. win10如何安装wxpython_python在win10环境下怎样安装wxpython?

    Python 与 wxPython 运行环境安装 分 别安装python-2.6.2.msi.wxPython2.8-win32-unicode-2.8.10.1-py26.exe wxPython2 ...

最新文章

  1. 面试官问:如果MySQL的自增 ID 用完了,怎么办?
  2. android 自定义图片容器,Android应用开发中自定义ViewGroup视图容器的教程
  3. Zabbix 3.2 短信报警配置
  4. virus.win32.parite.H病毒的查杀方法
  5. Exchange 2007 配置POP3
  6. Android--一个好玩的应用程序/开机自启动
  7. linux man命令无效,Linux man命令的具体使用
  8. scale 和 transform-origin 实现线条从左侧进入,右侧离开效果
  9. jQuery-DOM操作之children()、next()、prev()、siblings()
  10. hdu.1254.推箱子(bfs + 优先队列)
  11. php生成pdf中文断码_Rmarkdown导出中文PDF解决方案
  12. 催收评分卡(一)催收评分卡介绍
  13. 2015 - Human-level control through deep reinforcement learning
  14. php时间截取日期,php中肿么获取给定时间中的日期部分
  15. Spark2.2(三十九):如何根据appName监控spark任务,当任务不存在则启动(任务存在当超过多久没有活动状态则kill,等待下次启动)...
  16. 【NLP】近期必读ICLR 2021相关论文
  17. Codeforces Round #359 (Div. 2) C. Robbers' watch DFS
  18. 国内外网站设计与浏览习惯的差异
  19. Raki的统计学习方法笔记0xB(11)章:条件随机场
  20. IDEA导入MySQL驱动包(Mac版)

热门文章

  1. 【知一】世界历史脉络梳理之人类起源(1)
  2. 通过Feign实现Spring Cloud微服务调用
  3. 修改DLL文件实现龙崖Dragon Cliff作弊
  4. 利用Python+selenium实现小米商城抢购代码
  5. matlab 数组限制,在MATLAB中,数组必须先定义其大小后才能使用
  6. 移动互联网的六大发展趋势
  7. xbox换服务器文件名,破旧国行xbox one换盘升级重生及更换港服
  8. html桃花特效,页面上桃花飘飘 - 网页特效代码|网页特效观止 - 让你的网页靓起来!...
  9. OpenHarmony 3.2 Beta Audio——音频渲染
  10. 如何用Python爬取LOL官网全英雄皮肤