Easy3D开发——点云孔洞填充
Easy3D开发——点云孔洞填充
- 一、效果展示
- 二、代码
- 2.1参考链接:
- 2.2完整代码
- 三、其他效果
- 多个孔洞点云填充效果对比
- 四、后续
一、效果展示
二、代码
2.1参考链接:
参考论文链接:Filling Holes in Meshes
2.2完整代码
#include <easy3d/viewer/viewer.h>
#include <easy3d/core/point_cloud.h>
#include <easy3d/fileio/point_cloud_io.h>
#include <easy3d/fileio/resources.h>#include <easy3d/core/surface_mesh.h>
#include <easy3d/algo/surface_mesh_hole_filling.h>
#include <easy3d/renderer/renderer.h>
#include <easy3d/util/progress.h>
#include <easy3d/core/surface_mesh.h>
#include <easy3d/fileio/surface_mesh_io.h>
#include <easy3d/fileio/resources.h>
#include <easy3d/util/logging.h>using namespace easy3d;SurfaceMesh* hole_filliing_apply(SurfaceMesh* mesh,int size) {if (!mesh)return mesh;const int allowed_boundary_size = size;std::vector< std::pair<SurfaceMesh::Halfedge, int> > holes;auto visited = mesh->add_halfedge_property<bool>("DialogSurfaceMeshHoleFilling::h::visited", false);for (auto h : mesh->halfedges()) {if (!visited[h] && mesh->is_border(h)) {int size = 0;SurfaceMesh::Halfedge hh = h;do {visited[hh] = true;++size;if (!mesh->is_manifold(mesh->target(hh))) {size += 123456;break;}hh = mesh->next(hh);} while (hh != h);if (size < allowed_boundary_size) {holes.push_back({ h, size });}}}mesh->remove_halfedge_property(visited);int num_closed = 0;ProgressLogger progress(holes.size(), true, false);for (const auto& hole : holes) {if (progress.is_canceled()) {LOG(WARNING) << "hole filling cancelled";return mesh;}SurfaceMeshHoleFilling hf(mesh);hf.fill_hole(hole.first);++num_closed;progress.next();}if (holes.empty()) {LOG(WARNING) << "no holes found in the model";}else {LOG(INFO) << num_closed << " (out of " << holes.size() << ") holes filled";}return mesh;
}int main(int argc, char** argv)
{//加载点云路径const std::string file_in_name = "bunnyhole1.obj";std::cout << "filename: " << file_in_name << std::endl;const std::string file_out_name ="bunny_fix.obj";SurfaceMesh* mesh = SurfaceMeshIO::load(file_in_name);//---孔洞填充--auto mesh_out=hole_filliing_apply(mesh,100);SurfaceMeshIO::save(file_out_name, mesh_out);//----可视化----Viewer viewer("viewer");viewer.add_model(mesh_out);viewer.run();return 0;
}
三、其他效果
多个孔洞点云填充效果对比
四、后续
后续会将easy3d中相关算法集成到《Easy3d+QT》专栏中。
Easy3D开发——点云孔洞填充相关推荐
- 几种点云(网格)孔洞填充方法(1)
几种点云(网格)孔洞填充方法一 前言 数据效果对比 原始网格数据,存在孔洞 方法1.基于RBF的孔洞填充的修补效果 方法2.参考论文: 方法3 方法4 原始网格数据,存在孔洞 方法1.基于RBF的孔洞 ...
- opencv 二值图像的孔洞填充
有的时候,我们需要对图像进行孔洞填充,一般想到的方法都是,使用findcontours函数,查找最外层轮廓,然后画出找到的轮廓. 这确实是一种方法,但似乎不够高效.下面贴出一个函数,可以更好的实现这个 ...
- 【youcans 的 OpenCV 例程200篇】132. 形态学重建之孔洞填充算法
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...
- 基于RBF函数的点云孔洞修补
文章目录 一.简介 二.实现代码 三.配置工作 四.执行效果 四.参考资料 一.简介 之前无意中看到这样一种点云孔洞修补方法,感觉很有意思,就下载了作者的源码看看效果,具体流程如下所述: 1.首先,我 ...
- pencv 二值图像的孔洞填充
有的时候,我们需要对图像进行孔洞填充,一般想到的方法都是,使用findcontours函数,查找最外层轮廓,然后画出找到的轮廓. 这确实是一种方法,但似乎不够高效.下面贴出一个函数,可以更好的实现这个 ...
- CGAL学习记录——网格孔洞填充
CGAL--孔洞填充 效果展示 代码 效果展示 Easy3D显示 代码 #include <CGAL/Exact_predicates_inexact_constructions_kernel. ...
- 点云孔洞定位_点云处理——孔洞修补
之前在做基于点云的孔洞修补研究,参考了一些学位论文后选择了一种基于自己能力能够复现的简单算法,虽然最终效果一般,不过在这个过程中收获了很多,特此记录. 基于点云的孔洞修补与基于三角网格的孔洞修补相比, ...
- 图像孔洞填充与小连通域的删除
图像孔洞填充与小连通域的删除 cvFindContours 从二值图像中检索轮廓,并返回检测到的轮廓的个数.first_contour的值由函数填充返回,它的值将为第一个外轮廓的指针,当没有轮廓被检测 ...
- 数字图像处理(作业三)——孔洞填充+全局阈值+自适应阈值
一.孔洞填充 基本思想: 基于形态学算法,膨胀后与上取反的原图 算法实现步骤: 1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞 2.新建一张全零图,用0表示背景,1 ...
最新文章
- 基于X的GNOME、GTK、GDK、XLib、GLib等之间的关系
- 学业水平测试计算机都考什么,高中学业水平考试与高中会考有什么区别
- sublime 写lua相关的插件 cocos
- mysql在linux只有用空密码_在Linux服务器上配置phpMyAdmin--允许空密码
- 薪资不逊NLP算法岗,边缘AI火了!
- 从JSP WEB页面往数据库写入出现乱码的一种解决方法
- 「竞品分析报告」不会写?套用这个报告模板,让你不再毫无头绪
- Smart3D三维建模操作笔记
- Win7主题文件themepack不能安装,低级错误!
- 金融量化之华泰多因子估值类显著性和IC值计算
- JAVA毕业设计教务排课系统计算机源码+lw文档+系统+调试部署+数据库
- 董明珠接连直播背后:格力的线上焦虑
- Java练习题【新】
- excel填充序列_表格技巧—Excel表格中如何一键下拉填充
- 第三节-戴师兄数据分析学习笔记-excel最全函数
- cocos2d-x 如何制作一个类马里奥的横版平台动作游戏 1 献给所有对动作游戏有爱的朋友
- c#如何实现RTU远程数据采集功能及RTU在水利工程中的运用
- 移动浏览器成巨头新角力场
- 十四个助你成功的心理定律
- 名人堂:网络缔造者—互联网之父VintonG.Cerf