点云平台之CloudCompare开发

Posted z-web-2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云平台之CloudCompare开发相关的知识,希望对你有一定的参考价值。

       现在博客终于又要开始更新了,告别了靠想象搞科研的日子,所以现在的我显得还是比较无拘无束,在我学习生涯前2年这段备受煎熬与折磨的日子里,在当年那个环境我是不会这么去表达自己内心想法的(估计绝大部分人都不会),身边的例子让我更加坚信了,要做一只默默无闻的羔羊,也很庆幸这段经历并没有伴随着我学习生活的始终,在恩师的学成归来后这一切都提前结束了,在接下来的日子里我还是体会到了什么是科研,所以也算是没白来这一遭,唯一遗憾的只是这一切来的晚了点。同时我还是特别希望我的遭遇只是一个意外(最好是我想多了,其他人都过得挺好!),回忆往昔倍感个人选择以及自我驱动的重要性,在前者问题的处理上屡次碰壁,但是一直支撑着自己的自我驱动精神努力的让自己保持对技术知识的高度认可,上周对北京某公司的电力巡线软件进行了操作,接着就动手在自己的平台上对该软件的实现过程进行了简单的预演,毕竟是预演,我的平台也不会拿出来卖钱,关键也没人会买,所以做了个大概就草草收工,只是把自己之前的一些东西直接在电力巡线上来运用一下而已;

         接着让尘封了4个月之久的cloudcompare源码重新开启,一直百度搜索怎样开发,逛遍整个网页貌似有价值的寥寥无几,不过已经习惯了,毕竟我是百度搜索不是google,天天各种技术交流群,一直等着天上掉馅饼,最后当然不会掉了。所以还是得老老实实的直接上源码,一个下午加一个晚上,通过几个例子的调试,貌似找到了传说中的“葫芦”,所以接着画瓢,一下还真成功了!一旦成功之门被开启,马上把开启我点云之路的PCL库塞了进去,接着就可以畅游了,之前开通了博客,但是对于曾经那个只能夹着尾巴做人的我来说没有任何作用,所以很快就被我遗忘了,这几天准备重新开一下博客,把这些并没有什么核心竞争力的知识共享给大家,毕竟能为初学者迈入cc开发的大门提供一点帮助。

                                                                                                                                                    (a)软件启动界面

             技术分享图片

       这是实验室当年小伙伴们一起开心探讨科研的场景,每次启动软件,都会激发我要为科研奋斗终身的激情,不知道他们是不是在做科研,毕竟当时我并不在电脑前面,就当是吧,不然我又开始怀疑人生了。

                                                                                                                                                      (b)汉化版CloudCompare

     技术分享图片

       每次寻找一个功能,我都得默默的打开百度翻译,曾经浪费了不少时间,故此,在一个彻夜无眠的晚上痛下决心,将其改成了汉化版的,同时说明一下,我确实在cc的源码上做的一些小的改动,由于平时喜欢黑灰色色调,所以大胆了将平台的风格做了修改。

                                                                                                                                                  (c) 案例分析之提取地面点                                               

     技术分享图片

            最后给大家粘贴上一段核心代码,其实也没什么复杂的,本人非计算机专业的,真正学c++时间也不到半年,都能照葫芦画瓢,大神们一定不再话下,相信聪明的你将很快会进入状态!

//获取cc的点云对象
    ccHObject::Container selectedEntities = m_selectedEntities; // 当前所选择的点云对象
    //为了访问点云里的文件---自己加的的一段测试代码
    size_t selNum = selectedEntities.size();
    if (selNum != 1)
    {
        /*    m_app->dispToConsole("Please select two cloud!", ccMainAppInterface::ERR_CONSOLE_MESSAGE);*/
        return;
    }
    ccHObject* ent = selectedEntities[0];
    assert(ent);
    ccPointCloud* m_cloud = static_cast<ccPointCloud*>(ent);
    pcl::PointCloud<pcl::PointXYZ>::Ptr clouds(new pcl::PointCloud<pcl::PointXYZ>);
    CCcloudToPCLcloud(m_cloud,clouds);


    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ground(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ground_remove(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointIndicesPtr ground(new pcl::PointIndices);

    // 创建形态学滤波器对象
    pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
    pmf.setInputCloud(clouds);

    // 设置过滤点最大的窗口尺寸
    pmf.setMaxWindowSize(10);

    // 设置计算高度阈值的斜率值--就是坡度
    pmf.setSlope(1.0f);

    // 设置初始高度参数被认为是地面点
    pmf.setInitialDistance(0.5f);

    // 设置被认为是地面点的最大高度
    pmf.setMaxDistance(3.0f);
    pmf.extract(ground->indices);

    // Create the filtering object
    pcl::ExtractIndices<pcl::PointXYZ> extract;
    extract.setInputCloud(clouds);
    extract.setIndices(ground);
    extract.filter(*cloud_ground);

    // 提取非地面点
    extract.setNegative(true);
    extract.filter(*cloud_ground_remove);


    //-------接下来给他们更新到dbtree里面

    //1。需要对pcl的cloud转换成cc的
    ccPointCloud *cloudGround = new ccPointCloud();
    ccPointCloud *cloudNoGround = new ccPointCloud();

    PCLcloudToCCcloud(cloud_ground, cloudGround);
    PCLcloudToCCcloud(cloud_ground_remove, cloudNoGround);

    //设置颜色区分一下
    cloudGround->setRGBColor(255,0,0);
    cloudGround->showColors(true);//显示颜色
    cloudGround->setPointSize(2);

    cloudNoGround->setRGBColor(0, 255, 0);
    cloudNoGround->showColors(true);
    cloudNoGround->setPointSize(3);



    m_cloud->setEnabled(false);
    
    //添加新的一组DB实体
    ccHObject* cloudContainer = new ccHObject(m_cloud->getName() + QString::fromLocal8Bit("分割场景-地面点"));//父目录
    //设置新点云并添加到实体
    cloudGround->setVisible(true);
    cloudGround->setName(QString::fromLocal8Bit("zx的地面点!"));//子目录
    cloudContainer->addChild(cloudGround);
    //添加实体到DB树
    addToDB(cloudContainer);

    //添加新的一组DB实体
    ccHObject* cloudContainer1 = new ccHObject(m_cloud->getName() + QString::fromLocal8Bit("分割场景-非地面点"));//父目录
    //设置新点云并添加到实体
    cloudNoGround->setVisible(true);
    cloudNoGround->setName(QString::fromLocal8Bit("zx的非地面点!"));//子目录
    cloudContainer1->addChild(cloudNoGround);
    //添加实体到DB树
    addToDB(cloudContainer1);

    //刷新
    refreshAll();

    QMessageBox::about(this, QString::fromLocal8Bit("成功"), QString::fromLocal8Bit("这是莫某的开发"));
    return;

 

 

 

以上是关于点云平台之CloudCompare开发的主要内容,如果未能解决你的问题,请参考以下文章

QT6+CloudCompare显示3D点云

CloudCompare基础教程-介绍

CloudCompare教程002:点云绘制模式详解

查看 PCD 点云 windows

查看 PCD 点云 windows

如何以Qt子窗口的形式显示点云视窗