PCL第三方库:Eigen, Flann , Qhull, VTK, Boost简介
前言:
?????? PCL作為機器人軟件的一個基礎類庫,融合了基礎結構、算法和三維顯示。其大量使用第三方庫,使用了Boost、Eigen、Flann、VTK、Boost、CUdnn等。
第一預備役:Boost?
???? Boost庫是為C++語言標準庫提供擴展的一些C++程序庫的總稱。 ???? Boost庫由Boost社區組織開發、維護。其目的是為C++程序員提供免費、同行審查的、可移植的程序庫。Boost庫可以與C++標準庫完美共同工作,并且為其提供擴展功能。Boost庫使用Boost License來授權使用,根據該協議,商業的非商業的使用都是允許并鼓勵的。 Boost社區建立的初衷之一就是為C++的標準化工作提供可供參考的實現,Boost社區的發起人Dawes本人就是C++標準委員會的成員之一。在Boost庫的開發中,Boost社區也在這個方向上取得了豐碩的成果。在送審的C++標準庫TR1中,有十個Boost庫成為標準庫的候選方案。在更新的TR2中,有更多的Boost庫被加入到其中。從某種意義上來講,Boost庫成為具有實踐意義的準標準庫。 可下載Boost C++ Libraries[1]安裝boost庫。大部分boost庫功能的使用只需包括相應頭文件即可,少數(如正則表達式庫,文件系統庫等)需要鏈接庫。里面有許多具有工業強度的庫,如graph庫。 很多Boost中的庫功能堪稱對語言功能的擴展,其構造用盡精巧的手法,不要貿然的花費時間研讀。Boost另外一面,比如Graph這樣的庫則是具有工業強度,結構良好,非常值得研讀的精品代碼,并且也可以放心的在產品代碼中多多利用。????? 官方網站:http://www.boost.org/
????? 截止今日,官方最新版本為1.54,VS可以通過下載源碼編譯運行,例程如:
vs2012編譯boost_1_53_0:?
?http://blog.csdn.net/liukang0618/article/details/9149881??? 補充:我安裝時正好是VS2012出現問題,tools工具損壞,沒心情修補,直接下載的exe包:
? ? 地址: http://sourceforge.net/projects/boost/files/boost-binaries/1.54.0/???? 自己進行挑選合適的版本進行安裝即可,省去了編譯步驟。
百科上的評論,有點意思:
??????? Boost 包含近百個程序庫,其中不乏具有工程實用價值的佳品。每個人口味與技術背景不一樣,對 Boost 的取舍也不一樣。就我的個人經驗而言,首先可以使用絕對無害的庫,例如 noncopyable、scoped_ptr、static_assert 等,這些庫的學習和使用都比較簡單,容易入手。其次,有些功能自己實現起來并不困難,正好 Boost 里提供了現成的代碼,那就不妨一用,比如date_time 和 circular_buffer 等。然后,在新項目中,對于消息傳遞和資源管理可以考慮采用更加現代的方式,例如用 function/bind 在某些情況下代替虛函數作為庫的回調接口、借助shared_ptr實現線程安全的對象回調等等。這二者會影響整個程序的設計思路與風格,需要通盤考慮,如果正確使用智能指針,在現代 C++ 程序里一般不需要出現 delete 語句。最后,對某些性能不佳的庫保持警惕,比如 lexical_cast。總之,在項目組成員人人都能理解并運用的基礎上,適當引入現成的 Boost 組件,以減少重復勞動,提高生產力。
??????? Boost 是一個寶庫,其中既有可以直接拿來用的代碼,也有值得借鑒的設計思路。試舉一例:正則表達式庫 regex 對線程安全的處理。 早期的 RegEx 類不是線程安全的,它把“正則表達式”和“匹配動作”放到了一個類里邊。由于有可變數據,RegEx 的對象不能跨線程使用。如今的 regex 明確地區分了不可變(immutable)與可變(mutable)的數據,前者可以安全地跨線程共享,后者則不行。比如正則表達式本身(basic_regex)與一次匹配的結果(match_results)是不可變的;而匹配動作本身(match_regex)涉及狀態更新,是可變的,于是用可重入的函數將其封裝起來,不讓這些數據泄露給別的線程。正是由于做了這樣合理的區分,regex 在正常使用時就不必加鎖。 ???? Donald Knuth 在“Coders at Work”一書里表達了這樣一個觀點:如果程序員的工作就是擺弄參數去調用現成的庫,而不知道這些庫是如何實現的,那么這份職業就沒啥樂趣可言。換句話說,固然我們強調工作中不要重新發明輪子,但是作為一個合格的程序員,應該具備自制輪子的能力。非不能也,是不為也。 C/C++ 語言的一大特點是其標準庫可以用語言自身實現。C 標準庫的 strlen、strcpy、strcmp 系列函數是教學與練習的好題材,C++ 標準庫的 complex、string、vector 則是類、資源管理、模板編程的絕佳示范。在深入了解 STL 的實現之后,運用 STL 自然手到擒來,并能自動避免一些錯誤和低效的用法。 對于 Boost 也是如此,為了消除使用時的疑慮,為了用得更順手,有時我們需要適當了解其內部實現,甚至編寫簡化版用作對比驗證。但是由于 Boost 代碼用到了日常應用程序開發中不常見的高級語法和技巧,并且為了跨多個平臺和編譯器而大量使用了預處理宏,閱讀 Boost 源碼并不輕松愜意,需要下一番功夫。另一方面,如果沉迷于這些有趣的底層細節而忘了原本要解決什么問題,恐怕就舍本逐末了。 ?????? Boost 中的很多庫是按泛型編程的范式來設計的,對于熟悉面向對象編程的人而言,或許面臨一個思路的轉變。比如,你得熟悉泛型編程的那套術語,如concept、?? model、refinement,才容易讀懂 Boost.Threads 的文檔中關于各種鎖的描述。我想,對于熟悉 STL 設計理念的人而言,這不是什么大問題。 ?????? 在某些領域,Boost 不是唯一的選擇,也不一定是最好的選擇。比如,要生成公式化的源代碼,我會首選用腳本語言寫一小段代碼生成程序,而不用 Boost.Preprocessor;要在 C++ 程序中嵌入領域特定語言,我會首選用 Lua 或其他語言解釋器,而不用 Boost.Proto;要用 C++ 程序解析上下文無關文法,我會首選用 ANTLR 來定義詞法與語法規則并生成解析器(parser),而不用 Boost.Spirit。總之,使用 Boost 時心態要平和,別較勁去改造 C++ 語言。把它有助于提高生產力的那部分功能充分發揮出來,讓項目從中受益才是關鍵
2.C++矩陣處理工具——Eigen
不可否認,此女子的邏輯很清晰...:文章鏈接:http://blog.csdn.net/abcjennifer/article/details/7781936
若有評論,希望到原文....
首先推薦幾個可以在C++中調用的數學平臺:eigen、bias、lapack、svd、CMatrix,本文著重eigen做以講解,希望對各位有所幫助。
下面是本文主線,主要圍繞下面幾點進行講解:
**********************************************************************************************
Eigen是什么?
Eigen3哪里下載?
Eigen3的配置
Eigen3 樣例代碼有沒有?
去哪里更深入學習?
**********************************************************************************************
Eigen是什么?
Eigen是C++中可以用來調用并進行矩陣計算的一個庫,里面封裝了一些類,需要的頭文件和功能如下:
Eigen的主頁上有一些更詳細的Eigen介紹。
Eigen3哪里下載?
這里是我下好的,這里是官網主頁,請自行下載,是個code包,不用安裝。
Eigen的配置
直接上圖了,附加包含目錄那里填上你放Eigen文件夾的位置即可。
Eigen的樣例代碼有沒有?
當然有,這篇文章重點就是這里!
以下是我整理的一些常用操作,基本的矩陣運算就在下面了,算是個入門吧~主要分以下幾部分:
建議大家放到編譯環境里去看,因為我這里有一些region的東西,編譯器下更方便看~
#include <iostream> #include <Eigen/Dense> //using Eigen::MatrixXd; using namespace Eigen; using namespace Eigen::internal; using namespace Eigen::Architecture; using namespace std; int main() { #pragma region one_d_object cout<<"*******************1D-object****************"<<endl; Vector4d v1; v1<< 1,2,3,4; cout<<"v1=\n"<<v1<<endl; VectorXd v2(3); v2<<1,2,3; cout<<"v2=\n"<<v2<<endl; Array4i v3; v3<<1,2,3,4; cout<<"v3=\n"<<v3<<endl; ArrayXf v4(3); v4<<1,2,3; cout<<"v4=\n"<<v4<<endl; #pragma endregion #pragma region two_d_object cout<<"*******************2D-object****************"<<endl; //2D objects: MatrixXd m(2,2); //method 1 m(0,0) = 3; m(1,0) = 2.5; m(0,1) = -1; m(1,1) = m(1,0) + m(0,1); //method 2 m<<3,-1, 2.5,-1.5; cout <<"m=\n"<< m << endl; #pragma endregion #pragma region Comma_initializer cout<<"*******************Initialization****************"<<endl; int rows=5; int cols=5; MatrixXf m1(rows,cols); m1<<( Matrix3f()<<1,2,3,4,5,6,7,8,9 ).finished(), MatrixXf::Zero(3,cols-3), MatrixXf::Zero(rows-3,3), MatrixXf::Identity(rows-3,cols-3); cout<<"m1=\n"<<m1<<endl; #pragma endregion #pragma region Runtime_info cout<<"*******************Runtime Info****************"<<endl; MatrixXf m2(5,4); m2<<MatrixXf::Identity(5,4); cout<<"m2=\n"<<m2<<endl; MatrixXf m3; m3=m1*m2; cout<<"m3.rows()="<<m3.rows()<<" ; " <<"m3.cols()="<< m3.cols()<<endl; cout<<"m3=\n"<<m3<<endl; #pragma endregion #pragma region Resizing cout<<"*******************Resizing****************"<<endl; //1D-resize v1.resize(4); cout<<"Recover v1 to 4*1 array : v1=\n"<<v1<<endl; //2D-resize m.resize(2,3); m.resize(Eigen::NoChange, 3); m.resizeLike(m2); m.resize(2,2); #pragma endregion #pragma region Coeff_access cout<<"*******************Coefficient access****************"<<endl; float tx=v1(1); tx=m1(1,1); cout<<endl; #pragma endregion #pragma region Predefined_matrix cout<<"*******************Predefined Matrix****************"<<endl; //1D-object typedef Matrix3f FixedXD; FixedXD x; x=FixedXD::Zero(); x=FixedXD::Ones(); x=FixedXD::Constant(tx);//tx is the value x=FixedXD::Random(); cout<<"x=\n"<<x<<endl; typedef ArrayXf Dynamic1D; //或者 typedef VectorXf Dynamic1D int size=3; Dynamic1D xx; xx=Dynamic1D::Zero(size); xx=Dynamic1D::Ones(size); xx=Dynamic1D::Constant(size,tx); xx=Dynamic1D::Random(size); cout<<"xx=\n"<<x<<endl; //2D-object typedef MatrixXf Dynamic2D; Dynamic2D y; y=Dynamic2D::Zero(rows,cols); y=Dynamic2D::Ones(rows,cols); y=Dynamic2D::Constant(rows,cols,tx);//tx is the value y=Dynamic2D::Random(rows,cols); #pragma endregion #pragma region Arithmetic_Operators cout<<"******************* Arithmetic_Operators****************"<<endl; //add & sub MatrixXf m4(5,4); MatrixXf m5; m4=m2+m3; m3-=m2; //product m3=m1*m2; //transposition m5=m4.transpose(); //m5=m.adjoint();//伴隨矩陣 //dot product double xtt; cout<<"v1=\n"<<v1<<endl; v2.resize(4); v2<<VectorXd::Ones(4); cout<<"v2=\n"<<v2<<endl; cout<<"*************dot product*************"<<endl; xtt=v1.dot(v2); cout<<"v1.*v2="<<xtt<<endl; //vector norm cout<<"*************matrix norm*************"<<endl; xtt=v1.norm(); cout<<"norm of v1="<<xtt<<endl; xtt=v1.squaredNorm(); cout<<"SquareNorm of v1="<<xtt<<endl; #pragma endregion cout<<endl; }
去哪里更深入學習?
????? Please refer to?Eigen中的類及函數、Eigen的官方教程,和一些教程上的相關內容。
3.FLANN - Fast Library for Approximate Nearest Neighbors
?
????? 目前最完整的(近似)最近鄰開源庫。不但實現了一系列查找算法,還包含了一種自動選取最快算法的機制。
FLANN is written in C++ and contains bindings for the following languages: C, MATLAB and Python.算是比較完整的支持吧!
http://www.cs.ubc.ca/research/flann/
官網的介紹非常詳細,幾乎是面面俱到,希望能仔細閱讀....
其中有一條新聞:
- You can find binary installers for FLANN on the Point Cloud Library project page. Thanks to the PCL developers!
此外,視覺博客的相關介紹:http://www.cvchina.info/tag/flann/
?
4.VTK 視覺化工具函數庫
轉自維基:http://zh.wikipedia.org/wiki/VTK
視覺化工具函式庫(VTK, Visualization Toolkit)是一個開放源碼,跨平臺、支援平行處理(VTK曾用于處理大小近乎1個Petabyte的資料,其平臺為美國Los Alamos國家實驗室所有的具1024個處理器之大型系統)的圖形應用函式庫。2005年實曾被美國陸軍研究實驗室用于即時模擬俄羅斯制反導彈戰車ZSU23-4受到平面波攻擊的情形,其計算節點高達2.5兆個之多。
該函式庫以開放源碼的BSD授權釋出。
官方主頁:http://www.vtk.org/
總結
以上是生活随笔為你收集整理的PCL第三方库:Eigen, Flann , Qhull, VTK, Boost简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱情话语甜蜜唯美浪漫 恋爱甜蜜的唯美句子
- 下一篇: 公司领导新年讲话3篇