文章目录
- 0.引言
- 1.修改两个CMakeLists.txt文件
- 2.源码编译
- 3.测试PCL
0.引言
因笔者课题涉及点云处理,需要通过PCL进行点云数据分析处理,查阅现有网络资料,实现了VisualStudio2015(x86)配置PCL1.8.1点云库(见:VisualStudio如何配置PCL点云库?)。而笔者对CloudCompare二次开发较为熟悉,希望在CloudCompare中使用PCL进行点云处理,所以本文在VS配置PCL成功的基础上,实现CloudCompare-2.10.x对PCL的配置,并记录了实现配置的过程。
1.修改两个CMakeLists.txt文件
(1)修改CloudCompare-2.10.x源文件目录下的CMakeLists.txt
# PCL
option( OPTION_BUILD_PCL "Check to add PCL 3rdParty" ON )
if ( OPTION_BUILD_PCL )
find_package(PCL REQUIRED)
include_directories( ${PCL_INCLUDE_DIRS} )
message(${PCL_INCLUDE_DIRS})
link_directories( ${PCL_LIBRARY_DIRS} )
message(${PCL_LIBRARY_DIRS})
add_definitions( ${PCL_DEFINITIONS} )
endif()
(2)修改CloudCompare-2.10.x源文件的CC目录下的CMakeLists.txt
①找到CMakeLists.txt,并打开
②添加PCL配置
option( COMPILE_CC_CORE_LIB_WITH_PCL "Check to compile CC_CORE_LIB with PCL" ON) # 添加PCL配置
③添加PCL环境
# PCL环境
if(COMPILE_CC_CORE_LIB_WITH_PCL)
find_package(PCL REQUIRED)
include_directories( ${PCL_INCLUDE_DIRS} )
#define the PCL_VER_1_8_OR_OLDER preprocessor to compile qPCL with older versions of PCL
if ( PCL_VERSION VERSION_LESS 1.8 ) # VERSION_GREATER Works just like "greater or equal"
set_property( TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS PCL_VER_1_8_OR_OLDER )
endif()
# Luca's PCL patch support
if( PCL_VERSION VERSION_GREATER 1.7 ) #from 1.7 the patch was merged
set_property( TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS LP_PCL_PATCH_ENABLED )
endif()
link_directories( ${PCL_LIBRARY_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )
target_link_libraries( ${PROJECT_NAME} ${PCL_LIBRARIES}) #指定目标在运行时要寻找的链接库
endif()
2.源码编译
在Cmake中进行配置,会生成PCL相关的文件,并勾选COMPILE_CC_CORE_LIB_WITH_PCL。
3.测试PCL
(1)修改mainwindow.ui文件
①设计按钮
②编译.ui
(2)修改mainwindow.h文件
//点云滤波
void doActionPCLUniformSample(); // 均匀采样
(3)修改mainwindow.cpp文件
①添加均匀采样头文件
#include <pcl/keypoints/uniform_sampling.h> // 均匀采样
注:若出现找不到pcl文件的情况,需要设置属性表,具体可参考:VisualStudio如何配置PCL点云库?。
②添加均匀采样实现代码
// 均匀采样
void MainWindow::doActionPCLUniformSample()
{
if (getSelectedEntities().size() != 1)
{
ccLog::Print(QStringLiteral("只能选择一个点云实体"));
return;
}
ccHObject* entity = getSelectedEntities()[0];
ccPointCloud* ccCloud = ccHObjectCaster::ToPointCloud(entity);
// ---------------------------读取数据到PCL----------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
cloud->resize(ccCloud->size());
for (int i = 0; i < cloud->size(); ++i)
{
const CCVector3* point = ccCloud->getPoint(i);
cloud->points[i].x = point->x;
cloud->points[i].y = point->y;
cloud->points[i].z = point->z;
}
// -----------------------------对话框---------------------------------------
float radius = QInputDialog::getDouble(this, QStringLiteral("参数设置"), QStringLiteral("搜索半径: "), 0.005, 0, 100, 4);
// ----------------------------均匀采样--------------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr filtered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::UniformSampling<pcl::PointXYZ> us;
us.setInputCloud(cloud);
us.setRadiusSearch(radius);
us.filter(*filtered);
// ------------------------PCL->CloudCompare--------------------------------
if (!filtered->empty())
{
ccPointCloud* newPointCloud = new ccPointCloud(QString("UniformSample"));
for (int i = 0; i < filtered->size(); ++i)
{
double x = filtered->points[i].x;
double y = filtered->points[i].y;
double z = filtered->points[i].z;
newPointCloud->addPoint(CCVector3(x, y, z));
}
newPointCloud->setRGBColor(ccColor::Rgba(rand() % 255, rand() % 255, 0, 255));
newPointCloud->showColors(true);
if (ccCloud->getParent())
{
ccCloud->getParent()->addChild(newPointCloud);
}
ccCloud->setEnabled(false);
addToDB(newPointCloud);
refreshAll();
updateUI();
}
else
{
ccCloud->setEnabled(true);
// Display a warning message in the console
dispToConsole("Warning: example shouldn't be used as is", ccMainAppInterface::WRN_CONSOLE_MESSAGE);
}
}
③添加信号槽函数
connect(m_UI->actionsample, &QAction::triggered, this, &MainWindow::doActionPCLUniformSample);
(4)生成
(5)结果展示
①原始点云
②采样后的点云(相比原始点云,变稀了)
参考资料:
[1] 来吧!我在未来等你!. CloudCompare如何进行二次开发的第一步:编译?; 2023-04-28 [accessed 2023-05-14].
[2] 来吧!我在未来等你!. CloudCompare如何进行二次开发?; 2023-04-19 [accessed 2023-05-14].
[3] 来吧!我在未来等你!. VisualStudio如何配置PCL点云库?; 2023-05-14 [accessed 2023-05-15].
[4] 点云侠. CloudCompare 二次开发(5)——非插件中的PCL环境配置(均匀采样为例); 2023-02-17 [accessed 2023-05-14].