ccViewer是一个基于Qt5和OpenGL的三维点云可视化工具,它包含多种显示和交互模式,还支持插件扩展功能。但是,如果我们想将ccViewer作为一个独立的库使用,就需要将其源码和依赖项分离成一个新的工程,并且只保留其自带的功能,而关闭插件模块的相关代码和头文件。
参考文章:如何把CloudCompare中的ccViewer模块独立出来?
代码地址:https://github.com/yaoli1992/ccCloudViewer.git
CMake添加PCL库
首先我们需要配置PCL的库,这一步是比较简单的直接在我们的工程cMakelists.txt文件中添加几行cmake命令就可以实现。
find_package(PCL 1.7 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS} include)
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
然后cmake重构一下工程。
创建一个Qt action并实现
(1)使用Qt designer打开ccviewer.ui
(2)在Options下添加一个Qaction
QAction类提供了一个可以同时出现在菜单和工具条上的抽象用户界面操作(action),这些action可以被放置在窗体的各个部件中,应用程序可以通过菜单,工具栏以及键盘快捷键来调用这个通用的命令。
在Options的第一行增加一个Open PCD 的action,如图
编译我们的ui,如下图
然后我们把添加的action,在工程中进行实现,首先要在ccviewer.h申明一个openPCDfile的函数。
protected slots:
add by particle open PCD file
void openPCDFile();
然后我们在ccviewer.cpp文件中有两个步骤:
(1)添加connect()函数实现的是信号与槽的关联。
(2)实现这个openPCDFile的函数
代码如下,已经加上我的注释
int ccViewer::openPCDFile()
{
//获取当前场景的根节点对象
ccHObject* currentRoot = m_glWindow->getSceneDB();
if (currentRoot)
{
m_selectedObject = nullptr;//将选中的对象设置为空
m_glWindow->setSceneDB(nullptr);//将场景的根节点设置为空
m_glWindow->redraw();// 刷新OpenGL窗口
delete currentRoot;// 释放当前根节点对象的内存
currentRoot = nullptr;// 将当前根节点对象指针设为空
}
typedef pcl::PCLPointCloud2 PCLCloud;
PCLCloud::Ptr cloud_ptr_in(new PCLCloud);
QString filename = QFileDialog::getOpenFileName(this, tr("Open point cloud"), "./data/", tr("Point cloud data (*.pcd *.ply)"));
std::cout<<("File chosen: %s\n", filename.toStdString().c_str());
if (filename.isEmpty())
return -1;
int return_status;
if (filename.endsWith(".pcd", Qt::CaseInsensitive))
return_status = pcl::io::loadPCDFile(filename.toStdString(), *cloud_ptr_in);
else
return_status = pcl::io::loadPLYFile(filename.toStdString(), *cloud_ptr_in);
if (return_status != 0)
{
PCL_ERROR("Error reading point cloud %s\n", filename.toStdString().c_str());
return -1;
}
// PCL可视化测试
//pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
//pcl::fromPCLPointCloud2(*cloud_ptr_in, *cloud);
//pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
//viewer->setBackgroundColor(0, 0, 0);
//viewer->addPointCloud(cloud, "sample cloud");
//while (!viewer->wasStopped()) {
// viewer->spinOnce(100);
// boost::this_thread::sleep(boost::posix_time::microseconds(1000000));
//}
//convert to CC cloud
std::cout << "convert to CC cloud" << std::endl;
// 将PCL点云数据转化为ccPointCloud格式,并将其保存到ccCloud指针中
ccPointCloud* ccCloud = sm2ccConverter::sm2ccConverter(cloud_ptr_in).getCloud();
if (!ccCloud)
{
ccLog::Warning("[PCL] An error occurred while converting PCD cloud to CC cloud!");
return -1;
}
ccCloud->setName(QStringLiteral("unnamed"));
std::cout << "end convert to CC cloud" << std::endl;
addToDB(ccCloud);// 将ccCloud添加到ccViewer的数据库中,并显示出来
show();
return 1;
}
编译运行
有兴趣的可以体验一下代码:
https://github.com/yaoli1992/ccCloudViewer.git
并加入知识星球提问或交流。
更多详细内容后台发送“知识星球”加入知识星球查看更多。
3D视觉与点云学习星球:主要针对智能驾驶全栈相关技术,3D/2D视觉技术学习分享的知识星球,将持续进行干货技术分享,知识点总结,代码解惑,最新paper分享,解疑答惑等等。星球邀请各个领域有持续分享能力的大佬加入我们,对入门者进行技术指导,对提问者知无不答。同时,星球将联合各知名企业发布自动驾驶,机器视觉等相关招聘信息和内推机会,创造一个在学习和就业上能够相互分享,互帮互助的技术人才聚集群。
以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享与合作:微信“920177957”(备注:姓名+学校/公司+研究方向) 邮箱:dianyunpcl@163.com。
点一下“在看”你会更好看耶