VS+Qt+C++点云PCL三维显示编辑系统
程序示例精选
VS+Qt+C++点云PCL三维显示编辑系统
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
前言
这篇博客针对《VS+Qt+C++点云PCL三维显示编辑系统》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
文章目录
一、所需工具软件
二、使用步骤
1. 主要代码
2. 运行结果
三、在线协助
一、所需工具软件
1. VS2019,Qt
2. C++
二、使用步骤
代码如下(示例):
#include "PointCloudVision.h"
#include <QFileDialog>
#include <QFile>
#include <QMessageBox>
#include <QColorDialog>PointCloudVision::PointCloudVision(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);//初始化init();
}//获取两个点平行于坐标轴的最短距离
double getMinValue(PointT p1, PointT p2);//获取两个点平行于坐标轴的最长距离
double getMaxValue(PointT p1, PointT p2);//初始化
void PointCloudVision::init()
{//点云初始化m_currentCloud.reset(new PointCloudT);//可视化对象初始化viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));viewer->addPointCloud(m_currentCloud, "cloud");//设置VTK可视化窗口指针ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());//设置窗口交互,窗口可接受键盘等事件viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());//添加坐标轴viewer->addCoordinateSystem();//ui.qvtkWidget->update();//槽函数connect(&heightRampDlg, SIGNAL(setHeightRamp(int, double)), this, SLOT(setHeightRamp(int, double)));}//打开点云
void PointCloudVision::on_action_open_triggered()
{init();QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");if (!fileName.isEmpty()){std::string file_name = fileName.toStdString();pcl::PCLPointCloud2 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(), *m_currentCloud);}else if (data_type == 2){pcl::PCDReader reader;reader.read<pcl::PointXYZ>(fileName.toStdString(), *m_currentCloud);}viewer->addCoordinateSystem();viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");viewer->updatePointCloud(m_currentCloud, "cloud");// 获取点云数据的最小和最大坐标值pcl::getMinMax3D(*m_currentCloud, p_min, p_max);viewer->resetCamera();ui.qvtkWidget->update();}
}//重设视角
void PointCloudVision::on_action_reset_triggered()
{if (!m_currentCloud->empty()){viewer->resetCamera();ui.qvtkWidget->update();}
}//俯视图
void PointCloudVision::on_action_up_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), p_max.z + 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0, 0, 1, 0);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//前视图
void PointCloudVision::on_action_front_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), p_min.y - 2 * maxLen, 0.5 * (p_min.z + p_max.z), 0.5 * (p_min.x + p_max.x), 0, 0.5 * (p_min.z + p_max.z), 0, 0, 1);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//左视图
void PointCloudVision::on_action_left_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(p_min.x - 2 * maxLen, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0, 1);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//后视图
void PointCloudVision::on_action_back_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), p_max.y + 2 * maxLen, 0.5 * (p_min.z + p_max.z), 0.5 * (p_min.x + p_max.x), 0, 0.5 * (p_min.z + p_max.z), 0, 0, 1);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//右视图
void PointCloudVision::on_action_right_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(p_max.x + 2 * maxLen, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0, 1);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//底视图
void PointCloudVision::on_action_bottom_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), p_min.z - 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0, 0, 1, 0);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//前轴测
void PointCloudVision::on_action_frontIso_triggered()
{if (!m_currentCloud->empty()){viewer->setCameraPosition(p_min.x - 2 * maxLen, p_min.y - 2 * maxLen, p_max.z + 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 1, 1, 0);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();}
}//后轴测
void PointCloudVision::on_action_backIso_triggered()
{viewer->setCameraPosition(p_max.x + 2 * maxLen, p_max.y + 2 * maxLen, p_max.z + 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), -1, -1, 0);viewer->updatePointCloud(m_currentCloud, "cloud");ui.qvtkWidget->update();on_action_reset_triggered();
}//设置点云颜色
void PointCloudVision::on_action_setColor_triggered()
{QColor color = QColorDialog::getColor(Qt::white, this, "设置点云颜色", QColorDialog::ShowAlphaChannel);viewer->removeAllPointClouds();pcl::visualization::PointCloudColorHandlerCustom<PointT> singleColor(m_currentCloud, color.red(), color.green(), color.blue());viewer->addPointCloud(m_currentCloud, singleColor, "myCloud", 0);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, color.alpha() * 1.0 / 255, "myCloud");ui.qvtkWidget->update();}//设置高度渲染
void PointCloudVision::on_action_heightRamp_triggered()
{heightRampDlg.show();
}//进行高度渲染
void PointCloudVision::setHeightRamp(int dir, double height)
{//清空点云viewer->removeAllPointClouds();m_heightCloudList.clear();double min_range = 0;double max_range = 0;std::string field = "x";switch (dir){case 0:min_range = p_min.x;max_range = p_max.x;field = "x";break;case 1:min_range = p_min.y;max_range = p_max.y;field = "y";break;case 2:min_range = p_min.z;max_range = p_max.z;field = "z";break;default:break;}for (double i = min_range - 1; i < max_range + height;){PointCloudT::Ptr cloudTemp(new PointCloudT());pcl::PassThrough<PointT> pass; //直通滤波器对象pass.setInputCloud(m_currentCloud); //输入点云pass.setFilterFieldName(field); //设置过滤字段pass.setFilterLimits(i, i + height); //设置过滤范围pass.setFilterLimitsNegative(false); //设置保留字段pass.filter(*cloudTemp); //执行滤波i += height;m_heightCloudList.append(cloudTemp);}//分段渲染for (int j = 0; j < m_heightCloudList.size(); j++){pcl::visualization::PointCloudColorHandlerGenericField<PointT> fieldColor(m_heightCloudList.at(j), field);std::string index = std::to_string(j);viewer->addPointCloud(m_heightCloudList.at(j), fieldColor, index);}}double getMinValue(PointT p1, PointT p2)
{double min = 0;if (p1.x - p2.x > p1.y - p2.y){min = p1.y - p2.y;}else{min = p1.x - p2.x;}if (min > p1.z - p2.z){min = p1.z - p2.z;}return min;
}double getMaxValue(PointT p1, PointT p2)
{double max = 0;if (p1.x - p2.x > p1.y - p2.y){max = p1.x - p2.x;}else{max = p1.y - p2.y;}if (max < p1.z - p2.z){max = p1.z - p2.z;}return max;
}
运行结果

三、在线协助:
如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作
当前文章连接:https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页:https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里:https://blog.csdn.net/alicema1111?type=blog
博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别:https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计:https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统:https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统:https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享:https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别:https://blog.csdn.net/alicema1111/article/details/133434445
Python+Yolov5道路障碍物识别:https://blog.csdn.net/alicema1111/article/details/129589741
Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别:https://blog.csdn.net/alicema1111/article/details/129272048
相关文章:
VS+Qt+C++点云PCL三维显示编辑系统
程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码,代码整洁,规则,易…...
代码随想录算法训练营第七天(一)| 454.四数相加II 383. 赎金信
454.四数相加II 题目: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1࿱…...
SpringBoot+Mybatis 分页
无论多数据源,还是单数据源,分页都一样,刚开始出了点错,是因为PageHelper的版本问题 这里用的SpringBoot3 SpringBoot2应该是没有问题的 相关代码 dynamic-datasourceMybatis多数据源使用-CSDN博客 依赖 <?xml version"1.0" encoding"UTF-8"?&g…...
学习进行到了第十七天(2024.8.5)
1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射,可以…...
【Nuxt】Layout 布局和渲染模式
NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面,其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…...
C:指针学习(1)-学习笔记
目录 前言: 知识回顾: 1、const 1.1 const修饰普通变量 1.2 const修饰指针变量 1.3 总结: 2、指针运算 2.1 指针-整数 2.2 指针-指针 2.3 指针的关系运算 3、指针的使用 结语: 前言: 距离上一次更新关于初…...
【LVS】负载均衡之NAT模式
一、LVS概念 LVS(Linux Virtual Server)是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上,从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…...
ASP.NET Core 基础 - 入门实例
一. 下载 1. 下载vs2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 学生,个人开发者选择社区版就行,免费的. 安装程序一直下一步下一步就行,别忘了选择安装位置,如果都放在C盘的话,就太大了. 2. 选择工作负荷 准备工作完成 二. 创建新项目 三…...
机器人主板维修|ABB机械手主板元器件故障
【ABB机器人电路板故障原因诊断】 针对上述故障现象,我们需要对ABB机器人IO板进行详细的故障诊断。以下是一些可能的故障原因: 1. 元器件老化或损坏:ABB机械手安全面板上的元器件在长期使用过程中可能出现老化、损坏或接触不良等问题…...
大数据Flink(一百零六):什么是阿里云实时计算Flink版
文章目录 什么是阿里云实时计算Flink版 一、产品概述 二、产品架构 三、产品优势 什么是阿里云实时计算Flink版 阿里云实时计算Flink版是一套基于Apache Flink构建的⼀站式实时大数据分析平台,提供端到端亚秒级实时数据分析能力,并通过标准SQL降低业…...
ERCOT中的专业术语解释
在ERCOT中,ECRSM 代表的是 “Emergency Contingency Resource Supplementary Market”。这个术语涉及到紧急备用资源市场,用于应对电力需求或供应的紧急情况。在ERCOT电网中,当系统面临极端情况或资源不足时,ECRSM 可以帮助确保电…...
Python酷库之旅-第三方库Pandas(069)
目录 一、用法精讲 276、pandas.Series.dt.is_quarter_start属性 276-1、语法 276-2、参数 276-3、功能 276-4、返回值 276-5、说明 276-6、用法 276-6-1、数据准备 276-6-2、代码示例 276-6-3、结果输出 277、pandas.Series.dt.is_quarter_end属性 277-1、语法 …...
基于hutools的国密SM2、3、4
文章目录 前言一. 代码 前言 最近还要深度研究hutools底层实现,一定要搞透澈,本章将会是持续更新 参考资料: Java代码实现SM2算法以及注意点总结(踩坑记录) 国密算法工具Smutil 一. 代码 import cn.hutool.core.uti…...
进程的等待(非阻塞轮询+阻塞)和替换控制详解
引言 在Linux系统中,进程管理是核心功能之一。理解进程的创建、执行和终止是系统编程中的基础。本文将深入探讨Linux中的进程控制机制,包括进程的生命周期、父子进程的交互、以及进程状态的管理 1. 进程创建:fork()函数 在Linux操作系统中…...
24/8/6算法笔记 支持向量机
支持向量机(Support Vector Machine, SVM)是一种监督学习算法,主要用于分类和回归任务。它基于统计学习理论中的结构风险最小化原理,通过找到数据点之间的最优边界来实现模型的泛化能力。 import numpy as np import matplotlib.…...
测试用例等级划分
基本等级(Level 1或P0):这类用例设计系统基本功能,执行失败会导致多处重要功能无法运行。例如,单表维护中的增加功能、最平常的业务使用等,这些是发生概率较高的功能用例。这类用例在每一…...
打造Perl编译器前端:自定义语言处理的魔法
打造Perl编译器前端:自定义语言处理的魔法 Perl是一种强大而灵活的编程语言,它提供了丰富的文本处理能力,使其成为实现自定义编译器前端的理想选择。编译器前端通常负责源代码的词法分析、语法分析和语义分析。本文将详细介绍如何在Perl中实…...
Visual Studio 和 Visual Studio Code 的比较与应用偏向
Visual Studio 和 Visual Studio Code(VS Code)是微软开发的两个不同的开发工具,各有特点和优势,适用于不同的开发需求。下面是详细的比较和在实际应用中的偏向。 功能和特性 Visual Studio 完整的IDE:支持多种编程…...
Python打开JSON/CSV文件的正确方式(针对UnicodeDecodeError)
前言 我们在使用python的过程中,经常需要它完成一些数据处理的工作,其中尤以json/csv文件为常见。今天,博主针对UnicodeDecodeError异常进行试验,因为这个是新手最容易犯错的地方。 Q:如何应对 UnicodeDecodeError 读…...
深入解析TikTok广告开户白名单:规范与申请指南
在TikTok的广告平台上,白名单(Whitelist)系统作为一种重要的审核和管理机制,对广告账户的开设与运营起着至关重要的作用。 一、什么是TikTok广告开户白名单? 白名单的定义 白名单是一种预先批准的账户或广告内容列表…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
