如何在VS2022(QT)或QTCreator上配置并显示PCL点云文件

3 篇文章 0 订阅
1 篇文章 0 订阅

一、安装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安装icon-default.png?t=N7T8https://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

 

  • 34
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值