PCL配置记录

news2025/1/31 15:05:21

PCL配置记录

1. Windows10+vs2019+pcl

win10+vs2019+pcl 1.11.1

1.下载与安装

https://github.com/PointCloudLibrary/pcl/releases
在这里插入图片描述
)

双击exe安装

注意:

(在这里插入图片描述
)

解压

“pcl-1.11.0-pdb-msvc2019-win64.zip”,将解压得到的文件夹中的内容添加“…\PCL 1.11.0\bin”中
在这里插入图片描述

添加环境变量

在这里插入图片描述

2.VS2019中的配置

在VS中新建一个空项目,编译环境改为X64,Release版本。

视图->其他窗口->属性管理器

新建一个项目属性表

在这里插入图片描述

双击打开,进入 VC++目录->包含目录,添加:

D:\PCL 1.11.1\include\pcl-1.11
D:\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
D:\PCL 1.11.1\3rdParty\Eigen\eigen3
D:\PCL 1.11.1\3rdParty\Qhull\include
D:\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2
D:\PCL 1.11.1\3rdParty\FLANN\include
C:\Program Files\OpenNI2\Include

VC++目录->库目录,添加:

D:\PCL 1.11.1\lib
D:\PCL 1.11.1\3rdParty\Boost\lib
D:\PCL 1.11.1\3rdParty\FLANN\lib
D:\PCL 1.11.1\3rdParty\Qhull\lib
D:\PCL 1.11.1\3rdParty\VTK\lib
C:\Program Files\OpenNI2\Lib

C/C++—>预处理器—>预处理器定义 添加

BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE

C/C++ ->所有选项->SDL检查 改为

链接器—>输入—>附加的依赖项

PCL 1.11.0\3rdParty\VTK\libPCL 1.11.0\lib这两个文件夹下的lib文件的release版本添加到附加依赖项中

为了方便,通过批处理把文件夹中的文件名写入到一个txt中:

//win+r调出“运行”窗口并输出cmd
//(填自己的路径)
cd /d D:\programming\PCL 1.11.0\lib 
dir /b *.lib *>0.txt

注意,这个0.txt中会把0.txt和一个pkgconfig文件夹也写进去,复制到附加依赖项之前,应该把这两个删掉,否则会报错

现在该txt中包含了release和debug两种版本的库,如下图,需要将release版本单独分离出来,对于相同功能的库,两个版本是挨着的,可以用程序把他们分别写到两个txt中。

#include <iostream>
#include <string>
#include <fstream> 
#include <iostream>
using namespace std;

int main()
{
	ifstream txtfile;//打开读取的文件
	ofstream txt01;//保存的文件
	ofstream txt02;//保存的文件
	string temp;
	int index = 0;//用于判断奇偶

	txtfile.open("0.txt", ios::in);
 
	while (!txtfile.eof())            // 若未到文件结束一直循环
	{

		getline(txtfile, temp);//一行一行读取
		if (index%2==0)//判断除以2的余数,即为奇偶的判断
		{
			txt01.open("1.txt", ios::app);
			txt01 << temp;
			txt01 << endl;
			txt01.close();
		}
		else
		{
			txt02.open("2.txt", ios::app);
			txt02 << temp;
			txt02 << endl;
			txt02.close();
		}
		index++;
	}
	txtfile.close();   //关闭文件
	txtfile.close();
	txt01.close();
	txt02.close();
	
	return 0;
}


3.测试代码

#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/point_types.h> //PCL中支持的点类型头文件。

using namespace std;
int split_file();

int  main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new 	pcl::PointCloud<pcl::PointXYZ>);
	char strfilepath[256] = "rabbit.pcd";
	if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) //打开点云文件
	{
		std::cout << "error input!" << std::endl;
		return -1;
	}
	std::cout << cloud->points.size() << std::endl;
	pcl::visualization::CloudViewer viewer("Cloud Viewer");     //创建viewer对象
	viewer.showCloud(cloud);
	system("pause");
	return 0;
}

4.bugFix

C4996 ‘pcl::visualization::PointCloudColorHandler::getColor’: use getColor() without parameters instead (It will be removed in PCL 1.12) PCL_demo D:\PCL 1.11.1\include\pcl-1.11\pcl\visualization\point_cloud_color_handlers.h 109

在这里插入图片描述

在代码最前面加上 #pragma warning(disable:4996)

2. Win10+Clion+QT

下载与安装与上一章一致,主要在Clion配置。

环境:win10+clion+opencv+qt 64位

1.配置clion

注意选择64位,因为PCL版本下载的是64位的

