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软件几乎是傻瓜式的设计,操作很简单,像金鸣识别的软件无论是网页版还是电脑客户端又或是小程序,界面都简单明了,用户只需提交待识别的图片,然后点击提交识别,等识别完成就直接打开或下载打开就行了…...
告别激活弹窗:KMS_VL_ALL_AIO智能激活工具完全指南
告别激活弹窗:KMS_VL_ALL_AIO智能激活工具完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?每次开机都看到"需要激活"的提…...
Kafka Connect集群部署踩坑实录:从单机到高可用的完整配置与监控方案
Kafka Connect生产级部署实战:高可用架构设计与监控体系构建 当数据管道成为企业核心基础设施时,Kafka Connect的稳定性直接关系到业务连续性。去年某电商大促期间,因单点故障导致数据同步延迟6小时的教训仍历历在目——这正是我们需要深入探…...
抖音批量下载神器:5分钟学会免费高效下载视频、音乐和直播
抖音批量下载神器:5分钟学会免费高效下载视频、音乐和直播 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...
CN2628 可用太阳能供电 5 伏特低压差电压调制集成电路
概述: CN2628是一款可用太阳能供电的低噪声线性电压调制集成电路,采用固定5.0V输出电压,最大 输出电流可达1安培,在5.5V到7V的输入电压范围内输出电压精度可达1%。CN2628工作电流只有520微安,而且同输入和输出的压差没有关系。 CN…...
AI Agent产品经理的新思维:从功能设计到AI原生产品的方法论转型
AI Agent产品经理的新思维:从功能设计到AI原生产品的方法论转型 各位产品同行、AI从业者,大家好!我是连续3年深耕AI工具Agent产品、从C端信息流(今日头条/抖音生态)PM成功转型AI原生垂直工具PM的张小白——过去两年&am…...
基于RAG的智能知识库问答系统:从原理到部署实战
1. 项目概述:当AI大模型遇见知识库,一个开源的智能问答解决方案 最近在折腾一个很有意思的开源项目,叫 zhimaAi/chatwiki 。光看名字,你大概能猜到它的核心: chat 代表对话, wiki 代表知识库。没错&a…...
5分钟掌握浏览器串口调试:提升嵌入式开发效率300%的终极指南
5分钟掌握浏览器串口调试:提升嵌入式开发效率300%的终极指南 【免费下载链接】SerialAssistant A serial port assistant that can be used directly in the browser. 项目地址: https://gitcode.com/gh_mirrors/se/SerialAssistant 你是否还在为串口调试工具…...
【Clickhouse从入门到精通】第08篇:揭秘ClickHouse为何如此之快——五大设计哲学
上一篇【第07篇】ClickHouse执行引擎架构——Parser、Interpreter与Function体系 下一篇【第09篇】ClickHouse安装部署全攻略——从环境准备到服务启动 摘要 ClickHouse能在十亿行级别数据的聚合查询中实现毫秒级响应,绝非偶然。这种极致性能的背后,是一…...
OPAL:基于OPA的实时策略数据分发与权限治理实践
1. 项目概述:什么是OPAL,以及它解决了什么核心痛点?如果你在负责一个微服务架构或者分布式系统的权限管理,大概率遇到过这样的场景:每次权限策略有更新,都需要重启服务、重新部署,或者等待一个漫…...
为AI智能体设计的任务管理后端:构建标准化、机器友好的任务元模型
1. 项目概述:一个为AI而生的待办清单最近在折腾各种AI工具链和自动化流程时,我遇到了一个挺普遍的问题:如何让AI助手,比如ChatGPT、Claude或者本地部署的大语言模型,更好地理解并管理我手头一堆零散、动态的任务&#…...
