點雲平臺之CloudCompare開發

       如今博客終於又要開始更新了,告別了靠想象搞科研的日子,因此如今的我顯得仍是比較無拘無束,在我學習生涯前2年這段備受煎熬與折磨的日子裏,在當年那個環境我是不會這麼去表達本身心裏想法的(估計絕大部分人都不會),身邊的例子讓我更加堅信了,要作一隻默默無聞的羔羊,也很慶幸這段經歷並無伴隨着我學習生活的始終,在恩師的學成歸來後這一切都提早結束了,在接下來的日子裏我仍是體會到了什麼是科研,因此也算是沒白來這一遭,惟一遺憾的只是這一切來的晚了點。同時我仍是特別但願個人遭遇只是一個意外(最好是我想多了,其餘人都過得挺好!),回憶往昔倍感我的選擇以及自我驅動的重要性,在前者問題的處理上多次碰壁,可是一直支撐着本身的自我驅動精神努力的讓本身保持對技術知識的高度承認,上週對北京某公司的電力巡線軟件進行了操做,接着就動手在本身的平臺上對該軟件的實現過程進行了簡單的預演,畢竟是預演,個人平臺也不會拿出來賣錢,關鍵也沒人會買,因此作了個大概就草草收工,只是把本身以前的一些東西直接在電力巡線上來運用一下而已;html

         接着讓塵封了4個月之久的cloudcompare源碼從新開啓,一直百度搜索怎樣開發,逛遍整個網頁貌似有價值的寥寥無幾,不過已經習慣了,畢竟我是百度搜索不是google,每天各類技術交流羣,一直等着天上掉餡餅,最後固然不會掉了。因此仍是得老老實實的直接上源碼,一個下午加一個晚上,經過幾個例子的調試,貌似找到了傳說中的「葫蘆」,因此接着畫瓢,一下還真成功了!一旦成功之門被開啓,立刻把開啓我點雲之路的PCL庫塞了進去,接着就能夠暢遊了,以前開通了博客,可是對於曾經那個只能夾着尾巴作人的我來講沒有任何做用,因此很快就被我遺忘了,這幾天準備從新開一下博客,把這些並無什麼核心競爭力的知識共享給你們,畢竟能爲初學者邁入cc開發的大門提供一點幫助。c++

                                                                                                                                                    (a)軟件啓動界面web

             

       這是實驗室當年小夥伴們一塊兒開心探討科研的場景,每次啓動軟件,都會激發我要爲科研奮鬥終身的激情,不知道他們是否是在作科研,畢竟當時我並不在電腦前面,就當是吧,否則我又開始懷疑人生了。app

                                                                                                                                                      (b)漢化版CloudCompare函數

     

       每次尋找一個功能,我都得默默的打開百度翻譯,曾經浪費了很多時間,故此,在一個徹夜無眠的晚上痛下決心,將其改爲了漢化版的,同時說明一下,我確實在cc的源碼上作的一些小的改動,因爲平時喜歡黑灰色色調,因此大膽了將平臺的風格作了修改。學習

                                                                                                                                                  (c) 案例分析之提取地面點                                               測試

     

            最後給你們粘貼上一段核心代碼,其實也沒什麼複雜的,本人非計算機專業的,真正學c++時間也不到半年,都能照葫蘆畫瓢,大神們必定再也不話下,相信聰明的你將很快會進入狀態!this

//獲取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;

   記得最近有網友提示個人PCLCloudToCCpoint這個函數在哪,因此最近特地寫了一篇博客加上這個接口google

   https://www.cnblogs.com/z-web-2017/p/10350451.htmlspa

相關文章
相關標籤/搜索