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

代码实践篇四 形状检测与规则重建

本节内容主要涉及形状检测(Shape Detection)与形状重建(Shape Reconstruction),具体算法步骤会在后续章节介绍。CGAL在6.0重点更新了形状重建部分的一些模块——动态空间分割与动态形状重建等,也会在后续详细介绍。官网上的效果和问题缺陷测试还需要一些时间验证,以及算法效率的实际测试。

题外话

泊松,前进,尺度这些重建算法本身都有相应的局限性,用CGAL测试或者其他任意的第三方库测试这些方法的时候我想也发现了,一些重建结果不理想或者出现问题是很容易发生的,所以需要嵌入0-3维的一些几何特征,之后也会介绍如何把这些与神经网络相结合,以及一些混合建模手段,比如多项式连续与离散结合,各种几何算子融合诸如此类等。

理论部分

形状检测

  1. 区域增长法
  2. 点云形状检测的高效ransac

形状重建

从点云重建多边形曲面

源码编译相关问题

  1. 添加形状检测头文件会报错
#include <CGAL/Shape_detection/Efficient_RANSAC.h>

报错:
报错结果

问题在模版定义部分有重复,注释掉这部分重复的代码即可
注释

  1. c++常见模版问题

  2. 多边形曲面重建部分需要SCIP/GLPK库,否则不能用。关于scip的库用2022编译好了,可以看:
    网盘 提取码:0212
    里面有zlib,tbb,soplex,scip,scip只编译了涉及的这部分相关的,其他的关联依赖自行编译

