一、安装PCL:
PCL1.13.1安装视频【VS2022安装PCL1.13.1步骤】
PCL下载地址:
1. 官网github:官网PCL链接
2. 百度网盘链接网盘PCL链接 提取码:1111
需要下载这两个文件:
PCL-1.12.1-AllnOne-msvc2019-win64.exe
PCL-1.12.1-pdb-msvc2019-win64.zip
运行PCL-1.12.1-AllnOne-msvc2019-win64.exe,一图选择第第二或三个,会在系统中添加环境变量,默认安装PCL和3rd Party Librari即可。
安装完成,在安装目录下找到3rdParty\OpenNI2目录下的OpenNI-Windows-x64-2.2.msi,安装该程序,安装目录自己选择。PCL1.13.1版本不需要该步骤,之前的版本是否需要自行判断。 安装成功后,安装目录会出现PCL1.xx.x和OPenNI2两个目录。系统变量会出现红框中的变量,如果没有则需要自行添加。
解压pcl-1.12.1-pdb-msvc2019-win64.zip,将解压得到的文件夹中的内容添加PCL 1.12.1\bin中。
配置环境变量Path,如果不需要QT环境可以跳过配置,VS+QT+PCL或者QT+PCL两者都需要配置,否则会找不到.dll文件,所以我的建议是:别管用不用的上,加上吧。如下图,根据自己的安装目录和版本修改后新建插入。至此,PCL最基本的安装过程就结束了。
//OPenNI2的目录
C:\Program Files\OpenNI2\Lib
C:\Program Files\OpenNI2\Tools
C:\Program Files\OpenNI2\Redist
//PCL的目录
C:\Program Files\PCL 1.12.1\bin
C:\Program Files\PCL 1.12.1\3rdParty\VTK\bin
C:\Program Files\PCL 1.12.1\3rdParty\Boost\lib
C:\Program Files\PCL 1.12.1\3rdParty\FLANN\bin
C:\Program Files\PCL 1.12.1\3rdParty\Qhull\bin
二、QT安装
qt教程都差不多,可以参考这篇QT6安装教程(兼容QT5、QT4)_枫桥骤雨的博客-CSDN博客_qt6安装https://blog.csdn.net/weixin_41962350/article/details/124433116
最好是在QT官网下载安装,如果网络不佳在选择国内镜像。
下载安装包
中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/
清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/
北京理工大学:http://mirror.bit.edu.cn/qtproject/
中国互联网络信息中心:http://mirror.bit.edu.cn/qtproject/
原文链接:https://blog.csdn.net/zuoweijie_/article/details/107452285
三、在Visual Studio2022上配置PCL
如果你不需要VS而是QTCreator运行项目,请直接跳至第五步查看QTCreator的配置方法。如果你真的需要使用QT,就直接使用QTCreator,配置更加简单。
运行环境:visual studio 2022 , pcl 1.12(vtk 9.1) , Qt6 (Qt6.4)
我推荐只配置release环境,如果你自己尝试一些耗时的程序,会发现debug模式耗时很多。举个栗子:一个delanuay算法在1万数据的前提下,debug需要6000ms,而release只需要250 ms。下图可以在编译的时候选择。但是你更喜欢debug,配置方法也大致相同。
切换环境的方式见下图
1. 添加属性表
打开属性管理器右键新建属性表,方便以后创建项目时直接添加,不然配置环境很麻烦。第一次选择新建,之后新建项目可以添加现有属性表。
视图>>其他窗口>>属性管理器>>添加新(现有)属性表>>添加后双击文件进行编辑
2. 配置VC++目录
双击属性表之后,可以看到(通用属性>VC++目录,C/C++,链接器),属性表需要配置的也就只有这三个。如果配置release x64版本,则在Release|X64目录下添加属性表,如果是debug版本就在Debug|X64下添加。
在下列代码区的内容,并根据自己的PCL安装目录作替换。看着很多,其实基本就是PCL和OPenNI2这两个目录下的include(包含)目录,lib(库)目录部分是在3rdPary(第三方库)目录下的,打开就能看到,例如第三图。第四图为编辑方法。
包含目录:
C:\Program Files\OpenNI2\Include
C:\Program Files\PCL 1.12.1\include\pcl-1.12
C:\Program Files\PCL 1.12.1\3rdParty\Boost\include\boost-1_78
C:\Program Files\PCL 1.12.1\3rdParty\Eigen\eigen3
C:\Program Files\PCL 1.12.1\3rdParty\FLANN\include
C:\Program Files\PCL 1.12.1\3rdParty\Qhull\include
C:\Program Files\PCL 1.12.1\3rdParty\VTK\include\vtk-9.1
库目录
C:\Program Files\OpenNI2\Lib
C:\Program Files\PCL 1.12.1\lib
C:\Program Files\PCL 1.12.1\3rdParty\VTK\lib
C:\Program Files\PCL 1.12.1\3rdParty\Qhull\lib
C:\Program Files\PCL 1.12.1\3rdParty\FLANN\lib
C:\Program Files\PCL 1.12.1\3rdParty\Boost\lib
配置完成如图。
3. 配置预处理器
C/C+±->预处理器–>预处理定义:
BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE
我只加了这三个,其他教程加了不同的,我不确定是否有用,但目前这三个足够。我后续配置PCL1.13.1时测试了一下,release版本只需要_CRT_SECURE_NO_DEPRECATE即可。看有其他教程说release和debug配置不同,但是能跑起来就足够了,遇到问题再解决。
4. 配置附加依赖
这一步是release和debug版本的唯一区别。
获取依赖的方法相对比较复杂,需要PCL目录下的lib和3rdParty\VTK\lib两个目录下的所有.lib文件名。这里推荐Win11的PowerShell,用于生成文件名:ls -name可以获取文件名,然后用">"进行重定向。如果不支持ls -name,也可以用dir -name。
这里以安装目录C:\Program Files\PCL 1.13.1为例
在 C:\Program Files\PCL 1.13.1\lib 目录下右键打开PowerShell,执行以下命令
ls -name > D:/PCL/pcl.txt
在 C:\Program Files\PCL 1.13.1\3rdParty\VTK\lib 目录下右键打开PowerShell,
执行以下命令
ls -name > D:/PCL/vtk.txt
执行完成后,在D:/PCL目录下会得到pcl.txt和vtk.txt两个文件,
里面就是对应目录下的所有文件和目录名
当然,目录名是不需要的,需要将没有.lib后缀的行删除,例如vtk.txt如下,
则需要将cmake和vtk-9.1删除
cmake
vtk-9.1
vtkcgns-9.2.lib
vtkxxxx-9.2.lib
获取vtk.txt和pcl.txt两个文件后,执行下面的C++程序,即可获取release.txt和debug.txt,对应release和debug的依赖文件。如果重定向的文件不在D:/PCL目录,程序里的目录需要自行需改。如果配置release版本,则将release.txt的内容粘贴到链接器>>输入>>附加依赖项
如果配置debug版本,则将debug.txt的内容粘贴到链接器>>输入>>附加依赖项,前提是你的属性表是debug|x64下的,release的同理。
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream fp1, fp2;
fp1.open("D:/PCL/pcl.txt", ios::in);
fp2.open("D:/PCL/vtk.txt", ios::in);
ofstream frelease, fdebug;
frelease.open("D:/PCL/release.txt", ios::out);
fdebug.open("D:/PCL/debug.txt", ios::out);
if (!fp1.is_open() || !fp2.is_open() || !frelease.is_open() || !fdebug.is_open()) {
cout << "[\033[31merror\033[0m]failed to open files." << endl;
}
else {
cout << "[\033[32m-info\033[0m]files are ok." << endl;
}
auto generate = [](ifstream& fp, ofstream& fdebug, ofstream& frelease) {
while (!fp.eof()) {
char buff[1024];
memset(buff, 0, 1024);
fp.getline(buff, 1024);
int len = strlen(buff);
if (len < 1) continue;
buff[len] = '\n';
if (buff[len - 4] == '.' && buff[len - 5] == 'd') {
fdebug.write(buff, strlen(buff));
}
else {
frelease.write(buff, strlen(buff));
}
}
};
cout << "[\033[34mdebug\033[0m]start generate pcl-debug and pcl-release..." << endl;
generate(fp1, fdebug, frelease);
cout << "[\033[34mdebug\033[0m]start generate vtk-debug and vtk-release..." << endl;
generate(fp2, fdebug, frelease);
cout << "[\033[32minfo\033[0m]mgenerate files is complated." << endl;
fp1.close();
fp2.close();
frelease.close();
fdebug.close();
fp1.open("D:/PCL/debug.txt", ios::in);
fp2.open("D:/PCL/release.txt", ios::in);
auto display = [](ifstream& fp) {
while (!fp.eof()) {
char buff[1024];
memset(buff, 0, 1024);
fp.getline(buff, 1024);
cout << "\033[32m" << buff << "\033[0m" << endl;
}
};
cout << "[\033[32minfo\033[0m]start display debug file-list..." << endl;
display(fp1);
cout << "[\033[32minfo\033[0m]start display release file-list..." << endl;
display(fp2);
fp1.close();
fp2.close();
return 0;
}
5. 配置调试
这步和属性表无关,新建项目都需要粘贴过去:调试》》调试属性》》配置属性》》调试》》环境
还是根据自己的路径作替换,粘贴时把换行删了,这么写时为了方便看,否则可能报错。。可以看到这几个其实就是PCL1.12.1目录下的bin子目录(包括OpenNI2的Tools)。补充PCL1.13.1对比下,好像也没甚么变化。
// PCL 1.12.1
PATH=
C:\Program Files\PCL 1.12.1\bin;
C:\Program Files\PCL 1.12.1\3rdParty\FLANN\bin;
C:\Program Files\PCL 1.12.1\3rdParty\VTK\bin;
C:\Program Files\OpenNI2\Tools
// PCL 1.13.1
PATH =
C:\Program Files\OpenNI2\Tools;
C:\Program Files\PCL 1.13.1\bin;
C:\Program Files\PCL 1.13.1\3rdParty\FLANN\bin;
C:\Program Files\PCL 1.13.1\3rdParty\VTK\bin
6. 可能存在的问题
《ERROR: 显示无法代开OpenNi2.dll》将OpenNI2\Tools目录下的OpenNI2.dll复制到VS项目的目录下即可。PCL1.13.1似乎没有这个问题。
如果运行时控制台输出警告信息,自己不想看,可以 调试>>调试属性>>C++>>高级>>禁用特定警告>>输入提示的警告号。
四、在Visual Studio2022上配置Qt
1. 下载Qt Visual Studio Tools
2.关联QT
找到自己的QT安装目录,双击Path选中qmake.exe,例如我的QT安装在D:\ProgramFiles\Qtproj,我需要选中 D:\ProgramFiles\Qtproj\6.4.0\msvc2019_64\bin\qmake.exe
3.将PCL嵌入Qt
用了很长的时间查找教程,发现都是用cmake编译vtk在Qt中的项目,没有找到在vs中的。而且很多教程就是人云亦云,重复再重复。希望这篇文章能帮助大家。
//1.
//通过PCLVisualizer绘制点云
pcl::visualization::PCLVisualizer::Ptr cloud_viewer;
//初始化指针
cloud_viewer.reset(new pcl::visualization::PCLVisualizer("viewer"));
//设置点云窗口是否显示FPS
cloud_viewer->setShowFPS(show_fps);
//获取点云窗口cloud_viewer的ID。 QWindow::fromWinId需要#include<QWindow>
auto viewerWinId = QWindow::fromWinId((WId)cloud_viewer->getRenderWindow()->GetGenericWindowId());
//将点云窗口渲染到QT的窗口
widget = QWidget::createWindowContainer(viewerWinId, nullptr);
//我是重新写了一个继承自QDockWidget的类,用以下代码让widget渲染在QDockWidget中。再在QMainWindow类中使用addDockWidget(Qt::TopDockWidgetArea, viewer);就可以完美嵌入了。
setWidget(widget);
//2.
//如果想直接在QMainWindow中嵌入,可以尝试
auto viewerWinId = QWindow::fromWinId((WId)cloud_viewer->getRenderWindow()->GetGenericWindowId());
widget = QWidget::createWindowContainer(viewerWinId, nullptr);
setCentralWind(widget);
运行效果如图
4.项目的创建。
创建Qt Widgets Application即可。
简单示例:
#pragma once
#include <QWindow>
#include <QtWidgets/QMainWindow>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <QtWidgets/QMainWindow>
#include "ui_PCLTest.h"
class PCLTest : public QMainWindow
{
Q_OBJECT
public:
PCLTest(QWidget *parent = nullptr);
~PCLTest();
private:
Ui::PCLTestClass ui;
pcl::visualization::PCLVisualizer::Ptr cloud_viewer;
};
#include "PCLTest.h"
PCLTest::PCLTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
cloud_viewer.reset(new pcl::visualization::PCLVisualizer("viewer"));
auto viewerWinId = QWindow::fromWinId((WId)cloud_viewer->getRenderWindow()->GetGenericWindowId());
QWidget* widget = QWidget::createWindowContainer(viewerWinId, nullptr);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudptr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("./test/test.pcd", *cloudptr);
cloud_viewer->addPointCloud(cloudptr, "cloud");
setCentralWidget(widget);
}
PCLTest::~PCLTest()
{}
#include "PCLTest.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PCLTest w;
w.show();
return a.exec();
}
PS:评论区回复不及时,如果有疑问的可以q2796405100,力所能及的帮助大家。
测试项目,链接:测试项目代码
提取码:1111
五、QtCreator配置PCL教程
Qt Creator是QT项目的编辑器,类似于VS,虽然有些方面不如VS,但是写图形界面以及配置依赖简单得多,基本在.pro文件中就能搞定。废话不多说,开始配置。
1. Qt Creator安装msvc
可能是因为PCL是msvc编译的,所以用MingW编译项目会报错。安装Qt时使用Qt Maintenance Tool,运行检查是否安装了msvc,如下图,没有勾选则进行勾选安装。
安装成功后,创建工程选择下图的环境进行创建。
如果该环境不可选,则打开工具>>外部>>配置>>构建套件Kit,查看自动检测是否成功,如果有红色感叹号说明失败。需要手动配置。
依次次执行下边的步骤,可以看到点击序号1,序号1显示msvc是64bit,打开 管理
可以将鼠标悬浮在在每条选项上,出现图示提示,找到同为64bit的选项,然后回到上图界面,将编译器C和C++的值设置为该选项,点击应用即可。如果这样还是没有成功,就考虑自己查找配置方法或者转战VS。
没有安装visual studio,编译器》管理里可能没有msvc选项。安装整个vs过于臃肿,可以到官网下载下载vs BuildTools.exe。见下图。
运行vs BuildTools 安装C++的桌面开发,在安装详细信息处,序号2是默认勾选的,序号3处自行根据Qt Kit里的版本进行勾选。MSVC2019 则对应安装vs2019即可,安装后可以在编译器》管理里看到选项。
2. pro文件配置PCL
每个QT项目都至少会有一个.pro文件。例如,创建一个名为PCLTest的项目,就会有一个PCLTest.pro文件,内容如下列代码区。内容看似很多,但是需要配置的东西用程序简化即可。注意看代码区的中文注释,依据注释更改即可。
# PCLTest.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
################## 此处之前都是QT项目原生的东西,不需要管 ############################
#前面的PCL_ROOT、3rdParty_Qhull等名称任意,括号里的路径需要修改为自己的安装路径
PCL_ROOT = $$quote(C:/Program Files/PCL 1.13.1)
3rdParty_Qhull = $$quote(C:/Program Files/PCL 1.13.1/3rdParty/Qhull)
3rdParty_FLANN = $$quote(C:/Program Files/PCL 1.13.1/3rdParty/FLANN)
3rdParty_Boost = $$quote(C:/Program Files/PCL 1.13.1/3rdParty/Boost)
3rdParty_Eigen = $$quote(C:/Program Files/PCL 1.13.1/3rdParty/Eigen)
3rdParty_VTK = $$quote(C:/Program Files/PCL 1.13.1/3rdParty/VTK)
OpenNI_ROOT = $$quote(C:/Program Files/OpenNI2)
# $$ 符号后的名称要和上边定义的名称一致
INCLUDEPATH += \ #注意此处有 反斜线| 符号
$$PCL_ROOT/include/pcl-1.13 \ # 注意include后的版本号
$$3rdParty_Qhull/include \
$$3rdParty_FLANN/include \
$$3rdParty_Boost/include/boost-1_82 \ # 注意include后的版本号
$$3rdParty_Eigen/eigen3 \
$$3rdParty_VTK/include/vtk-9.2\ # 注意include后的版本号
$$OpenNI_ROOT/Include #注意此处没有 反斜线| 符号
# $$ 符号后的名称要和上边定义的名称一致
LIBS+= \ #注意此处有 反斜线| 符号
-L$$PCL_ROOT/lib \
-L$$3rdParty_Qhull/lib \
-L$$3rdParty_FLANN/lib \
-L$$3rdParty_Boost/lib \
-L$$3rdParty_Eigen/lib \
-L$$3rdParty_VTK/lib \
-L$$OpenNI_ROOT/Lib #注意此处没有 反斜线| 符号
LIBS += -lOpenNI2
# 下列的-lxxxxx其实就是.lib文件,VS中配置的附加依赖
# 我写了程序来生成,在后面的代码区运行程序后复制过来即可
# 结尾有字母d的是debug版本。
# win32:CONFIG(release, debug|release): LIBS += \
# 这里粘贴release.txt的内容
# else:win32:CONFIG(debug, debug|release): LIBS += \
# 这里粘贴debug.txt的内容
win32:CONFIG(release, debug|release): LIBS += \ #注意此处有 反斜线| 符号
-lpcl_common \
-lpcl_features \
-lpcl_filters \
-lpcl_io \
-lpcl_io_ply \
-lpcl_kdtree \
-lpcl_keypoints \
-lpcl_ml \
-lpcl_octree \
-lpcl_outofcore \
-lpcl_people \
-lpcl_recognition \
-lpcl_registration \
-lpcl_sample_consensus \
-lpcl_search \
-lpcl_segmentation \
-lpcl_stereo \
-lpcl_surface \
-lpcl_tracking \
-lpcl_visualization \
-lvtkcgns-9.2 \
-lvtkChartsCore-9.2 \
-lvtkCommonColor-9.2 \
-lvtkCommonComputationalGeometry-9.2 \
-lvtkCommonCore-9.2 \
-lvtkCommonDataModel-9.2 \
-lvtkCommonExecutionModel-9.2 \
-lvtkCommonMath-9.2 \
-lvtkCommonMisc-9.2 \
-lvtkCommonSystem-9.2 \
-lvtkCommonTransforms-9.2 \
-lvtkDICOMParser-9.2 \
-lvtkDomainsChemistry-9.2 \
-lvtkDomainsChemistryOpenGL2-9.2 \
-lvtkdoubleconversion-9.2 \
-lvtkexodusII-9.2 \
-lvtkexpat-9.2 \
-lvtkFiltersAMR-9.2 \
-lvtkFiltersCore-9.2 \
-lvtkFiltersExtraction-9.2 \
-lvtkFiltersFlowPaths-9.2 \
-lvtkFiltersGeneral-9.2 \
-lvtkFiltersGeneric-9.2 \
-lvtkFiltersGeometry-9.2 \
-lvtkFiltersHybrid-9.2 \
-lvtkFiltersHyperTree-9.2 \
-lvtkFiltersImaging-9.2 \
-lvtkFiltersModeling-9.2 \
-lvtkFiltersParallel-9.2 \
-lvtkFiltersParallelImaging-9.2 \
-lvtkFiltersPoints-9.2 \
-lvtkFiltersProgrammable-9.2 \
-lvtkFiltersSelection-9.2 \
-lvtkFiltersSMP-9.2 \
-lvtkFiltersSources-9.2 \
-lvtkFiltersStatistics-9.2 \
-lvtkFiltersTexture-9.2 \
-lvtkFiltersTopology-9.2 \
-lvtkFiltersVerdict-9.2 \
-lvtkfmt-9.2 \
-lvtkfreetype-9.2 \
-lvtkGeovisCore-9.2 \
-lvtkgl2ps-9.2 \
-lvtkglew-9.2 \
-lvtkhdf5-9.2 \
-lvtkhdf5_hl-9.2 \
-lvtkImagingColor-9.2 \
-lvtkImagingCore-9.2 \
-lvtkImagingFourier-9.2 \
-lvtkImagingGeneral-9.2 \
-lvtkImagingHybrid-9.2 \
-lvtkImagingMath-9.2 \
-lvtkImagingMorphological-9.2 \
-lvtkImagingSources-9.2 \
-lvtkImagingStatistics-9.2 \
-lvtkImagingStencil-9.2 \
-lvtkInfovisCore-9.2 \
-lvtkInfovisLayout-9.2 \
-lvtkInteractionImage-9.2 \
-lvtkInteractionStyle-9.2 \
-lvtkInteractionWidgets-9.2 \
-lvtkIOAMR-9.2 \
-lvtkIOAsynchronous-9.2 \
-lvtkIOCesium3DTiles-9.2 \
-lvtkIOCGNSReader-9.2 \
-lvtkIOChemistry-9.2 \
-lvtkIOCityGML-9.2 \
-lvtkIOCONVERGECFD-9.2 \
-lvtkIOCore-9.2 \
-lvtkIOEnSight-9.2 \
-lvtkIOExodus-9.2 \
-lvtkIOExport-9.2 \
-lvtkIOExportGL2PS-9.2 \
-lvtkIOExportPDF-9.2 \
-lvtkIOGeometry-9.2 \
-lvtkIOHDF-9.2 \
-lvtkIOImage-9.2 \
-lvtkIOImport-9.2 \
-lvtkIOInfovis-9.2 \
-lvtkIOIOSS-9.2 \
-lvtkIOLegacy-9.2 \
-lvtkIOLSDyna-9.2 \
-lvtkIOMINC-9.2 \
-lvtkIOMotionFX-9.2 \
-lvtkIOMovie-9.2 \
-lvtkIONetCDF-9.2 \
-lvtkIOOggTheora-9.2 \
-lvtkIOParallel-9.2 \
-lvtkIOParallelXML-9.2 \
-lvtkIOPLY-9.2 \
-lvtkIOSegY-9.2 \
-lvtkIOSQL-9.2 \
-lvtkioss-9.2 \
-lvtkIOTecplotTable-9.2 \
-lvtkIOVeraOut-9.2 \
-lvtkIOVideo-9.2 \
-lvtkIOXML-9.2 \
-lvtkIOXMLParser-9.2 \
-lvtkjpeg-9.2 \
-lvtkjsoncpp-9.2 \
-lvtkkissfft-9.2 \
-lvtklibharu-9.2 \
-lvtklibproj-9.2 \
-lvtklibxml2-9.2 \
-lvtkloguru-9.2 \
-lvtklz4-9.2 \
-lvtklzma-9.2 \
-lvtkmetaio-9.2 \
-lvtknetcdf-9.2 \
-lvtkogg-9.2 \
-lvtkParallelCore-9.2 \
-lvtkParallelDIY-9.2 \
-lvtkpng-9.2 \
-lvtkpugixml-9.2 \
-lvtkRenderingAnnotation-9.2 \
-lvtkRenderingContext2D-9.2 \
-lvtkRenderingContextOpenGL2-9.2 \
-lvtkRenderingCore-9.2 \
-lvtkRenderingFreeType-9.2 \
-lvtkRenderingGL2PSOpenGL2-9.2 \
-lvtkRenderingHyperTreeGrid-9.2 \
-lvtkRenderingImage-9.2 \
-lvtkRenderingLabel-9.2 \
-lvtkRenderingLICOpenGL2-9.2 \
-lvtkRenderingLOD-9.2 \
-lvtkRenderingOpenGL2-9.2 \
-lvtkRenderingSceneGraph-9.2 \
-lvtkRenderingUI-9.2 \
-lvtkRenderingVolume-9.2 \
-lvtkRenderingVolumeOpenGL2-9.2 \
-lvtkRenderingVtkJS-9.2 \
-lvtksqlite-9.2 \
-lvtksys-9.2 \
-lvtkTestingRendering-9.2 \
-lvtktheora-9.2 \
-lvtktiff-9.2 \
-lvtkverdict-9.2 \
-lvtkViewsContext2D-9.2 \
-lvtkViewsCore-9.2 \
-lvtkViewsInfovis-9.2 \
-lvtkWrappingTools-9.2 \
-lvtkzlib-9.2 #注意此处没有 反斜线| 符号
else:win32:CONFIG(debug, debug|release): LIBS += \ #注意此处有 反斜线| 符号
-lpcl_commond \
-lpcl_featuresd \
-lpcl_filtersd \
-lpcl_iod \
-lpcl_io_plyd \
-lpcl_kdtreed \
-lpcl_keypointsd \
-lpcl_mld \
-lpcl_octreed \
-lpcl_outofcored \
-lpcl_peopled \
-lpcl_recognitiond \
-lpcl_registrationd \
-lpcl_sample_consensusd \
-lpcl_searchd \
-lpcl_segmentationd \
-lpcl_stereod \
-lpcl_surfaced \
-lpcl_trackingd \
-lpcl_visualizationd \
-lvtkcgns-9.2-gd \
-lvtkChartsCore-9.2-gd \
-lvtkCommonColor-9.2-gd \
-lvtkCommonComputationalGeometry-9.2-gd \
-lvtkCommonCore-9.2-gd \
-lvtkCommonDataModel-9.2-gd \
-lvtkCommonExecutionModel-9.2-gd \
-lvtkCommonMath-9.2-gd \
-lvtkCommonMisc-9.2-gd \
-lvtkCommonSystem-9.2-gd \
-lvtkCommonTransforms-9.2-gd \
-lvtkDICOMParser-9.2-gd \
-lvtkDomainsChemistry-9.2-gd \
-lvtkDomainsChemistryOpenGL2-9.2-gd \
-lvtkdoubleconversion-9.2-gd \
-lvtkexodusII-9.2-gd \
-lvtkexpat-9.2-gd \
-lvtkFiltersAMR-9.2-gd \
-lvtkFiltersCore-9.2-gd \
-lvtkFiltersExtraction-9.2-gd \
-lvtkFiltersFlowPaths-9.2-gd \
-lvtkFiltersGeneral-9.2-gd \
-lvtkFiltersGeneric-9.2-gd \
-lvtkFiltersGeometry-9.2-gd \
-lvtkFiltersHybrid-9.2-gd \
-lvtkFiltersHyperTree-9.2-gd \
-lvtkFiltersImaging-9.2-gd \
-lvtkFiltersModeling-9.2-gd \
-lvtkFiltersParallel-9.2-gd \
-lvtkFiltersParallelImaging-9.2-gd \
-lvtkFiltersPoints-9.2-gd \
-lvtkFiltersProgrammable-9.2-gd \
-lvtkFiltersSelection-9.2-gd \
-lvtkFiltersSMP-9.2-gd \
-lvtkFiltersSources-9.2-gd \
-lvtkFiltersStatistics-9.2-gd \
-lvtkFiltersTexture-9.2-gd \
-lvtkFiltersTopology-9.2-gd \
-lvtkFiltersVerdict-9.2-gd \
-lvtkfmt-9.2-gd \
-lvtkfreetype-9.2-gd \
-lvtkGeovisCore-9.2-gd \
-lvtkgl2ps-9.2-gd \
-lvtkglew-9.2-gd \
-lvtkhdf5-9.2-gd \
-lvtkhdf5_hl-9.2-gd \
-lvtkImagingColor-9.2-gd \
-lvtkImagingCore-9.2-gd \
-lvtkImagingFourier-9.2-gd \
-lvtkImagingGeneral-9.2-gd \
-lvtkImagingHybrid-9.2-gd \
-lvtkImagingMath-9.2-gd \
-lvtkImagingMorphological-9.2-gd \
-lvtkImagingSources-9.2-gd \
-lvtkImagingStatistics-9.2-gd \
-lvtkImagingStencil-9.2-gd \
-lvtkInfovisCore-9.2-gd \
-lvtkInfovisLayout-9.2-gd \
-lvtkInteractionImage-9.2-gd \
-lvtkInteractionStyle-9.2-gd \
-lvtkInteractionWidgets-9.2-gd \
-lvtkIOAMR-9.2-gd \
-lvtkIOAsynchronous-9.2-gd \
-lvtkIOCesium3DTiles-9.2-gd \
-lvtkIOCGNSReader-9.2-gd \
-lvtkIOChemistry-9.2-gd \
-lvtkIOCityGML-9.2-gd \
-lvtkIOCONVERGECFD-9.2-gd \
-lvtkIOCore-9.2-gd \
-lvtkIOEnSight-9.2-gd \
-lvtkIOExodus-9.2-gd \
-lvtkIOExport-9.2-gd \
-lvtkIOExportGL2PS-9.2-gd \
-lvtkIOExportPDF-9.2-gd \
-lvtkIOGeometry-9.2-gd \
-lvtkIOHDF-9.2-gd \
-lvtkIOImage-9.2-gd \
-lvtkIOImport-9.2-gd \
-lvtkIOInfovis-9.2-gd \
-lvtkIOIOSS-9.2-gd \
-lvtkIOLegacy-9.2-gd \
-lvtkIOLSDyna-9.2-gd \
-lvtkIOMINC-9.2-gd \
-lvtkIOMotionFX-9.2-gd \
-lvtkIOMovie-9.2-gd \
-lvtkIONetCDF-9.2-gd \
-lvtkIOOggTheora-9.2-gd \
-lvtkIOParallel-9.2-gd \
-lvtkIOParallelXML-9.2-gd \
-lvtkIOPLY-9.2-gd \
-lvtkIOSegY-9.2-gd \
-lvtkIOSQL-9.2-gd \
-lvtkioss-9.2-gd \
-lvtkIOTecplotTable-9.2-gd \
-lvtkIOVeraOut-9.2-gd \
-lvtkIOVideo-9.2-gd \
-lvtkIOXML-9.2-gd \
-lvtkIOXMLParser-9.2-gd \
-lvtkjpeg-9.2-gd \
-lvtkjsoncpp-9.2-gd \
-lvtkkissfft-9.2-gd \
-lvtklibharu-9.2-gd \
-lvtklibproj-9.2-gd \
-lvtklibxml2-9.2-gd \
-lvtkloguru-9.2-gd \
-lvtklz4-9.2-gd \
-lvtklzma-9.2-gd \
-lvtkmetaio-9.2-gd \
-lvtknetcdf-9.2-gd \
-lvtkogg-9.2-gd \
-lvtkParallelCore-9.2-gd \
-lvtkParallelDIY-9.2-gd \
-lvtkpng-9.2-gd \
-lvtkpugixml-9.2-gd \
-lvtkRenderingAnnotation-9.2-gd \
-lvtkRenderingContext2D-9.2-gd \
-lvtkRenderingContextOpenGL2-9.2-gd \
-lvtkRenderingCore-9.2-gd \
-lvtkRenderingFreeType-9.2-gd \
-lvtkRenderingGL2PSOpenGL2-9.2-gd \
-lvtkRenderingHyperTreeGrid-9.2-gd \
-lvtkRenderingImage-9.2-gd \
-lvtkRenderingLabel-9.2-gd \
-lvtkRenderingLICOpenGL2-9.2-gd \
-lvtkRenderingLOD-9.2-gd \
-lvtkRenderingOpenGL2-9.2-gd \
-lvtkRenderingSceneGraph-9.2-gd \
-lvtkRenderingUI-9.2-gd \
-lvtkRenderingVolume-9.2-gd \
-lvtkRenderingVolumeOpenGL2-9.2-gd \
-lvtkRenderingVtkJS-9.2-gd \
-lvtksqlite-9.2-gd \
-lvtksys-9.2-gd \
-lvtkTestingRendering-9.2-gd \
-lvtktheora-9.2-gd \
-lvtktiff-9.2-gd \
-lvtkverdict-9.2-gd \
-lvtkViewsContext2D-9.2-gd \
-lvtkViewsCore-9.2-gd \
-lvtkViewsInfovis-9.2-gd \
-lvtkWrappingTools-9.2-gd \
-lvtkzlib-9.2-gd #注意此处没有 反斜线| 符号
win32:CONFIG(release, debug|release): LIBS += \
else:win32:CONFIG(debug, debug|release): LIBS += \
有的教程好像写作
win32-msvc:CONFIG(release, debug|release): LIBS += \
else:win32-msvc:CONFIG(debug, debug|release): LIBS += \
我加了前后没什么影响,诸君自行尝试
3. 获取配置文件的程序
具体文件如何获取,代表什么含义,请跳转步骤三第4部分,该程序是将源程序微调而来。
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream fp1, fp2;
fp1.open("D:/PCL/pcl.txt", ios::in);
fp2.open("D:/PCL/vtk.txt", ios::in);
ofstream frelease, fdebug;
frelease.open("D:/PCL/release.txt", ios::out);
fdebug.open("D:/PCL/debug.txt", ios::out);
if (!fp1.is_open() || !fp2.is_open() || !frelease.is_open() || !fdebug.is_open()) {
cout << "[\033[31merror\033[0m]failed to open files." << endl;
}
else {
cout << "[\033[32m-info\033[0m]files are ok." << endl;
}
auto generate = [](ifstream& fp, ofstream& fdebug, ofstream& frelease) {
char lbuf[] = "-l";
while (!fp.eof()) {
char buff[1024];
memset(buff, 0, 1024);
fp.getline(buff, 1024);
int len = strlen(buff);
if (len < 1) continue;
if (buff[len - 4] == '.' && buff[len - 5] == 'd') {
memset(buff + len - 4, 0, 4);
buff[len - 4] = ' ';
buff[len - 3] = '\\';
buff[len - 2] = '\n';
fdebug.write(lbuf, 2);
fdebug.write(buff, strlen(buff));
}
else {
memset(buff + len - 4, 0, 4);
buff[len - 4] = ' ';
buff[len - 3] = '\\';
buff[len - 2] = '\n';
frelease.write(lbuf, 2);
frelease.write(buff, strlen(buff));
}
}
};
cout << "[\033[34mdebug\033[0m]start generate pcl-debug and pcl-release..." << endl;
generate(fp1, fdebug, frelease);
cout << "[\033[34mdebug\033[0m]start generate vtk-debug and vtk-release..." << endl;
generate(fp2, fdebug, frelease);
cout << "[\033[32minfo\033[0m]mgenerate files is complated." << endl;
fp1.close();
fp2.close();
frelease.close();
fdebug.close();
return 0;
}
将release.txt和debug.txt粘贴到.pro对应的位置,就可以在工程中写PCL程序了,是不是比VS简单一万倍呢。同样用下面的方法让QT接管PCL窗口,就省去了编译VTK的耗时耗力的步骤。至此,PCL安装教程彻底完结了。如果有不懂的,欢迎B站一起讨论。
//1.
//通过PCLVisualizer绘制点云
pcl::visualization::PCLVisualizer::Ptr cloud_viewer;
//初始化指针
cloud_viewer.reset(new pcl::visualization::PCLVisualizer("viewer"));
//设置点云窗口是否显示FPS
cloud_viewer->setShowFPS(show_fps);
//获取点云窗口cloud_viewer的ID。 QWindow::fromWinId需要#include<QWindow>
auto viewerWinId = QWindow::fromWinId((WId)cloud_viewer->getRenderWindow()->GetGenericWindowId());
//将点云窗口渲染到QT的窗口
widget = QWidget::createWindowContainer(viewerWinId, nullptr);
//我是重新写了一个继承自QDockWidget的类,用以下代码让widget渲染在QDockWidget中。再在QMainWindow类中使用addDockWidget(Qt::TopDockWidgetArea, viewer);就可以完美嵌入了。
setWidget(widget);
//2.
//如果想直接在QMainWindow中嵌入,可以尝试
auto viewerWinId = QWindow::fromWinId((WId)cloud_viewer->getRenderWindow()->GetGenericWindowId());
widget = QWidget::createWindowContainer(viewerWinId, nullptr);
setCentralWind(widget);
老传统,示例项目链接:提取码:1111