From 5d9b31eea0a255a3c1d9a35aa817be3fe434a7a8 Mon Sep 17 00:00:00 2001 From: Guillaume Cerutti <guillaume.cerutti@inria.fr> Date: Thu, 28 Mar 2024 12:19:56 +0100 Subject: [PATCH] add cgal image building function --- CMakeLists.txt | 14 +++++----- cpp/CMakeLists.txt | 3 +++ cpp/CgalLabelledImage.cpp | 26 +++++++++++++++++++ cpp/CgalLabelledImage.h | 8 ++++++ .../labelled_tetrahedral_mesh.py | 9 ++++++- wrp/LabelledTetrahedralMeshWrapper.cpp | 3 +++ 6 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 cpp/CgalLabelledImage.cpp create mode 100644 cpp/CgalLabelledImage.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4148520..8567691 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,14 +22,12 @@ find_package(Eigen3 3.3 REQUIRED NO_MODULE) # make cache variables for install destinations include(GNUInstallDirs) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - if (DEFINED ENV{CONDA_PREFIX}) - set(CMAKE_INSTALL_LIBDIR "lib") - set(CMAKE_INSTALL_PREFIX "$ENV{CONDA_PREFIX}") - else() - set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install") - endif() -endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) +if (DEFINED ENV{CONDA_PREFIX}) + set(CMAKE_INSTALL_LIBDIR "lib") + set(CMAKE_INSTALL_PREFIX "$ENV{CONDA_PREFIX}") +else() + set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install") +endif() add_subdirectory(cpp) add_subdirectory(wrp) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 8c0ddac..80a241c 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -1,9 +1,12 @@ project(_cpp) add_library(_cpp SHARED + CgalLabelledImage.h LabelledTetrahedralMesh.h + CgalLabelledImage.cpp LabelledTetrahedralMesh.cpp ) target_link_libraries(_cpp PUBLIC Eigen3::Eigen) +target_link_libraries(_cpp PUBLIC CGAL::CGAL) install(TARGETS _cpp DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") \ No newline at end of file diff --git a/cpp/CgalLabelledImage.cpp b/cpp/CgalLabelledImage.cpp new file mode 100644 index 0000000..aa7dd2b --- /dev/null +++ b/cpp/CgalLabelledImage.cpp @@ -0,0 +1,26 @@ +#include <iostream> + +#include "CgalLabelledImage.h" + + +int buildCgalImage(Eigen::Array<unsigned short, Eigen::Dynamic, 1> image_array, Eigen::Array<int, 3, 1> shape, Eigen::Array<double, 3, 1> voxelsize) +{ + _image* image = _createImage( + shape(0), shape(1), shape(2), 1, + voxelsize(0), voxelsize(1), voxelsize(2), 2, + WK_FIXED, SGN_UNSIGNED + ); + + auto it = image_array.begin(); + for (int x=0; x<shape(0); x++) { + for (int y=0; y<shape(1); y++) { + for (int z=0; z<shape(2); z++) { + CGAL::IMAGEIO::static_evaluate<unsigned short>(image, x, y, z) = *it; + ++it; + } + } + } + CGAL::Image_3 cgal_image(image); + + return 0; +} diff --git a/cpp/CgalLabelledImage.h b/cpp/CgalLabelledImage.h new file mode 100644 index 0000000..8a8200d --- /dev/null +++ b/cpp/CgalLabelledImage.h @@ -0,0 +1,8 @@ +#pragma once + +#include <CGAL/Image_3.h> + +#include <Eigen/Dense> + + +int buildCgalImage(Eigen::Array<unsigned short, Eigen::Dynamic, 1> image_array, Eigen::Array<int, 3, 1> shape, Eigen::Array<double, 3, 1> voxelsize={1.0, 1.0, 1.0}); \ No newline at end of file diff --git a/src/pybind_example/labelled_tetrahedral_mesh.py b/src/pybind_example/labelled_tetrahedral_mesh.py index 7014b32..ce7b8b7 100644 --- a/src/pybind_example/labelled_tetrahedral_mesh.py +++ b/src/pybind_example/labelled_tetrahedral_mesh.py @@ -1 +1,8 @@ -from ._wrp import LabelledTetrahedralMesh, make_tetrahedron \ No newline at end of file +import numpy as np + +from ._wrp import LabelledTetrahedralMesh, make_tetrahedron +from ._wrp import build_cgal_image as _build_cgal_image + + +def build_cgal_image(img: np.ndarray) -> bool: + return _build_cgal_image(img.ravel().astype(np.uint16), img.shape, [1., 1., 1.]) diff --git a/wrp/LabelledTetrahedralMeshWrapper.cpp b/wrp/LabelledTetrahedralMeshWrapper.cpp index 8fcc884..6c9a1a6 100644 --- a/wrp/LabelledTetrahedralMeshWrapper.cpp +++ b/wrp/LabelledTetrahedralMeshWrapper.cpp @@ -2,6 +2,7 @@ #include <pybind11/stl.h> // This header is needed to work with STL containers like std::vector #include <pybind11/eigen.h> +#include "CgalLabelledImage.h" #include "LabelledTetrahedralMesh.h" namespace py = pybind11; @@ -16,4 +17,6 @@ PYBIND11_MODULE(_wrp, m) { .def("add_tetra", &LabelledTetrahedralMesh::addTetra, py::arg("tetra"), py::arg("label")); m.def("make_tetrahedron", &makeTetrahedron); + + m.def("build_cgal_image", &buildCgalImage, py::arg("image_array"), py::arg("shape"), py::arg("voxelsize")); } \ No newline at end of file -- GitLab