例子

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/IO/read_points.h>
#include <CGAL/property_map.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Shape_detection/Efficient_RANSAC.h>
#include <CGAL/Polygonal_surface_reconstruction.h>#include <CGAL/Polygon_mesh_processing/orientation.h>#include <CGAL/Timer.h>#include <fstream>
#include <CGAL/IO/read_points.h>
#include <CGAL/property_map.h>
#include <CGAL/Point_with_normal_3.h>
#ifdef CGAL_USE_SCIP  // defined (or not) by CMake scripts, do not define by hand#include <CGAL/SCIP_mixed_integer_program_traits.h>
typedef CGAL::SCIP_mixed_integer_program_traits<double>                        MIP_Solver;#elif defined(CGAL_USE_GLPK)  // defined (or not) by CMake scripts, do not define by hand#include <CGAL/GLPK_mixed_integer_program_traits.h>
typedef CGAL::GLPK_mixed_integer_program_traits<double>                        MIP_Solver;#endifusing Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
using Point_3 = Kernel::Point_3;
using Mesh = CGAL::Surface_mesh<Kernel::Point_3>;
// Point with normal, and plane index
typedef boost::tuple<Point, Vector, int>                                                        PNI;
typedef std::vector<PNI>                                                                                        Point_vector;
typedef CGAL::Nth_of_tuple_property_map<0, PNI>                                                Point_map;
typedef CGAL::Nth_of_tuple_property_map<1, PNI>                                                Normal_map;
typedef CGAL::Nth_of_tuple_property_map<2, PNI>                                                Plane_index_map;typedef CGAL::Shape_detection::Efficient_RANSAC_traits<Kernel, Point_vector, Point_map, Normal_map>     Traits;typedef CGAL::Shape_detection::Efficient_RANSAC<Traits>             Efficient_ransac;
typedef CGAL::Shape_detection::Plane<Traits>                                                Plane;
typedef CGAL::Shape_detection::Point_to_shape_index_map<Traits>     Point_to_shape_index_map;typedef CGAL::Polygonal_surface_reconstruction<Kernel>                             Polygonal_surface_reconstruction;
typedef CGAL::Surface_mesh<Point>        Surface_mesh;                      void test()
{Point_vector points;const std::string input_file =  CGAL::data_file_path("..\\data\\cube.pwn");if (!CGAL::IO::read_points(input_file.c_str(), std::back_inserter(points),CGAL::parameters::point_map(Point_map()).normal_map(Normal_map()))){std::cerr << "Error: cannot read file " << input_file << std::endl;return;}CGAL::Timer t;t.start();// Shape detectionEfficient_ransac ransac;ransac.set_input(points);ransac.add_shape_factory<Plane>();std::cout << "Extracting planes...";t.reset();ransac.detect();Efficient_ransac::Plane_range planes = ransac.planes();std::size_t num_planes = planes.size();std::cout << " Done. " << num_planes << " planes extracted. Time: " << t.time() << " sec." << std::endl;// Stores the plane index of each point as the third element of the tuple.Point_to_shape_index_map shape_index_map(points, planes);for (std::size_t i = 0; i < points.size(); ++i) {// Uses the get function from the property map that accesses the 3rd element of the tuple.int plane_index = get(shape_index_map, i);points[i].get<2>() = plane_index;}std::cout << "Generating candidate faces...";t.reset();Polygonal_surface_reconstruction algo(points,Point_map(),Normal_map(),Plane_index_map());std::cout << " Done. Time: " << t.time() << " sec." << std::endl;Mesh model;std::cout << "Reconstructing...";t.reset();if (!algo.reconstruct<MIP_Solver>(model)) {std::cerr << " Failed: " << algo.error_message() << std::endl;return ;}const std::string& output_file("without_input_planes_result.off");if (CGAL::IO::write_OFF(output_file, model))std::cout << " Done. Saved to " << output_file << ". Time: " << t.time() << " sec." << std::endl;else {std::cerr << " Failed saving file." << std::endl;return ;}// Also stores the candidate faces as a surface mesh to a fileMesh candidate_faces;algo.output_candidate_faces(candidate_faces);const std::string& candidate_faces_file("without_input_planes_cube_candidate_faces.off");std::ofstream candidate_stream(candidate_faces_file.c_str());if (CGAL::IO::write_OFF(candidate_stream, candidate_faces))std::cout << "Candidate faces saved to " << candidate_faces_file << "." << std::endl;}      

结果

without_input_planes_result.off:

without_input_planes_result
without_input_planes_cube_candidate_faces.off:without_input_planes_cube_candidate_faces

相关文章:

代码实践篇四 形状检测与规则重建

本节内容主要涉及形状检测&#xff08;Shape Detection&#xff09;与形状重建&#xff08;Shape Reconstruction&#xff09;&#xff0c;具体算法步骤会在后续章节介绍。CGAL在6.0重点更新了形状重建部分的一些模块——动态空间分割与动态形状重建等&#xff0c;也会在后续详…...

JVM(HotSpot):GC之垃圾回收阶段

文章目录 前言一、标记清除算法(Mark Sweep)二、标记整理算法(Mark Compact)三、复制算法(Copy) 前言 标记出垃圾对象之后&#xff0c;就要进行清理。 那么&#xff0c;如何清理&#xff1f; 这里也有相应的算法。 主要有三种。 一、标记清除算法(Mark Sweep) 原理说明&…...

Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!

导读&#xff1a; 在 Go 项目中&#xff0c;虽然没有像 MyBatis Plus 这样特定的 ORM 插件&#xff0c;但可以使用功能相似的 Go ORM 框架&#xff0c;比如 GORM&#xff0c;它支持链式查询、自动迁移、预加载等功能&#xff0c;与 MyBatis Plus 有相似之处。通过一些插件或扩…...

《深度学习》Dlib库 CNN卷积神经网络 人脸识别

目录 一、如何实现CNN人脸识别 1、CNN核心概念 1&#xff09;卷积层 2&#xff09;池化层 3&#xff09;激活函数 4&#xff09;全连接层 2、步骤 1&#xff09;加载预训练的人脸识别模型 2&#xff09;读取图像并检测人脸 3&#xff09;提取人脸特征向量 4&#xf…...

滚雪球学Redis[7.1讲]:Redis实战案例

全文目录&#xff1a; &#x1f389;前言&#x1f6a6;1. 使用Redis实现会话管理在Web应用中使用Redis管理会话会话过期与刷新策略安全性考虑与优化 &#x1f9e9;2. 使用Redis实现缓存系统缓存的基本原理Redis缓存的应用场景缓存失效策略与雪崩预防 ✨3. Redis在排行榜系统中的…...

WordPress外部图片本地化插件

一款用于本地化文章的外部图片的插件&#xff0c;支持如下功能&#xff1a; 文章发布前通过编辑器插件本地化 文章手动发布时自动本地化 文章定时发布时自动本地化 针对已发布的文章批量本地化。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/898963…...

Linux基础-shell的简单实现

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux基础-shell的简单实现 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1, 全局变…...

Tomcat日志文件详解及catalina.out日志清理方法

目录 前言1. Tomcat日志文件详解1.1 catalina.out1.2 localhost_access_log1.3 catalina.<date>.log1.4 host-manager.<date>.log 和 manager.<date>.log1.5 localhost.<date>.log 2. catalina.out文件管理与清理方法2.1 为什么不能直接删除catalina.o…...

react 中的hooks中的useState

(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2). 语法: const [xxx, setXxx] React.useState(initValue) (3). useState()说明:参数: 第一次初始化指定的值在内部作缓存返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的…...

STM32学习笔记---DMA

目录 一、什么是DMA 1、DMA是什么 2、DMA的工作流程 3、DMA控制器与外设控制器 二、如何配置DMA 1、DMA框图 2、功能说明 2.1 通道选择 2.2 仲裁器 2.3 源、目标和传输模式 2.4 指针递增 2.5 循环模式 2.6 DMA流控制器和外设流控制器 3、程序设计 三、具体使用DMA…...

Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质)

Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种…...

