From f11b3491b725be9b6a96bc9144dbd75ade04e291 Mon Sep 17 00:00:00 2001 From: 12345qiupeng Date: Sat, 12 Apr 2025 00:02:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ CMakeLists.txt | 33 +++++++++++++++++++++++++++++++++ pcl_wrapper.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 pcl_wrapper.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7db5920 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/build/ +/cmake-build-debug/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6b12698 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.10) +project(pcl_wrapper) + +set(CMAKE_CXX_STANDARD 17) + +# 自动获取 libomp 安装路径 +execute_process( + COMMAND brew --prefix libomp + OUTPUT_VARIABLE LIBOMP_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# 设置头文件和库路径 +include_directories("${LIBOMP_PREFIX}/include") +link_directories("${LIBOMP_PREFIX}/lib") + +# 查找包 +find_package(PCL REQUIRED) + +# 设置编译选项 +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I${LIBOMP_PREFIX}/include") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LIBOMP_PREFIX}/lib -lomp") + +# 设置 PCL +include_directories(${PCL_INCLUDE_DIRS}) +link_directories(${PCL_LIBRARY_DIRS}) +add_definitions(${PCL_DEFINITIONS}) + +# 生成动态库 +add_library(pclwrapper SHARED pcl_wrapper.cpp) + +# 统一风格链接 +target_link_libraries(pclwrapper PUBLIC ${PCL_LIBRARIES} -lomp) \ No newline at end of file diff --git a/pcl_wrapper.cpp b/pcl_wrapper.cpp new file mode 100644 index 0000000..7f5883a --- /dev/null +++ b/pcl_wrapper.cpp @@ -0,0 +1,24 @@ +// pcl_wrapper.cpp +#include +#include +#include + +extern "C" { + +int filter_pcd(const char* input_path, const char* output_path, float leaf_size) { + pcl::PointCloud::Ptr cloud (new pcl::PointCloud); + pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud); + + if (pcl::io::loadPCDFile(input_path, *cloud) == -1) + return -1; + + pcl::VoxelGrid sor; + sor.setInputCloud(cloud); + sor.setLeafSize(leaf_size, leaf_size, leaf_size); + sor.filter(*cloud_filtered); + + pcl::io::savePCDFile(output_path, *cloud_filtered); + return 0; +} + +} \ No newline at end of file