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包服务器代码分析如何实现的?总结Server还提供了两个注册服务的方法 客户端代码分析如何实现的?如何异步…...

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

2024最新独立站建站教程!WordPress 搭建独立站的方法和步骤
不知道大家是否听说过 WordPress ?最近有个国外博主分享,她60岁的奶奶居然用WordPress建了个关于她宠物日常的小博客,看来 WordPress 在国外真的是很普及。其实,国外很多商家还利用 WordPress 搭建自己的电商网站,那说…...
深入React Flow Renderer(二):构建拖动操作栏
在上一篇博客中,我们介绍了如何启动React Flow Renderer并创建一个基本的工作流界面。本文将进一步深入,着重讨论如何构建一个可拖动的操作栏,它是用户与工作流交互的入口之一。 引言 操作栏是工作流界面的一部分,通常位于界面的…...

Java项目学生管理系统六后端补充
班级管理 1 班级列表:后端 编写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 线性化,也称为“快速 Web 查看”,是一种优化 PDF 文件的方法。通常,只有当用户的网络浏览器从服务器下载了所有页面后,用户才能在线查看多页 PDF 文件。然而,如果 PDF 文件是线性化的,即使完整下载尚未…...

猫头虎博主深度探索:Amazon Q——2023 re:Invent大会的AI革新之星
猫头虎博主深度探索:Amazon Q——2023 re:Invent大会的AI革新之星 授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科…...
Spring框架-GOF代理模式之JDK动态代理
我们可以分成三步来完成jdk动态代理的实现 第一步:创建目标对象 第二步:创建代理对象 第三步:调用代理对象的代理方法 public class Client {public static void main(String[] args) {//创建目标对象final OrderService target new OrderS…...

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

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

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

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 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、查看视图: 1.使用DESCRIBE语句查看视图基本信息 2.使用SHOW TABLE STATUS语查看视图基本信息查看视图的信息 3.使用SHOW CREATE VIEW语查看视图详细信息 4.在views表中查看视图详细信息…...

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

在Linux上安装配置Nginx高性能Web服务器
1 前言 Nginx是一个高性能的开源Web服务器,同时也可以作为反向代理服务器、负载均衡器、HTTP缓存以及作为一个邮件代理服务器。它以其出色的性能和灵活性而闻名,被广泛用于处理高流量的网站和应用程序。本文将介绍在Linux环境中安装Nginx的步骤…...
LeetCode 每日一题 Day 11||贪心
2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操作次数的方…...

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

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...