在这里插入图片描述

2.CmakeList

cmake_minimum_required(VERSION 3.17)
project(project_name)

set(CMAKE_CXX_STANDARD 14)

add_executable(project_name main.cpp)

find_package(PCL 1.11 REQUIRED)
FIND_PACKAGE(PCL REQUIRED COMPONENTS common io visualization )
find_package(OpenCV REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

target_link_libraries(project_name ${OpenCV_LIBS} ${PCL_LIBRARIES})

3.测试代码

#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include<opencv2/opencv.hpp>
using namespace cv;

int
main (int argc, char** argv)
{
    Mat img = imread("test.png");
    imshow("test",img);
    waitKey(0);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new  pcl::PointCloud<pcl::PointXYZ>);
    char strfilepath[256] = "rabbit.pcd";
    if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) //打开点云文件
    {
        std::cout << "error input!" << std::endl;
        return -1;
    }
    std::cout << cloud->points.size() << std::endl;
    pcl::visualization::CloudViewer viewer("Cloud Viewer");     //创建viewer对象
    viewer.showCloud(cloud);
    getchar();
    return 0;
}

4.QT 配置

QtCreator 与UIC配置

File->settings

在这里插入图片描述

在这里插入图片描述

配置好后就可以在Tools->external Tools 里找到qtcreator了

也可以右击.ui文件,找到external Tools ,就可以用UIC编译Ui文件了

CmakeList
cmake_minimum_required(VERSION 3.17)
project(project_name)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_INCLUDE_CURRENT_DIR  ON)
#打开Qt的MOC功能和UI文件处理功能
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
#查找Qt的库
find_package(Qt5Widgets)
add_executable(project_name main.cpp mainwindow.h )

find_package(PCL 1.11 REQUIRED)
FIND_PACKAGE(PCL REQUIRED COMPONENTS common io visualization )
find_package(OpenCV REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

target_link_libraries(project_name ${OpenCV_LIBS} ${PCL_LIBRARIES} Qt5::Widgets)
BugFix

https://blog.csdn.net/jh1513/article/details/52262115

3. QT中VTK的配置

1.VTK重新编译

主要过程见下图链接

https://blog.csdn.net/weixin_43981402/article/details/84845274

下载VTK源码:

https://vtk.org/download/

在这里插入图片描述

Cmake编译

设置好两个空目录,一是install 一是prefix
在这里插入图片描述

cmake里勾上Qt相关的选项,点击Configure,之后点击Generate,后面就可以在install文件夹里找到sln文件,用vs2019打开,生成解决方案即可。

注意,编译的时候选择release x64

在这里插入图片描述

之后前往vtk-prefix文件夹,用里面的文件替换掉${PCL_LIB}\3rdParty\VTK\下的所有文件。

此外,将${PCL_LIB}\3rdParty\VTK\plugins\designer下的QVTKWidgetPlugin.dll文件复制到

${QTLIB}\5.13.2\msvc2017_64\plugins\designer中,就可以在QTdesigner中看到QVTKWidget了。

2.CmakeList

cmake_minimum_required(VERSION 3.17)
project(Mysqlserver_socket)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_INCLUDE_CURRENT_DIR  ON)
#打开Qt的MOC功能和UI文件处理功能
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
#查找Qt的库
find_package(Qt5Widgets)

find_package(VTK)
if(VTK_FOUND)
    include(${VTK_USE_FILE})
else(VTK_FOUND)
    message(FATAL_ERROR "cannot bulid without vtk")
endif(VTK_FOUND)

set(VTK_LIBS ${VTK_LIBRARIES})

