Cześć
Mam program, które rysuje mi siatkę trójkątów za pomocą biblioteki PointCloudLibrary (moduł visualisation). Siatka jest podawana z pliku, wybranego przez użytkownika. Wszystko działa doskonale, jednak chciałem do tego wszystkiego dorobić redukcję siatki.
W PCL jest klasa pcl::MeshQuadricDecimationVTK i metoda process(), która to robi. Tutaj pojawia się problem. Dla niektórych plików wszystko działa ładnie i rysowana jest mniejsza siatka, a dla niektórych pojawia się błąd Segmentation fault przy wywołaniu funkcji process(), jednak sam błąd leci z vtkQuadricDecimation::CollapseEdge(). Ogólnie - biblioteka PCL (open source) korzysta z innej biblioteki open source - VTK. Ten błąd pojawia się tylko dla niektórych siatek, dla jakiś skrajnych przypadków, jednak chciałbym to poprawić, (potrzebuję rysowania każdej siatki).
Kawałek kodu dla podglądu (szczerze, to nie ważne, bo działa dla wielu plików):
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gpt = createGptObject(0.30, 2.5, 30, M_PI/6, M_PI/9, M_PI/2);
pcl::PolygonMesh mesh;
gpt.setInputCloud(cloud); // chmura z pliku
gpt.setSearchMethod(tree); // wskaźnik do KdTree (pcl::search::KdTree<pcl::PointNormal>::Ptr)
gpt.reconstruct(mesh);
// przygotowanie obiektu do redukcji siatki
pcl::MeshQuadricDecimationVTK meshQuadricDecimationVtk = pcl::MeshQuadricDecimationVTK();
pcl::PolygonMesh::Ptr meshPtr(&mesh);
meshQuadricDecimationVtk.setInputMesh(meshPtr);
meshQuadricDecimationVtk.setTargetReductionFactor(0.1f);
pcl::PolygonMesh::Ptr simplerMesh(new pcl::PolygonMesh());
meshQuadricDecimationVtk.process(*simplerMesh); // tutaj wywołanie metod z VTK i czasami błąd
Ten błąd był już raportowany 8 lat temu - https://github.com/PointCloudLibrary/pcl/issues/967
Użytkownik tam podał, że dodał IF'a i po prostu ignorował te przypadki, ale przynajmniej błąd nie leciał. Ja bym prześledził kod tej funkcji i też pododawał IF'y żeby nie leciały błędy (te kilka trójkątów, dla których to się dzieje nie ma znaczenia dla ogromnej siatki).
Pobiorę i skompiluję VTK z githuba, a także dodam te IF'y w tej funkcji, jednak nie wiem jak zrobić żeby mój program korzystał z biblioteki VTK zainstalowanej i ręcznie skompilowanej przeze mnie. PCL'a instalowałem komendą sudo apt install libpcl-dev, a VTK chyba samo się dodało przy tym.
Korzystam z Ubuntu 20.04 (PointCloudLibrary visualisation działa tylko na Linuxie), program korzysta z PCL'a (a sam PCL z VTK), jest budowany przez CMake, ale nie do końca wiem jak to działa, robiłem według tutoriala.
Plik CMakeLists.txt:
cmake_minimum_required(VERSION 3.22)
project(proj-pcl)
find_package(PCL 1.2 REQUIRED)
set(CMAKE_CXX_STANDARD 20)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(proj-pcl main.cpp PclUtils.cpp PclUtils.h)
target_link_libraries (proj-pcl ${PCL_LIBRARIES})
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
Biblioteka PCL zainstalowana jest w: (komenda dpkg -L libpcl-dev)
- pliki nagłówkowe .h -> /usr/include/pcl-1.10/pcl/
- pliki .cmake -> /usr/lib/x86_64-linux-gnu/cmake/pcl
- pliki .so -> /usr/lib/x86_64-linux-gnu/
Biblioteka VTK zainstalowana jest w: (komenda dpkg -L libvtk7-dev)
- pliki nagłówkowe .h -> /usr/include/vtk-7.1/
- pliki .cmake -> /usr/lib/cmake/vtk-7.1
- pliki .so -> /usr/lib/x86_64-linux-gnu/
Podsumowanie:
Co chcę zrobić? - pobrać VTK gitem, podmienić lekko jeden plik .cxx (https://github.com/Kitware/VTK/blob/master/Filters/Core/vtkQuadricDecimation.cxx) i skompilować
Czego nie wiem? - jak zrobić aby program budowany CMake'iem nie korzystał z biblioteki zainstalowanej automatycznie, tylko skompilowanej przez mnie. Nie wiem dokładnie, które pliki (z tych wymienionych powyżej) są na prawdę potrzebne dla tego CMake'a. A może można po prostu zamienić te pliki nagłówkowe i pliki .so w tych folderach podanych powyżej (ale na 100% nie wiem czy się wersje będą zgadzały i coś się nie skopie po drodze).
Prosiłbym bardzo o pomoc - napisanie co zrobić, jeśli ktoś wie