当前位置: 首页 > news >正文

QT -CloudViewer工具

QT -CloudViewer工具

  • 一、演示效果
  • 二、关键程序
  • 三、程序下载


一、演示效果

在这里插入图片描述
在这里插入图片描述

二、关键程序

void CloudViewer::doOpen(const QStringList& filePathList) {// Open point cloud file one by onefor (int i = 0; i != filePathList.size(); i++) {timeStart(); // time startmycloud.cloud.reset(new PointCloudT); // Reset cloudQFileInfo fileInfo(filePathList[i]);std::string filePath = fromQString(fileInfo.filePath());std::string fileName = fromQString(fileInfo.fileName());// begin loadingui.statusBar->showMessage(fileInfo.fileName() + ": " + QString::number(i) + "/" + QString::number(filePathList.size())+ " point cloud loading...");mycloud = fileIO.load(fileInfo);if (!mycloud.isValid) {// TODO: deal with the error, print error info in console?debug("invalid cloud.");continue;}mycloud.viewer = viewer;mycloud_vec.push_back(mycloud);timeCostSecond = timeOff(); // time offconsoleLog("Open",toQString(mycloud.fileName),toQString(mycloud.filePath),"Time cost: " + timeCostSecond + " s, Points: " + QString::number(mycloud.cloud->points.size()));// update tree widgetQTreeWidgetItem *cloudName = new QTreeWidgetItem(QStringList()<< toQString(mycloud.fileName));cloudName->setIcon(0, QIcon(":/Resources/images/icon.png"));ui.dataTree->addTopLevelItem(cloudName);total_points += mycloud.cloud->points.size();}ui.statusBar->showMessage("");showPointcloudAdd();setPropertyTable();
}// Open point cloud
void CloudViewer::open() {QStringList filePathList = QFileDialog::getOpenFileNames(this,tr("Open point cloud file"),toQString(mycloud.fileDir),toQString(fileIO.getInputFormatsStr()));if (filePathList.isEmpty()) return;// Clear cache// TODO: abstract a functionmycloud_vec.clear();total_points = 0;ui.dataTree->clear();viewer->removeAllPointClouds();doOpen(filePathList);
}// Add Point Cloud
void CloudViewer::add() {QStringList filePathList = QFileDialog::getOpenFileNames(this,tr("Add point cloud file"),toQString(mycloud.fileDir),toQString(fileIO.getInputFormatsStr()));if (filePathList.isEmpty()) return;doOpen(filePathList);
}// Clear all point clouds
void CloudViewer::clear() {mycloud_vec.clear();  // 从点云容器中移除所有点云viewer->removeAllPointClouds();  // 从viewer中移除所有点云viewer->removeAllShapes(); // 这个remove更彻底ui.dataTree->clear();  // 将dataTree清空ui.propertyTable->clear();  // 清空属性窗口propertyTableQStringList header;header << "Property" << "Value";ui.propertyTable->setHorizontalHeaderLabels(header);// 输出窗口consoleLog("Clear", "All point clouds", "", "");setWindowTitle("CloudViewer");  // 更新窗口标题showPointcloud();  // 更新显示
}// Save point cloud
void CloudViewer::save() {if (!mycloud.isValid) {QMessageBox::critical(this, tr("Saving file error"),tr("There is no point cloud to save"));return;}// get binary flag from sender()QAction *action = qobject_cast<QAction *>(sender());QVariant v = action->data();bool isSaveBinary = (bool)v.value<bool>();QString selectedFilter = toQString(fileIO.outputFiltersMap.at(mycloud.fileSuffix));QString saveFilePath = QFileDialog::getSaveFileName(this,                                    // parenttoQString("Save point cloud" + string(isSaveBinary ? " (binary)": "")), // captiontoQString(mycloud.filePath),             // dirtoQString(fileIO.getOutputFormatsStr()), // filter&selectedFilter                          // selected filter);if (saveFilePath.isEmpty()) return;QFileInfo fileInfo(saveFilePath);QString saveFileName = fileInfo.fileName();string saveFilePathStd = fromQString(saveFilePath);string saveFileNameStd = fromQString(saveFileName);if (mycloud_vec.size() > 1) {savemulti(fileInfo, isSaveBinary);return;}bool saveStatus = fileIO.save(mycloud, fileInfo, isSaveBinary);if (!saveStatus) {QMessageBox::critical(this, tr("Saving file error"),tr("We can not save the file"));return;}consoleLog("Save", saveFileName, saveFilePath, "Single save");setWindowTitle(saveFilePath + " - CloudViewer");QMessageBox::information(this, tr("save point cloud file"),toQString("Save " + saveFileNameStd + " successfully!"));
}// Save multi point cloud
void CloudViewer::savemulti(const QFileInfo& fileInfo, bool isSaveBinary) {string subname = fromQString(fileInfo.fileName());QString saveFilePath = fileInfo.filePath();PointCloudT::Ptr multi_cloud;multi_cloud.reset(new PointCloudT);multi_cloud->height = 1;int sum = 0;for (auto c : mycloud_vec) {sum += c.cloud->points.size();}multi_cloud->width = sum;multi_cloud->resize(multi_cloud->height * multi_cloud->width);int k = 0;for (int i = 0; i != mycloud_vec.size(); ++i) {// 注意cloudvec[i]->points.size()和cloudvec[i]->size()的区别for (int j = 0; j != mycloud_vec[i].cloud->points.size(); ++j) {multi_cloud->points[k].x = mycloud_vec[i].cloud->points[j].x;multi_cloud->points[k].y = mycloud_vec[i].cloud->points[j].y;multi_cloud->points[k].z = mycloud_vec[i].cloud->points[j].z;multi_cloud->points[k].r = mycloud_vec[i].cloud->points[j].r;multi_cloud->points[k].g = mycloud_vec[i].cloud->points[j].g;multi_cloud->points[k].b = mycloud_vec[i].cloud->points[j].b;k++;}}MyCloud multiMyCloud;multiMyCloud.cloud = multi_cloud;multiMyCloud.isValid = true;// save multi_cloudbool saveStatus = fileIO.save(multiMyCloud, fileInfo, isSaveBinary);if (!saveStatus) {QMessageBox::critical(this, tr("Saving file error"),tr("We can not save the file"));return;}if (isSaveBinary) {consoleLog("Save as binary", QString::fromLocal8Bit(subname.c_str()), saveFilePath, "Multi save (binary)");} else {consoleLog("Save", QString::fromLocal8Bit(subname.c_str()), saveFilePath, "Multi save");}// 将保存后的 multi_cloud 设置为当前 mycloud,以便保存之后直接进行操作mycloud.cloud = multi_cloud;mycloud.filePath = fromQString(saveFilePath);mycloud.fileName = subname;setWindowTitle(saveFilePath + " - CloudViewer");QMessageBox::information(this, tr("save point cloud file"), toQString("Save " + subname + " successfully!"));
}

三、程序下载

https://download.csdn.net/download/u013083044/88628664

相关文章:

QT -CloudViewer工具

QT -CloudViewer工具 一、演示效果二、关键程序三、程序下载 一、演示效果 二、关键程序 void CloudViewer::doOpen(const QStringList& filePathList) {// Open point cloud file one by onefor (int i 0; i ! filePathList.size(); i) {timeStart(); // time startmycl…...

GoLong的学习之路,进阶,微服务之使用,RPC包(包括源码分析)

今天这篇是接上上篇RPC原理之后这篇是讲如何使用go本身自带的标准库RPC。这篇篇幅会比较短。重点在于上一章对的补充。 文章目录 RPC包的概念使用RPC包服务器代码分析如何实现的&#xff1f;总结Server还提供了两个注册服务的方法 客户端代码分析如何实现的&#xff1f;如何异步…...

uniapp x 相比于其他的开发系统框架怎么样?

首先我们要知道niapp这是一种基于Vue.js开发的跨平台应用框架&#xff0c;可以将同一套代码同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。相比其他开发系统框架&#xff0c;他有什么优点呢&#xff1f;让我们共同探讨一下吧&#xff01; 图片来源&#xff1a;unia…...

2024最新独立站建站教程!WordPress 搭建独立站的方法和步骤

不知道大家是否听说过 WordPress &#xff1f;最近有个国外博主分享&#xff0c;她60岁的奶奶居然用WordPress建了个关于她宠物日常的小博客&#xff0c;看来 WordPress 在国外真的是很普及。其实&#xff0c;国外很多商家还利用 WordPress 搭建自己的电商网站&#xff0c;那说…...

深入React Flow Renderer(二):构建拖动操作栏

在上一篇博客中&#xff0c;我们介绍了如何启动React Flow Renderer并创建一个基本的工作流界面。本文将进一步深入&#xff0c;着重讨论如何构建一个可拖动的操作栏&#xff0c;它是用户与工作流交互的入口之一。 引言 操作栏是工作流界面的一部分&#xff0c;通常位于界面的…...

Java项目学生管理系统六后端补充

班级管理 1 班级列表&#xff1a;后端 编写JavaBean【已有】编写Mapper【已有】编写Service编写controller 编写Service 接口 package com.czxy.service;import com.czxy.domain.Classes;import java.util.List;/*** author 桐叔* email liangtongitcast.cn* description*/ p…...

PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为线性化

PDF 线性化&#xff0c;也称为“快速 Web 查看”&#xff0c;是一种优化 PDF 文件的方法。通常&#xff0c;只有当用户的网络浏览器从服务器下载了所有页面后&#xff0c;用户才能在线查看多页 PDF 文件。然而&#xff0c;如果 PDF 文件是线性化的&#xff0c;即使完整下载尚未…...

猫头虎博主深度探索:Amazon Q——2023 re:Invent大会的AI革新之星

猫头虎博主深度探索&#xff1a;Amazon Q——2023 re:Invent大会的AI革新之星 授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科…...

Spring框架-GOF代理模式之JDK动态代理

我们可以分成三步来完成jdk动态代理的实现 第一步&#xff1a;创建目标对象 第二步&#xff1a;创建代理对象 第三步&#xff1a;调用代理对象的代理方法 public class Client {public static void main(String[] args) {//创建目标对象final OrderService target new OrderS…...

基于JAVAEE技术校园车辆管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园车辆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…...

基于FFmpeg,实现播放器功能

一、客户端选择音视频文件 MainActivity package com.anniljing.ffmpegnative;import android.Manifest; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Ur…...

利用tf-idf对特征进行提取

TF-IDF是一种文本特征提取的方法&#xff0c;用于评估一个词在一组文档中的重要性。 一、代码 from sklearn.feature_extraction.text import TfidfVectorizer import numpy as npdef print_tfidf_words(documents):"""打印TF-IDF矩阵中每个文档中非零值对应…...

遇到运维故障,有没有排查和解决故障的正确流程?

稳定是偶然&#xff0c;异常才是常态&#xff0c;用来标注IT运维工作再适合不过。 因为对于IT运维来说&#xff0c;工作最常遇到的就是不稳定性带来的各种故障&#xff0c;经常围绕发现故障、响应故障、定位故障、恢复故障这四大步。 故障处理是最心跳的事情&#xff0c;没有…...

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…...

基于pandoraNext使用chatgpt4

1.登陆GitHub 获取pandoraNext项目GitHub - pandora-next/deploy: Pandora Cloud Pandora Server Shared Chat BackendAPI Proxy Chat2API Signup Free PandoraNext. New GPTs(Gizmo) UI, All in one! 在release中选择相应版本操作系统的安装包进行下载 2.获取license_…...

12.视图

目录 1.视图的含义与作用 2.视图的创建与查看 1.创建视图的语法形式 2、查看视图&#xff1a; 1.使用DESCRIBE语句查看视图基本信息 2.使用SHOW TABLE STATUS语查看视图基本信息查看视图的信息 3.使用SHOW CREATE VIEW语查看视图详细信息 4.在views表中查看视图详细信息…...

Leetcode69 x的平方根

x的平方根 题解1 袖珍计算器算法题解2 二分查找题解3 牛顿迭代 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&…...

在Linux上安装配置Nginx高性能Web服务器

1 前言 Nginx是一个高性能的开源Web服务器&#xff0c;同时也可以作为反向代理服务器、负载均衡器、HTTP缓存以及作为一个邮件代理服务器。它以其出色的性能和灵活性而闻名&#xff0c;被广泛用于处理高流量的网站和应用程序。本文将介绍在Linux环境中安装Nginx的步骤&#xf…...

LeetCode 每日一题 Day 11||贪心

2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变成一个 回文串 。如果执行 最少 操作次数的方…...

ocr表格文字识别软件怎么使用?

现在的OCR软件几乎是傻瓜式的设计&#xff0c;操作很简单&#xff0c;像金鸣识别的软件无论是网页版还是电脑客户端又或是小程序&#xff0c;界面都简单明了&#xff0c;用户只需提交待识别的图片&#xff0c;然后点击提交识别&#xff0c;等识别完成就直接打开或下载打开就行了…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...