进程间关系与守护进程

一、进程组 1.1、什么是进程组 提到进程的概念&#xff0c; 其实每一个进程除了有一个进程 ID(PID)之外 还属于一 个进程组。进程组是一个或者多个进程的集合&#xff0c; 一个进程组可以包含多个进程。 每一 个进程组也有一个唯一的进程组 ID(PGID)&#xff0c; 并且这个 PG…...

金山翻译接口逆向

网址&#xff08;加密后&#xff09;&#xff1a;aHR0cHM6Ly93d3cuaWNpYmEuY29tL3RyYW5zbGF0ZQ 文章目录 抓包sign值结果加密 逆向sign值第一步第二步1.2.3. 解密content第一步1.2.3. 抓包 F12 -> 翻译框输入spider -> 点击Fetch/XHR -> 找到接口 index.php? 开头的…...

unified-runtime编译与验证

unified-runtime编译与验证 一.创建容器二.编译unified-runtime三.生成一个cuda ptx kernel四.API测试 unified-runtime编译与验证 一.创建容器 docker run --gpus all --shm-size32g -ti \-e NVIDIA_VISIBLE_DEVICESall --privileged --nethost \--rm -it \-v $PWD:/home \-…...

【Python】最详细--基础语法

Python是一种强大且易于学习的编程语言&#xff0c;广泛用于各种应用程序的开发&#xff0c;如web开发、数据科学、人工智能等。以下是一些Python的基础知识&#xff1a; 1. Python的注释 Python的注释用于在代码中添加说明&#xff0c;以提高代码的可读性。注释在代码执行时…...

二叉树基础:什么样的二叉树适合用数组来存储?

二叉树基础:什么样的二叉树适合用数组来存储? 在计算机科学中,二叉树是一种非常重要的数据结构。它具有许多应用,如搜索、排序、表达式解析等。在存储二叉树时,我们可以使用多种方法,其中一种是使用数组。但是,并不是所有的二叉树都适合用数组来存储。那么,什么样的二…...

iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…...