find_package(PCL 1.11 REQUIRED)
FIND_PACKAGE(PCL REQUIRED COMPONENTS common io visualization )
find_package(OpenCV REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(Mysqlserver_socket main.cpp mainwindow.h )
target_link_libraries(Mysqlserver_socket ${OpenCV_LIBS} ${PCL_LIBRARIES} ${VTK_LIBS} Qt5::Widgets)

3.测试代码

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include <QFileDialog>
#include<iostream>
#include <vtkRenderWindow.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initialVtkWidget();
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(pushButtonTest()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pushButtonTest() {
    //只能打开PCD文件
    QString fileName = QFileDialog::getOpenFileName(this,
                                                    tr("Open PointCloud"), ".",
                                                    tr("Open PCD files(*.pcd)"));

    if (!fileName.isEmpty())
    {
        std::string file_name = fileName.toStdString();
        //sensor_msgs::PointCloud2 cloud2;
        pcl::PCLPointCloud2 cloud2;
        //pcl::PointCloud<Eigen::MatrixXf> cloud2;
        Eigen::Vector4f origin;
        Eigen::Quaternionf orientation;
        int pcd_version;
        int data_type;
        unsigned int data_idx;
        int offset = 0;
        pcl::PCDReader rd;
        rd.readHeader(file_name, cloud2, origin, orientation, pcd_version, data_type, data_idx);

        if (data_type == 0)
        {
            pcl::io::loadPCDFile(fileName.toStdString(), *cloud);
        }
        else if (data_type == 2)
        {
            pcl::PCDReader reader;
            reader.read<pcl::PointXYZ>(fileName.toStdString(), *cloud);
        }

        viewer->updatePointCloud(cloud, "cloud");
        viewer->resetCamera();
        ui->qvtkWidget->update();
    }
}
void MainWindow::initialVtkWidget() {
    cloud.reset (new pcl::PointCloud<pcl::PointXYZ>);
    viewer.reset (new pcl::visualization::PCLVisualizer ("viewer", false));
    viewer->addPointCloud (cloud, "cloud");

    ui->qvtkWidget->SetRenderWindow(viewer->getRenderWindow ());
    viewer->setupInteractor (ui->qvtkWidget->GetInteractor (), ui->qvtkWidget->GetRenderWindow ());
    ui->qvtkWidget->update ();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    //点云数据存储
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
    //初始化vtk部件
    void initialVtkWidget();
private slots:
    void pushButtonTest();
};

#endif // MAINWINDOW_H

4.BugFix

1.static_cast: 无法从vtkObjectBase *const转换为“T”

解决方法:
加入
#include <vtkRenderWindow.h>

2.无法链接的外部符号

it MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;
//点云数据存储
pcl::PointCloudpcl::PointXYZ::Ptr cloud;
boost::shared_ptrpcl::visualization::PCLVisualizer viewer;
//初始化vtk部件
void initialVtkWidget();
private slots:
void pushButtonTest();
};

#endif // MAINWINDOW_H




### 4.BugFix

#### 1.static_cast: 无法从vtkObjectBase *const转换为“T”

解决方法:
加入
\#include <vtkRenderWindow.h>

#### 2.无法链接的外部符号

查看Cmakelist里面find_package的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

momentum2靶机

文章妙语 遇事不决&#xff0c;可问春风&#xff1b; 春风不语&#xff0c;遵循己心。 文章目录 文章妙语前言一、信息收集1.IP地址扫描2.端口扫描3.目录扫描 二&#xff0c;漏洞发现分析代码bp爆破1.生成字典2.生成恶意shell.php2.抓包 三&#xff0c;漏洞利用1.反弹shell 四…

Vue基础知识一

一.Vue简介 1.1 Vue.js 是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既…

swing快速入门(二十四)绘画板-可调色

注释很详细&#xff0c;直接上代码 上一篇 Look here~ 听我说完再继续看更容易理解&#xff1a; 如果说用之前的绘图方法写一个绘画板你会怎么做&#xff1f;重绘会让之前的内容消失呀&#xff0c;用各种数据结构记录每个像素点的位置或颜色&#xff1f;嘶&#xff0c;感觉很麻…

电商数仓项目----笔记六(数仓ODS层)

ODS层的设计要点如下&#xff1a; &#xff08;1&#xff09;ODS层的表结构设计依托于从业务系统同步过来的数据结构。 &#xff08;2&#xff09;ODS层要保存全部历史数据&#xff0c;故其压缩格式应选择压缩比较高的&#xff0c;此处选择gzip。 &#xff08;3&#xff09;…

MySQL运维实战(1.2)安装部署:使用二进制安装部署

作者&#xff1a;俊达 引言 上一篇我们使用了RPM进行安装部署&#xff0c;这是一种安装快速、简化部署和管理过程、与操作系统提供的包管理工具紧密集成的部署方法。此外&#xff0c;当你需要更高的灵活性和自定义性&#xff0c;并且愿意承担一些额外的手动配置和管理工作&am…

【终极教程】Cocos2dx服务端重构(优化cocos2dx服务端)

文章目录 概述问题概述1. 代码混淆代码加密具体步骤测试和配置阶段IPA 重签名操作步骤2. 缺乏文档3. 缺乏推荐的最佳实践4. 性能问题 总结 概述 Cocos2dx是一个非常流行的跨平台游戏引擎&#xff0c;开发者可以使用这个引擎来开发iOS、Android和Web游戏。同时&#xff0c;Coco…

华为gre隧道全部跑静态路由

最终实现&#xff1a; 1、pc1能用nat上网ping能pc3 2、pc1能通过gre访问pc2 3、全部用静态路由做&#xff0c;没有用ospf&#xff0c;如果要用ospf&#xff0c;那么两边除了路由器上跑ospf&#xff0c;核心交换机也得用ospf r2配置&#xff1a; acl number 3000 rule 5 deny…

【ARM Cortex-M 系列 5 -- RT-Thread renesas/ra4m2-eco 移植编译篇】

文章目录 RT-Thread 移植编译篇编译os.environ 使用示例os.putenv使用示例python from 后指定路径 编译问题_POSIX_C_SOURCE 介绍编译结果 RT-Thread 移植编译篇 本文以瑞萨的ra4m2-eco 为例介绍如何下载rt-thread 及编译的设置。 RT-Thread 代码下载&#xff1a; git clone …

Python并行计算和分布式任务全面指南

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python并行计算和分布式任务全面指南。全文2900字&#xff0c;阅读大约8分钟 并发编程是现代软件开发中不可或缺的一部分&#xff0c;它允许程序同时执行多个任务&#xff0…

STM32微控制器在HC-SR501红外感应模块中的能耗优化策略研究

一、 引言 能耗优化是嵌入式系统设计中一个重要的考虑因素&#xff0c;特别是在电池供电的应用中。在使用HC-SR501红外感应模块时&#xff0c;能耗优化策略对于延长电池寿命、提高系统性能至关重要。本文将阐述基于STM32微控制器的HC-SR501红外感应模块能耗优化策略研究。 二、…

[JS设计模式]Flyweight Pattern

Flyweight pattern 享元模式是一种结构化的设计模式&#xff0c;主要用于产生大量类似对象而内存又有限的场景。享元模式能节省内存。 假设一个国际化特大城市SZ&#xff1b;它有5个区&#xff0c;分别为nanshan、futian、luohu、baoan、longgang&#xff1b;每个区都有多个图…

Python 将RTF文件转为Word 、PDF、HTML

RTF也称富文本格式&#xff0c;是一种具有良好兼容性的文档格式&#xff0c;可以在不同的操作系统和应用程序之间进行交换和共享。有时出于不同项目的需求&#xff0c;我们可能需要将RTF文件转为其他格式。本文将介如何通过简单的Python代码将RTF文件转换为Word Doc/Docx、PDF、…

springMVC-异常处理

一、四种异常形式 在springmvc中&#xff0c;处理异常有四种形式 1&#xff0e;局部异常 2.全局异常 3.自定义异常 4.统一异常(统一提示异常&#xff09; 作用&#xff1a;可以使浏览器不出现丑陋的500错误提示&#xff0c;而跳转到另外的错误提示页面 另外&#xff0c;自定义…

小程序面试题 | 11.精选小程序面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【Linux/gcc】C/C++——编译过程

前提&#xff1a;WSL2&#xff08;Ubuntu&#xff09;、gcc编译器。gcc安装命令&#xff1a; sudo apt-get install gcc 查看gcc版本&#xff1a; 目录 1、编译过程 1.1、预处理 1.2、编译与汇编 1.3、链接 2、gcc实验 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 1、…

python+django教学质量评价系统o8x1z

本基于web的在线教学质量评价系统的设计与实现有管理员&#xff0c;教师&#xff0c;督导&#xff0c;学生一共四个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;督导管理&#xff0c;学生评价管理&#xff0c;课程信息管理&#xff0c;学生…

万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&…

.net core webapi 自定义异常过滤器

1.定义统一返回格式 namespace webapi;/// <summary> /// 统一数据响应格式 /// </summary> public class Results<T> {/// <summary>/// 自定义的响应码&#xff0c;可以和http响应码一致&#xff0c;也可以不一致/// </summary>public int Co…

《Python》面试常问:深拷贝、浅拷贝、赋值之间的关系(附可变与不可变)【用图文讲清楚!】

背景 想必大家面试或者平时学习经常遇到问python的深拷贝、浅拷贝和赋值之间的区别了吧&#xff1f;看网上的文章很多写的比较抽象&#xff0c;小白接收的难度有点大&#xff0c;于是乎也想自己整个文章出来供参考 可变与不可变 讲深拷贝和浅拷贝之前想讲讲什么是可变数据类型…

【基础知识】大数据组件HBase简述

HBase是一个开源的、面向列&#xff08;Column-Oriented&#xff09;、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。 只是面向列&#xff0c;不是列式存储 mysql vs hbase vs clickhouse HMaster …