首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGAL:读取文件结果为0顶点和0面

CGAL:读取文件结果为0顶点和0面
EN

Stack Overflow用户
提问于 2022-11-24 17:17:37
回答 1查看 23关注 0票数 0

问题

下面是一个简单的CGAL .off读取应用程序。我试图分别读取ModelNet40/airplane/train/airplane_0001.offModelNet40/airplane/train/airplane_0002.off,但是ModelNet40/airplane/train/airplane_0002.off给出了一个0顶点和0面的surface_mesh

这两个off文件来自ModelNet40,没有任何修改。

代码语言:javascript
复制
# console output for airplane_0001.off
Initial Vertices: 90714
Initial Edges: 193500
# console output for airplane_0002.off
Initial Vertices: 0
Initial Edges: 0

问题CGAL码

decimation.cpp

代码语言:javascript
复制
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
// Simplification function
#include <CGAL/Surface_mesh_simplification/edge_collapse.h>
// Visitor base
#include <CGAL/Surface_mesh_simplification/Edge_collapse_visitor_base.h>
// Stop-condition policy
#include <CGAL/Surface_mesh_simplification/Policies/Edge_collapse/Count_ratio_stop_predicate.h>
#include <iostream>
#include <fstream>
typedef CGAL::Simple_cartesian<double>                                  Kernel;
typedef Kernel::Point_3                                                 Point_3;
typedef CGAL::Surface_mesh<Point_3>                                     Surface_mesh;
typedef boost::graph_traits<Surface_mesh>::halfedge_descriptor          halfedge_descriptor;
typedef boost::graph_traits<Surface_mesh>::vertex_descriptor            vertex_descriptor;
namespace SMS = CGAL::Surface_mesh_simplification;
typedef SMS::Edge_profile<Surface_mesh>                                 Profile;


int main(int argc, char ** argv)
{
    Surface_mesh surface_mesh;
    const std::string filename = CGAL::data_file_path(argv[1]);
    std::cout << filename << std::endl;
    std::ifstream is(filename);
    if(!is || !(is >> surface_mesh))
    {
        std::cerr << "Failed to read input mesh: " << filename << std::endl;
        return EXIT_FAILURE;
    }
    if(!CGAL::is_triangle_mesh(surface_mesh))
    {
        std::cerr << "Input geometry is not triangulated." << std::endl;
        return EXIT_FAILURE;
    }
    std::cout << "Initial Vertices: " << surface_mesh.number_of_vertices() << std::endl
              << "Initial Edges: " << surface_mesh.number_of_edges() << std::endl;

    return EXIT_SUCCESS;
}

CMakeLists.txt

代码语言:javascript
复制
project(modelnet40)
cmake_minimum_required(VERSION 3.23.0)
set(CMAKE_BUILD_TYPE Release)

find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(OpenGL)

include_directories(${OPENGL_INCLUDE_DIR})

add_executable(modelnet40 decimation.cpp)

set(CMAKE_CXX_FLAGS "-DCGAL_USE_BASIC_VIEWER")
target_link_libraries(modelnet40 CGAL::CGAL CGAL::CGAL_Basic_viewer)

在蟒蛇中测试

代码语言:javascript
复制
import open3d as o3d
path = "ModelNet40/airplane/train/airplane_0002.off"
mesh = o3d.io.read_triangle_mesh(path)
print(mesh)

我在python中使用open3d.io.read_triangle_mesh(path)测试了这两个文件,它们都很好,但在CGAL中给出了0个顶点和0个面。

导致蟒蛇

代码语言:javascript
复制
# console for airplane_0001.off
TriangleMesh with 90714 points and 104773 triangles.
# console for airplane_0002.off
TriangleMesh with 94335 points and 118614 triangles.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-25 07:36:27

您不能只使用operator>>(),因为您的网格具有独立的顶点和非流形边缘。你必须阅读一个多边形汤,定位三角形,如果必要的话,重复的边,以便你得到一个2-流形,潜在的线边框边。看看“用户手册”中的这个示例

或者直接使用read_polygon_mesh()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74564331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档