PCL1.141 PCLSharp编译及Unity下使用
PCL1.141 PCLSharp编译及Unity下使
PCL安装及PCLSharp编译
-
第一步下载pcl最新版1.14.1,安装后,配置环境变量

-
下载PclSharp源码GitHub - jbruening/PclSharp: Point Cloud Library pinvoke binding for c#,找到src文件夹下的PclSharp.Extern 这个封装c++版本的工程,最终输出pclsharp.extern.dll,这个为c++工程,原本是vs2022工程配置的,使用属性表配置跑出来,设置项目繁琐
①这里改为cmake来配置;PclSharp.Extern.Vis这个可视化部分比较简单,也和PclSharp.Extern合并了。
CMakeLists.txt
注意!:
将该cmake置于PclSharp-master\src\PclSharp.Extern
1.注意其中指定的PCL安装路径
2.类似visualizer.cpp没有的可以从中删除
3.CMake生成结束后,在PclSharp-master\bin 打开.sln编译即可,生成 PclSharp.Extern.dll
xxxxxxxxxx
cmake_minimum_required(VERSION 3.0)
project(PclSharp.Extern)
find_package(PCL REQUIRED )
set(CMAKE_BUILD_TYPE Release)
include_directories(${PCL_INCLUDE_DIRS})
include_directories("C:/Program Files/PCL 1.14.1/3rdParty/FLANN/include")
message(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
file(GLOB POINTCLOUD_SRC ./pointcloud/*.cpp)
file(GLOB SAMPLECONSENSUS_SRC ./sampleconsensus/*.cpp)
file(GLOB STD_SRC ./std/*.cpp)
file(GLOB REGISTRATION_SRC ./registration/*.cpp)
file(GLOB SEGMENTATION_SRC ./segmentation/*.cpp)
add_library( PclSharp.Extern SHARED PointSizes.cpp visualizer.cpp
"common/ModelCoefficients.generated.cpp"
"common/PCAOfXYZ.generated.cpp" "common/PclBaseOfXYZ.generated.cpp"
common/PclBaseOfXYZRGBA.generated.cpp
common/PointIndices.generated.cpp
filters/ExtractIndicesXYZ.generated.cpp
filters/Heightmap2DOfXYZ.generated.cpp
filters/StatisticalOutlierRemovalOfXYZ.generated.cpp
filters/VoxelGridOfXYZ.generated.cpp
${POINTCLOUD_SRC}
${SAMPLECONSENSUS_SRC}
${STD_SRC}
${REGISTRATION_SRC}
${SEGMENTATION_SRC}
search/KdTreeOfXYZ.generated.cpp
search/OrganizedNeighborOfXYZ.generated.cpp
features/FPFHEstimationOfPointXYZAndNormal.generated.cpp
features/IntegralImageNormalEstimationOfPointXYZAndNormal.generated.cpp
io/PCDReader.generated.cpp
io/PCDWriter.generated.cpp
"eigen/Matrix4f.generated.cpp"
"eigen/VectorXf.generated.cpp"
algrithom/detectAnomaly.cpp
)
target_link_libraries(PclSharp.Extern ${PCL_LIBRARIES})
②使用vscode配置更方便,如果添加自定义的pcl算法,需要编写代码,visual studio 变量提示不太方便,vscode可以配置c_cpp_properties.json文件:
xxxxxxxxxx
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:/Program Files/PCL 1.14.1/include/pcl-1.14",
"C:/Program Files/PCL 1.14.1/3rdParty/Eigen3/include/eigen3",
"C:/Program Files/PCL 1.14.1/3rdParty/Boost/include/boost-1_84",
"C:/Program Files/OpenNI2/Include",
"C:/Program Files/PCL 1.14.1/3rdParty/FLANN/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.22000.0",
"compilerPath": "cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
最后生成vs工程,可以到输出目录找到sln工程文件,用vs2022打开,编译即可
其中pcl最新版智能指针已全部使用标准库std::shared_ptr这个了,所以在工程中查找boost::shared_ptr,全部替换为std::shared_ptr
boost::const_pointer_cast替换为std::const_pointer_cast
- 编译pclsharp这个csharp工程
- 测试csharp调用
- 高级部分:如何封装自己的算法,并实现调用?
有的是直接想在csharp上开发pcl算法,但存在一定的弊端:
1)源代码得不到保护
2)托管内存释放存在延时,对程序性能有一定影响
所以最好的方式是使用c++ 进行开发,csharp只负责上位机调用即可。
代码下载地址,包含所有源代码和可以执行的文件
版权声明:上文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 上文链接:https://blog.csdn.net/u011660055/article/details/139338601
编译器是:vs2022pcl版本:1.14.1
Unity下使用
- 为了其他人直接能使用,无需安装PCL及环境,将PCL下需要的库和编译好的PCLSharp和PclSharp.Extern.dll一并放入Unity工程下的Plugins文件夹下


- 将Unity工程指定到PATH
using UnityEngine;
using System;
public class InitPCL : MonoBehaviour
{
void Awake(){
System.Environment.SetEnvironmentVariable("PATH",Application.dataPath + "/Plugins/" + ";" + System.Environment.GetEnvironmentVariable("PATH"));
}
}
Unity调用PCLSharp示例
读取点云并向下取样
x
public class TestPCL : MonoBehaviour
{
public string savePath;
private PointCloudOfXYZ pclBase=new PointCloudOfXYZ();
public Text text;
public Button button;
void Start()
{
button.onClick.AddListener(TestPointCloud);
}
[ContextMenu("TestPointCloud")]
public void TestPointCloud()
{
savePath= Application.streamingAssetsPath + "/input.pcd";
PCDReader reader = new PCDReader();
var data=reader.Read(savePath, pclBase);
text.text = "status: "+data+"/n points: :"+pclBase.Count;
DownSamplePointCloud(pclBase, 0.1f);
}
public void DownSamplePointCloud(PointCloudOfXYZ cloud, float leafSize)
{
var voxelGrid = new VoxelGridOfXYZ();
voxelGrid.SetInputCloud(cloud);
voxelGrid.LeafSize= new PointXYZ() { X=leafSize, Y=leafSize, Z=leafSize };
var filteredCloud = new PointCloudOfXYZ();
voxelGrid.filter(filteredCloud);
text.text+="\n filtered points: "+filteredCloud.Count;
// save xyz file
string path = Application.streamingAssetsPath + "/output.xyz";
using (var writer = new StreamWriter(path))
{
foreach (var point in filteredCloud.Points)
{
writer.WriteLine(point.X + " " + point.Y + " " + point.Z);
}
}
Debug.Log(filteredCloud.Count);
}
}
结果

白色点云为彩色点云采样后的结果

作者:世纪末的魔术师
出处:https://www.cnblogs.com/Firepad-magic/
Unity最受欢迎插件推荐:点击查看
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号