QT框架下进行pcl点选功能

本文介绍如何在QT环境中集成PCL库实现点云处理功能,包括点云的显示、点选交互及回调函数的设置。通过将类成员函数作为回调函数参数,实现了点云数据的实时更新和显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先感谢学长的帮助,关于pcl点选网上有源码,但是如何移植到qt里面呢,通过将回调函数设定为静态函数便可以实现这一功能,然后需要注意的是在初始化函数中,需要对点选功能进行操作

viewer->registerPointPickingCallback(point_callback, this);

这里面利用this指针将类成员传给函数,这样就可以使用类里面的成员了。

需要注意的是,初始化函数这么写,

void pcl_test::initialvtk()
{
	pointptr.reset(new pcl::PointCloud<pcl::PointXYZ>);
	viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
	viewer->addPointCloud(pointptr, "cloud");
	viewer->registerPointPickingCallback(point_callback, this);
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr clicked_points_3d_(new pcl::PointCloud<pcl::PointXYZRGB>);
	this->clicked_points_3d = clicked_points_3d_;
	ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
	viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
	ui.qvtkWidget->update();
}

这里面将类成员函数clicked_points_3d进行初始化,为了调用回调函数时,避免内存泄露。但是直接初始化会崩溃,需要引入另外的参数来进行初始化,至于为什么还不知道。

然后回调函数是这样的

void pcl_test::point_callback(const pcl::visualization::PointPickingEvent& event, void* args)
{
	//struct callback_args* data = (struct callback_args *)args;
	pcl_test *p = (pcl_test *)args;


	pcl::PointXYZRGB current_point;
	event.getPoint(current_point.x, current_point.y, current_point.z);
	p->clicked_points_3d->points.push_back(current_point);

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> red(p->clicked_points_3d, 255, 0, 0);
	
	p->viewer->removePointCloud("clicked_points");
	p->viewer->addPointCloud(p->clicked_points_3d, red, "clicked_points");
	p->viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "clicked_points");
}

这个就是和pcl给的源码差不多了,这里主要是将传入的参数args用当前类实例化然后传递。以上是实现这个功能的.cpp

下面给出.h文件

#pragma once


#include <QtWidgets/QMainWindow>
#include "ui_pcl_test.h"

//vtk控件
#include <vtkRenderWindow.h>
#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);

//pcl依赖项
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
//体素滤波
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>
//高斯滤波
#include <pcl/filters/statistical_outlier_removal.h>
//半径滤波
#include<pcl/filters/radius_outlier_removal.h>
//直通滤波
#include <pcl/filters/passthrough.h>





//typedef pcl::PointCloud<pcl::PointXYZ> pointcloud;
//typedef pcl::PointCloud<pcl::PointXYZ> pointcloudrgb;
class pcl_test : public QMainWindow
{
	Q_OBJECT

public:
	pcl_test(QWidget *parent = Q_NULLPTR);
	~pcl_test();

private:

	Ui::pcl_testClass ui;
	//定义点云指针

	pcl::PointCloud<pcl::PointXYZ>::Ptr pointptr;
	//定义显示器
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
	
	//初始化vtk
	void initialvtk();
	//撤销
	void initialize();
	//创建打开槽
//private slots:
	//打开文件
	void openfile();
	//体素滤波
	void voxelgridfilter();
	//初始化全局点云
	//新建一个全局点云以及当前输入点云的储存结果用来存放每次动作后的结果,以便于撤销
	void globalpoint();
	pcl::PointCloud<pcl::PointXYZ>::Ptr globalptr;
	pcl::PointCloud<pcl::PointXYZ>::Ptr local_1ptr;
	pcl::PointCloud<pcl::PointXYZ>::Ptr local_2ptr;
	//局部撤销
	void localinitialize();
	//高斯滤波
	void gaussfilter();
	//半径滤波
	void radiusfilter();
	//直通滤波
	void passthfilter();
	//创建回调函数,用来相应点的读取
	static void point_callback(const pcl::visualization::PointPickingEvent& event,void* args);
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr clicked_points_3d;
	//void point_read();
};

 

为了在QT框架下使用PCL库成功创建一个三维点云数据的可视化界面,首先需要对QT框架PCL库有基本的了解和使用经验。QT框架提供丰富的图形界面控件,而PCL库则专注于三维点云处理算法。以下是实现这一目标的关键技术点和步骤: 参考资源链接:[QT+PCL三维点云可视化界面C++源码及数据包](https://wenku.youkuaiyun.com/doc/4fdnsx3bmd) 1. 安装与配置QTPCL库:确保你的开发环境中安装了QTPCL库,并配置好编译环境。在编译时可能需要指定PCL库的路径。 2. 创建QT项目:使用QT Creator创建一个新的QT Widgets Application项目,配置项目文件以便包含PCL库。 3. 设计界面:在QT Designer中设计可视化界面,可以包括用于加载点云文件的按钮、显示点云的视口控件等。 4. 加载点云数据:使用PCL的IO模块编写代码来加载点云数据文件,例如PLY、PCD等格式。 5. 点云数据处理:使用PCL的点云处理模块对加载的点云数据进行必要的预处理,例如滤波、降噪等。 6. 点云渲染:通过PCL与OpenGL的集成,利用QT的绘图机制,将处理后的点云数据渲染到视口控件中。 7. 交互功能实现:为界面添加必要的交互功能,如缩放、旋转、平移点云,以及保存当前视图状态等。 具体的C++源码实现方法如下: ```cpp #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> int main(int argc, char **argv) { // 初始化QT应用程序 QApplication a(argc, argv); // 创建PCL可视化器 pcl::visualization::PCLVisualizer viewer( 参考资源链接:[QT+PCL三维点云可视化界面C++源码及数据包](https://wenku.youkuaiyun.com/doc/4fdnsx3bmd)
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值