c++ pcl点云变换骨架枝干添加树叶源码实例

程序示例精选
c++ pcl点云变换骨架枝干添加树叶源码实例
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《c++ pcl点云变换骨架枝干添加树叶源码实例》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果

运行结果 运行结果 ***

文章目录

一、所需工具软件
二、使用步骤
       1. 主要代码
       2. 运行结果
三、在线协助

一、所需工具软件

       1. VS2019, Qt
       2. C++

二、使用步骤

代码如下(示例):

/*
*	Copyright (C) 2019 by
*       Shenglan Du (dushenglan940128@163.com)
*       Liangliang Nan (liangliang.nan@gmail.com)
*       3D Geoinformation, TU Delft, https://3d.bk.tudelft.nl
*
*	This file is part of AdTree, which implements the 3D tree
*   reconstruction method described in the following paper:
*   -------------------------------------------------------------------------------------
*       Shenglan Du, Roderik Lindenbergh, Hugo Ledoux, Jantien Stoter, and Liangliang Nan.
*       AdTree: Accurate, Detailed, and Automatic Modeling of Laser-Scanned Trees.
*       Remote Sensing. 2019, 11(18), 2074.
*   -------------------------------------------------------------------------------------
*   Please consider citing the above paper if you use the code/program (or part of it).
*
*	AdTree is free software; you can redistribute it and/or modify
*	it under the terms of the GNU General Public License Version 3
*	as published by the Free Software Foundation.
*
*	AdTree is distributed in the hope that it will be useful,
*	but WITHOUT ANY WARRANTY; without even the implied warranty of
*	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*	GNU General Public License for more details.
*
*	You should have received a copy of the GNU General Public License
*	along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// save the smoothed skeleton into a PLY file (where each vertex has a radius)
void save_skeleton(Skeleton* skeleton, PointCloud* cloud, const std::string& file_name) {const ::Graph& sgraph = skeleton->get_smoothed_skeleton();if (boost::num_edges(sgraph) == 0) {std::cerr << "failed to save skeleton (no edge exists)" << std::endl;return;}// convert the boost graph to Graph (avoid modifying easy3d's GraphIO, or writing IO for boost graph)std::unordered_map<SGraphVertexDescriptor, easy3d::Graph::Vertex>  vvmap;easy3d::Graph g;auto vertexRadius = g.add_vertex_property<float>("v:radius");auto vts = boost::vertices(sgraph);for (SGraphVertexIterator iter = vts.first; iter != vts.second; ++iter) {SGraphVertexDescriptor vd = *iter;if (boost::degree(vd, sgraph) != 0) { // ignore isolated verticesconst vec3& vp = sgraph[vd].cVert;auto v = g.add_vertex(vp);vertexRadius[v] = sgraph[vd].radius;vvmap[vd] = v;}}auto egs = boost::edges(sgraph);for (SGraphEdgeIterator iter = egs.first; iter != egs.second; ++iter) {SGraphEdgeDescriptor ed = *iter;    // the edge descriptorSGraphEdgeProp ep = sgraph[ed];   // the edge propertySGraphVertexDescriptor s = boost::source(*iter, sgraph);SGraphVertexDescriptor t = boost::target(*iter, sgraph);g.add_edge(vvmap[s], vvmap[t]);}auto offset = cloud->get_model_property<dvec3>("translation");if (offset) {auto prop = g.model_property<dvec3>("translation");prop[0] = offset[0];}if (GraphIO::save(file_name, &g))std::cout << "model of skeletons saved to: " << file_name << std::endl;elsestd::cerr << "failed to save the model of skeletons into file" << std::endl;
}// returns the number of processed input files.
int batch_reconstruct(std::vector<std::string>& point_cloud_files, const std::string& output_folder, bool export_skeleton) {int count(0);for (std::size_t i=0; i<point_cloud_files.size(); ++i) {const std::string& xyz_file = point_cloud_files[i];std::cout << "------------- " << i + 1 << "/" << point_cloud_files.size() << " -------------" << std::endl;std::cout << "processing xyz_file: " << xyz_file << std::endl;if (!file_system::is_directory(output_folder)) {if (file_system::create_directory(output_folder))std::cout << "created output directory '" << output_folder << "'" << std::endl;else {std::cerr << "failed creating output directory" << std::endl;return 0;}}// load point_cloudPointCloud *cloud = PointCloudIO::load(xyz_file);if (cloud) {std::cout << "cloud loaded. num points: " << cloud->n_vertices() << std::endl;// compute bboxBox3 box;auto points = cloud->get_vertex_property<vec3>("v:point");for (auto v : cloud->vertices())box.add_point(points[v]);// remove duplicated pointsconst float threshold = box.diagonal() * 0.001f;const auto &points_to_remove = RemoveDuplication::apply(cloud, threshold);for (auto v : points_to_remove)cloud->delete_vertex(v);cloud->garbage_collection();std::cout << "removed too-close points. num points: " << cloud->n_vertices() << std::endl;}else {std::cerr << "failed to load point cloud from '" << xyz_file << "'" << std::endl;continue;}// reconstruct branchesSurfaceMesh *mesh = new SurfaceMesh;const std::string &branch_filename = file_system::base_name(cloud->name()) + "_branches.obj";mesh->set_name(branch_filename);Skeleton *skeleton = new Skeleton();bool status = skeleton->reconstruct_branches(cloud, mesh);if (!status) {std::cerr << "failed in reconstructing branches" << std::endl;delete cloud;delete mesh;delete skeleton;continue;}// copy translation property from point_cloud to surface_meshSurfaceMesh::ModelProperty<dvec3> prop = mesh->add_model_property<dvec3>("translation");prop[0] = cloud->get_model_property<dvec3>("translation")[0];// save branches modelconst std::string branch_file = output_folder + "/" + branch_filename;if (SurfaceMeshIO::save(branch_file, mesh)) {std::cout << "model of branches saved to: " << branch_file << std::endl;++count;}elsestd::cerr << "failed to save the model of branches" << std::endl;if (export_skeleton) {const std::string& skeleton_file = output_folder + "/" + file_system::base_name(cloud->name()) + "_skeleton.ply";save_skeleton(skeleton, cloud, skeleton_file);}delete cloud;delete mesh;delete skeleton;}return count;
}int main(int argc, char *argv[]) {
//    argc = 2;
//    argv[1] = "/Users/lnan/Projects/adtree/data";
//    argv[2] = "/Users/lnan/Projects/adtree/data-results";if (argc == 1) {TreeViewer viewer;viewer.run();return EXIT_SUCCESS;} else if (argc >= 3) {bool export_skeleton = false;for (int i = 0; i < argc; ++i) {if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "-skeleton") == 0) {export_skeleton = true;break;}}if (export_skeleton) {std::cout << "You have requested to save the reconstructed tree skeleton(s) in PLY format into the output directory." << std::endl;std::cout << "The skeleton file(s) can be visualized using Easy3D: https://github.com/LiangliangNan/Easy3D" << std::endl;}elsestd::cout << "Tree skeleton(s) will not be saved (append '-s' or '-skeleton' in commandline to enable it)" << std::endl;std::string first_arg(argv[1]);std::string second_arg(argv[2]);if (file_system::is_file(second_arg))std::cerr << "WARNING: second argument cannot be an existing file (expecting a directory)." << std::endl;else {std::string output_dir = second_arg;if (file_system::is_file(first_arg)) {std::vector<std::string> cloud_files = {first_arg};return batch_reconstruct(cloud_files, output_dir, export_skeleton) > 0;} else if (file_system::is_directory(first_arg)) {std::vector<std::string> entries;file_system::get_directory_entries(first_arg, entries, false);std::vector<std::string> cloud_files;for (const auto &file_name : entries) {if (file_name.size() > 3 && file_name.substr(file_name.size() - 3) == "xyz")cloud_files.push_back(first_arg + "/" + file_name);}return batch_reconstruct(cloud_files, output_dir, export_skeleton) > 0;} elsestd::cerr<< "WARNING: unknown first argument (expecting either a point cloud file in *.xyz format or a\n""\tdirectory containing *.xyz point cloud files)." << std::endl;}}return EXIT_FAILURE;
}
运行结果
运行结果 运行结果

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理---Tr ansformer机制详解之Transformer结构

1 Encoder模块 1.1 Encoder模块的结构和作用 经典的Transformer结构中的Encoder模块包含6个Encoder Block.每个Encoder Block包含一个多头自注意力层&#xff0c;和一个前馈全连接层. 1.2 Encoder Block 在Transformer架构中&#xff0c;6个一模一样的Encoder …

【JavaScript】深入浅出理解事件循环

1. 浏览器的进程模型 1.1 进程 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 1.2 线程 有了进程后&#xff0c;就可以运…

【广州华锐互动】VR营销心理学情景模拟培训系统介绍

在高度竞争的汽车市场中&#xff0c;销售人员需要具备强大的专业知识、引人入胜的销售技巧&#xff0c;以及敏锐的市场洞察力。然而&#xff0c;传统的培训方式往往无法满足这些需求&#xff0c;因为它们往往忽略了实践的重要性。 为了解决这个问题&#xff0c;许多公司开始采用…

TCP/IP(十九)TCP 实战抓包分析(三)TCP 第一次握手 SYN 丢包

一 TCP 三次握手异常情况实战分析 说明&#xff1a; 本文是TCP 三次握手异常系列之一 ① 异常场景 接下里我用三个实验案例,带大家一起探究探究这三种异常关注&#xff1a; 如何刻意练习模拟上述场景 以及 wireshark现象 ② 实验环境 ③ 实验一&#xff1a;TCP 第一次握…

Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素

1、JavaScript点亮元素 在控制台通过JavaScript语言中对元素点亮效果如下&#xff1a; 将这个语句和UI自动化结合&#xff0c;代码如下&#xff1a; locator (By.ID,"kw") # 是元组类型 web_element WebDriverWait(driver,5,0.5).until(EC.visibility_of_eleme…

Arduino驱动BMA220三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 BMA220的三轴加速度计是一款具有I2C接口的超小型三轴低g加速度传感器断路器,面向低功耗消费市场应用。它可以测量3个垂直轴的加速度,从而在手机、手持设备、计算机外围设备、人机界面、虚拟现实功能和游戏控制器中感知倾斜、…

王道计算机考研 操作系统学习笔记 + 完整思维导图篇章五: IO管理

目录 IO设备的基本概念和分类 IO设备的分类 按使用特性分类 按传输速率分类 按信息交换单位分类 IO控制器 l/O设备的电子部件&#xff08;I/O控制器&#xff09; l/O控制器的组成 内存映像I/o vs.寄存器独立编址 IO控制方式 程序直接控制方式 中断驱动方式 DMA方式 ​编辑通…

java1.8流的新特性使用

案例描述 今天跟着黑马程序员的视频&#xff0c;完成“瑞吉外卖”项目的菜品信息管理模块的时候&#xff0c;遇到了一个比较陌生的写法 用到了Java8的新特性 stream().map((item) -> {}).collect() List<DishDto> collect records.stream().map((item) -> {DishDt…

10.17七段数码管单个多个(部分)

单个数码管的实现 第一种方式 一端并接称为位码&#xff1b;一端分别接收电平信号以控制灯的亮灭&#xff0c;称为段码 8421BCD码转七段数码管段码是将BCD码表示的十进制数转换成七段LED数码管的7个驱动段码&#xff0c; 段码就是LED灯的信号 a为1表示没用到a&#xff0c;a为…

文件读取结束的判定

大家好啊&#xff0c;我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记&#xff1a;在文件读取过程中&#xff0c;不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候&#xff0c;判断是读取失败结束&#xff0c;还是遇到文件尾…

Qt第六十五章:自定义菜单栏的隐藏、弹出

目录 一、效果图 二、qtDesigner 三、ui文件如下&#xff1a; 四、代码 一、效果图 二、qtDesigner 原理是利用属性动画来控制QFrame的minimumWidth属性。 ①先拖出相应的控件 ②布局一下 ③填上一些样式 相关QSS background-color: rgb(238, 242, 255); border:2px sol…

量子力学期末复习--1

量子力学解题技巧--1 基础知识 薛定谔方程 Ehrenfest 定理 不确定性原理&#xff1a;正则对易关系&#xff1a;自由粒子&#xff1a;对于自由粒子&#xff0c;分离变量解不代表物理上可实现的态。但其含时薛定谔方程的一般解仍旧是分离变量解的线性组合 典型题目 自由粒子…

Ajax 笔记/练习

Ajax 异步JavaScript和XML 作用 实现 HTML 在不整体刷新的情况下&#xff0c;通过后台服务器&#xff0c;请求数据并局部更新页面内容 操作流程 Ajax 使用 XMLHttpRequest 通过new 关键字可以创建XMLHttpRequest() 对象。 var req new XMLHttpRequest();方法和属性说明req.…

Rclone连接Onedrive

一、Rclone介绍 Rclone是一款的命令行工具&#xff0c;支持在不同对象存储、网盘间同步、上传、下载数据。 我们这里连接的onedrive&#xff0c;其他网盘请查看官方文档。 注意&#xff1a; 需要先在Windows下配置好了&#xff0c;然后再将rclone配置文件复制到Linux的rclone配…

【proteus】8086仿真、汇编语言

1.创建好新项目 2.点击source code 弹出VSM 3. 4.注意两个都不勾选 可以看到schematic有原理图出现 5. 再次点击source code 6.project/project settings&#xff0c;取消勾选embed 7. add 8.输入文件名保存后&#xff1a; 注意&#xff1a;proteus不用写dos的相关语句 。

【NPM】particles.vue3 + tsparticles 实现粒子效果

在 NPM 官网搜索这两个库并安装&#xff1a; npm install element-plus --save npm i tsparticles使用提供的 vue 案例和方法&#xff1a; <template><div><vue-particlesid"tsparticles":particlesInit"particlesInit":particlesLoaded&…

华为OD机试 - 代表团坐车 - 动态规划(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

Ubuntu 22.04 中安装 fcitx5

Ubuntu 22.04 中安装 fcitx5 可以按照以下步骤进行&#xff1a; 添加 fcitx5 的 PPA 首先&#xff0c;添加 fcitx5 的官方 PPA&#xff1a; sudo add-apt-repository ppa:fcitx-team/fcitx5更新软件包列表 sudo apt update安装 fcitx5 sudo apt install fcitx5 fcitx5-conf…

Mysql表结构差异比较

1、背景 我们在开发过程中&#xff0c;大部分情况下都是好几个版本一起并行&#xff0c;有时候如果某个版本表结构改动较大&#xff0c;但是忘记了记录DDL脚本&#xff0c;这个时候需要人工去把新增或修改的DDL脚本整理出来&#xff08;主要是为了解决 数据库新增字段&#xff…

高效表达三步

一、高效表达 高效表达定主题搭架子填素材 第一&#xff1a; 1个核心主题&#xff0c;让别人秒懂你的想法 &#xff08;表达要定主题&#xff09; 第二&#xff1a; 3种经典框架&#xff0c;帮你快速整理表达思路 第三&#xff1a; 2种表达素材&#xff0c;让发言更具说服力…