手把手教你:如何ccViewer工程中实现打开pcd文件并可视化

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重构一下工程。

e5ac7133ad7baa8a6863058931db736f.jpeg

创建一个Qt action并实现

(1)使用Qt designer打开ccviewer.ui

1197335c97258f829853fd5c1fe67581.png

(2)在Options下添加一个Qaction

QAction类提供了一个可以同时出现在菜单和工具条上的抽象用户界面操作(action),这些action可以被放置在窗体的各个部件中,应用程序可以通过菜单,工具栏以及键盘快捷键来调用这个通用的命令。

在Options的第一行增加一个Open PCD 的action,如图

a65ec3523cd37552859e2b80924fb67e.png

编译我们的ui,如下图

de748ccded66e0883a33072dca953f3f.png

然后我们把添加的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;
}

编译运行

c6c2b4bb8ca1baee9c2682754973c04f.png

82e46af76f3f6b3b22c7357fa963a4d2.png

有兴趣的可以体验一下代码:

https://github.com/yaoli1992/ccCloudViewer.git

并加入知识星球提问或交流。

更多详细内容后台发送“知识星球”加入知识星球查看更多。

3D视觉与点云学习星球:主要针对智能驾驶全栈相关技术,3D/2D视觉技术学习分享的知识星球,将持续进行干货技术分享,知识点总结,代码解惑,最新paper分享,解疑答惑等等。星球邀请各个领域有持续分享能力的大佬加入我们,对入门者进行技术指导,对提问者知无不答。同时,星球将联合各知名企业发布自动驾驶,机器视觉等相关招聘信息和内推机会,创造一个在学习和就业上能够相互分享,互帮互助的技术人才聚集群。

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享与合作:微信“920177957”(备注:姓名+学校/公司+研究方向) 邮箱:dianyunpcl@163.com。

点一下“在看”你会更好看耶

32288908b51b4a6cfd82f8f26c17a591.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云PCL公众号博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值