Java基于SpringBoot微信小程序的跳蚤市场系统设计与实现(lw+数据库+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...

【分布式微服务云原生】《Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》

标题&#xff1a;《分布式缓存Redis 的高效之道&#xff1a;线程模型、IO 模型与 Reactor 模型全解析》 摘要&#xff1a;本文深入探讨分布式缓存 Redis 的 I线程模型、IO 模型以及 Reactor 模型。详细介绍了 Redis 在不同版本中的线程变化、IO 模型的特点和工作流程&#xff…...

科研类型PPT的制作技巧

目录 科研类型PPT的制作技巧 荣誉: 首页:ppt开头结尾 小标题 重点标记:加粗红色下划线 使用三线表 图片,文本排版 一、明确目的与受众分析 二、基础设计原则 三、内容组织与呈现 四、绘图与模型制作 五、其他注意事项 科研类型PPT的制作技巧 荣誉: 首页:ppt开…...

【实测】GitNexus实测:拖入GitHub链接秒出代码知识图谱,今天涨了857星

腾讯10年程序员带你实测GitNexus——一款零服务器、纯浏览器端的代码知识图谱引擎&#xff0c;内置Graph RAG智能问答。今天GitHub Trending单日涨857星。 文章目录前言一、背景与痛点1.1 问题描述1.2 现有方案的不足二、GitNexus核心能力详解2.1 零服务器架构2.2 交互式知识图…...

前端骨架搭建

一、安装UI与功能库在终端运行以下命令npm install arco-design/web-vuenpm install lucide-vue-nextnpm install md-editor-v3npm install pinia axios分别安装预计项目所需的UI库、图标库、编辑器、状态管理功能。检查node版本&#xff0c;发现其为过时的v16版本&#xff0c;…...

STM32定时器级联功能实战:如何构建64位定时器

1. 为什么需要64位定时器&#xff1f; 在嵌入式开发中&#xff0c;32位定时器对于大多数应用场景已经足够用了。比如一个72MHz的STM32&#xff0c;32位定时器最大能计时的时长大约是59.6秒&#xff08;2^32/72MHz&#xff09;。但在一些特殊场景下&#xff0c;比如需要记录设备…...

Openclaw接入自动发文教程

本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow&#xff08;工作流&#xff09; 框架&#xff0c;用于编排和协调多个智能体&#xff08;Agent&#xff09;或处理组件的执行流程。 本课将以通俗易懂的方式&#xff0c;帮助你理解 MAF Workflow 的核心概念…...

低代码平台扩展性有多重要?没有这能力,迟早要重构

在企业数字化转型的浪潮中&#xff0c;低代码平台凭借“快速搭建、降低门槛”的核心优势&#xff0c;成为众多企业实现高效开发的首选工具。不少企业在低代码平台选型时&#xff0c;往往过度关注“开发速度”“易用性”等表层指标&#xff0c;却忽略了一个决定平台生命周期的核…...

如何解决JAVA无人共享无人健身房物联网结合系统防尾随问题

在JAVA无人共享无人健身房物联网结合系统中&#xff0c;防尾随问题可通过AB门防尾随方案结合物联网技术、AI算法和JAVA后端逻辑实现&#xff0c;其核心在于双门互锁机制AI人数检测实时通信控制。以下是具体解决方案&#xff1a;一、系统架构设计硬件层&#xff1a;双门结构&…...

Redis哨兵模式内存缩容

Redis哨兵模式内存缩容检查节点信息从节点内存缩容最大内存配置修改停机缩容缩容后检查主节点内存缩容回退操作检查节点信息 通过哨兵获取集群名和主节点地址&#xff1a; # docker exec -it pod_sentinel_1 redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:…...

专业级PDF自动化解决方案:如何构建高效文档工作流

专业级PDF自动化解决方案&#xff1a;如何构建高效文档工作流 【免费下载链接】clawPDF Open Source Virtual (Network) Printer for Windows that allows you to create PDFs, OCR text, and print images, with advanced features usually available only in enterprise solu…...

ai辅助开发:让快马智能诊断并解决wsl2安装过程中的疑难杂症

AI辅助开发&#xff1a;让快马智能诊断并解决WSL2安装过程中的疑难杂症 最近在尝试安装WSL2时遇到了一个常见但令人头疼的问题——系统提示"请启用虚拟机平台Windows功能并确保在BIOS中启用虚拟化"。虽然我已经确认BIOS中的虚拟化设置是开启的&#xff0c;但问题依然…...

2023年数字图像处理实战:从噪声滤除到图像恢复的八大核心考题解析

1. 椒噪声滤除&#xff1a;自适应中值滤波实战 遇到图像布满黑白噪点&#xff08;椒盐噪声&#xff09;时&#xff0c;传统中值滤波直接暴力替换像素可能误伤细节。去年帮学弟调试车牌识别系统时就遇到过这种情况——滤波后车牌数字"7"直接变成了"1"。后来…...