點雲平台之cloudCompare開發三


       

          之前我寫過關於cloudCompare開發的兩篇博客,從訪問量來看反響還算可以,該系列第一篇博文,從其它各個網站轉載以及其它博主轉載加上我本人的博客,網上可查的,這一年的訪問量估計突破7000左右,日均差不多20人次的訪問量。該系列的第二篇博文,目前我本人博客訪問量2000+,其它轉載訪問量目前還沒去統計。之前一直決定要停更的,因為工作以及我個人原因,一方面確實是很難有時間研究這些工具,工作中研究的一些方法與業務流程畢竟屬於公司,雖然沒有深度,但是本着職業道德精神我個人無法將其公之於眾;另一方面瑣事纏身,現在很難做到心如止水,波瀾不驚,業余時間近乎完全被消磨掉,但是無力抗拒,人是群居性動物,所以隨波逐流反而成為了最正常的生活方式。進入21世紀2.0時代這種無奈與失落感與日俱增。轉眼間已到2020年,博主供職於現在的公司已差不多2年之久,雖然目前知識水平十分有限,但是還是想把這兩年三維激光在測繪領域發展的一些所聞所見跟大家分享一下。三維激光行業其實與5年前相比已經火熱不少了,5年前博主第一次接觸三維激光時,那時三維激光主要面向文物保護行業,業務也主要偏向於體力活,很容易被復制取代,畢竟只是一個業務流程的問題,用什么儀器,怎么去作業,后處理用什么軟件,經歷哪些步驟,最后出什么結果。其實就是一套較為固定的流程,畢竟只是使用一些成熟的軟件,並沒有在一些難點上有所突破,最多就是把三維激光技術應用於文物保護而已。17下半年-18年年初步入工作以來,最開始的職責主要是研究一些點雲處理的算法,2019年以來開始承擔基於點雲數據的礦山量測軟件的設計與開發。目前三維激光應用的領域較多,並對傳統測繪的作業模式提出了較大的挑戰,像目前應用較多的電力巡線、林業、礦山、道路等等,並且許多新的領域也都在積極做這方面的嘗試,未來不出意外的話,三維激光的應用面會越來越廣,但是礙於技術不是特別成熟,軟件研發難度較大,又屬於剛剛興起,軟硬件遇到的技術瓶頸也較多,所以不可能爆發式的增長,況且測繪行業屬於小眾行業,國家扶持力度有限,所以也導致了它短期內不可能大熱。

       說這么多,其實就是希望跟我有相同學習背景的同學能對三維激光技術多點耐心,給它一點時間去證明,它代表着測繪領域發展的新方向,但是基於其目前發展的現狀,也不能盲目自信,畢竟他還“小”,需要時間去成長。

       以上純屬博主個人主觀意見,由於知識水平有限或者存在一些憑空臆斷、先入為主的因素,可能部分觀點與事實相違背,還希望大家能諒解一下,有什么不同的意見歡迎大家私信探討一下,相互學習,感激不盡。

       之前該系列的兩篇博文,是教大家如何在CC上加入自己的功能,今天這篇博客可能沒有先前那么華麗,但是其意義絲毫不遜於前者,這篇博文博主旨在教大家學會如何利用CC的源碼。其實前段時間移植CC相關功能時就想簡單粗暴把它整個代碼復制黏貼過來,然后各種改,缺什么給它補什么,其實最后你會發現,你就差把整個CC的平台都移植過來了。其實一開始特別苦惱,就覺得程序設計不是得講究低耦合高類聚嗎?CC怎么這么氣人。當然時間緊迫,來不及因為個人的無知而憤怒與憂傷,所以開始轉換思路,既然剝離不了,那就只能腳踏實地一點一點耐心的去研究其算法思想。通過幾次成功的實踐,我發現后者更靠譜點,其實對於算法而言,代碼其實並不是那么重要,重要的是思想,譬如好多算法工程師就不會編程語言,會的可能就是matlab甚至是使用偽代碼,但是在我個人看來這些都無傷大雅,重點是我只需要你給我提供一套完整且准確可行的數學公式足矣。即使成功摳出來別人平台里的代碼,尤其是出現某些錯誤時,由於不理解邏輯以及其算法思想,最終也只能束手無策,僅僅只是拿來主義而已。什么是二次開發,它等於拿來主義,算法才屬於真正的核心。

       之前研究過CC的幾個模塊,涉及公司業務,這里不再贅述。這里以一個簡單的例子加以描述,其實重點就看for循環,以及if判別條件,看對每一個數據點做了什么操作,這一點即為算法的核心。大家可以看看下圖的紅色對話框標注出來的文字,基本很好理解,就是對每一個數據點做如下操作,從第一個點開始判別其是否存在重復點,如果存在,標記這個重復數據點,后續遍歷跳過標記的數據點。

 

                                                      

             以下一段代碼,是本人在自己的平台上實現的一段代碼,大家可以參考一下,代碼寫的較為簡單,難度很小。

//移除重復的數據點
void tgd::removeDePlicatePts()
{
	if (clouds)
	{
		int ptsNum = clouds->points.size();
		int *dep = new int[ptsNum];
		for (int i = 0; i < ptsNum;i++)
		{
			dep[i] = 0;
		}

		pcl::KdTreeFLANN<pcl::PointXYZRGB> kdtree;
		kdtree.setInputCloud(clouds);
		pcl::PointXYZRGB searchPoint;
		for (int i = 0; i < ptsNum; i++)
		{
			if (dep[i] ==0)
			{
				searchPoint = clouds->points[i];
				vector<int>pointIdxNKNSearch;//存儲查詢點的近鄰索引
				vector<float>pointNKNSquareDistance;//存儲距離的平
				kdtree.radiusSearch(searchPoint, 0.000001, pointIdxNKNSearch, pointNKNSquareDistance);
				if (pointIdxNKNSearch.size() >= 2)
				{
					dep[pointIdxNKNSearch[1]] = 1;
				}
			}	
		}

		PointCloud<PointXYZRGB>::Ptr result(new PointCloud<PointXYZRGB>);
		for (int i = 0; i < ptsNum; i++)
		{
			if (dep[i] == 0)
			{
				result->points.push_back(clouds->points[i]);
			}
		}
		createNewResult(result, QString::fromLocal8Bit("移除重復點"));
delete dep[];
} 
else { cout << "點雲數據不存在!!!" << endl; }
}


 

  上面可能存在<br>建議大家直接忽略點,網頁排版的問題,web前端里的換行符而已,博主當年自己學了一些web開發的知識,也曾經一度成為我的職業規划。

為了說明問題,博主把同一份點雲數據進行了復制。
                                    
                      執行相關操作后,點雲數據點數量減半。
                                    
                  至此這篇文章徹底結束,其實這期博文相當於又水了一期,對此非常抱歉,因為工作,工作的研究內容以及業務無法觸及,同樣也是因為工作,所以很難有時間去研究一些高深的算法或者有用的工具。期待下次能有新干貨貢獻,如果還有下一期。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM