OpenGL和OpenCV
一、 OpenGL
OpenGL(全寫Open Graphics Library)是個定義了一個跨程式語言、跨平臺的程式設計介面的規格,它用於三維影象(二維的亦可)。OpenGL是個專業的圖形程式介面,是一個功能強大,呼叫方便的底層圖形庫。
1、 概述
OpenGL - 高效能圖形演算法行業標準
OpenGL™ 是行業領域中最為廣泛接納的 2D/3D 圖形 API, 其自誕生至今已催生了各種計算機平臺及裝置上的數千優秀應用程式。OpenGL™ 是獨立於視窗作業系統或其它作業系統的,亦是網路透明的。在包含CAD、內容創作、能源、娛樂、遊戲開發、製造業、製藥業及虛擬現實等行業領域中,OpenGL™ 幫助程式設計師實現在 PC、工作站、超級計算機等硬體裝置上的高效能、極具衝擊力的高視覺表現力圖形處理軟體的開發。
OpenGL的前身是SGI公司為其圖形工作站開發的IRIS GL。IRIS GL是一個工業標準的3D圖形軟體介面,功能雖然強大但是移植性不好,於是SGI公司便在IRIS GL的基礎上開發了OpenGL。OpenGL的英文全稱是“Open Graphics Library”,顧名思義,OpenGL便是“開放的圖形程式介面”。雖然DirectX在家用市場全面領先,但在專業高階繪圖領域,OpenGL是不能被取代的主角。
OpenGL是個與硬體無關的軟體介面,可以在不同的平臺如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。因此,支援OpenGL的軟體具有很好的移植性,可以獲得非常廣泛的應用。由於OpenGL是圖形的底層圖形庫,沒有提供幾何實體圖元,不能直接用以描述場景。但是,通過一些轉換程式,可以很方便地將AutoCAD、3DS/3DSMAX等3D圖形設計軟體製作的DXF和3DS模型檔案轉換成OpenGL的頂點陣列。
在OpenGL的基礎上還有Open Inventor、Cosmo3D、Optimizer等多種高階圖形庫,適應不同應用。其中,Open Inventor應用最為廣泛。該軟體是基於OpenGL面向物件的工具包,提供建立互動式3D圖形應用程式的物件和方法,提供了預定義的物件和用於互動的事件處理模組,建立和編輯3D場景的高階應用程式單元,有列印物件和用其它圖形格式交換資料的能力。
OpenGL的發展一直處於一種較為遲緩的態勢,每次版本的提高新增的技術很少,大多隻是對其中部分做出修改和完善。1992年7月,SGI公司釋出了OpenGL的1.0版本,隨後又與微軟公司共同開發了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上執行的大型3D圖形處理軟體也可以在微機上運用。1995年OpenGL的1.1版本面市,該版本比1.0的效能有許多提高,並加入了一些新的功能。其中包括改進印表機支援,在增強元檔案中包含OpenGL的呼叫,頂點陣列的新特性,提高頂點位置、法線、顏色、色彩指數、紋理座標、多邊形邊緣標識的傳輸速度,引入了新的紋理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,該語言是“OpenGL 2.0”的底核,用於著色物件、頂點著色以及片斷著色技術的擴充套件功能。
OpenGL 2.0標準的主要制訂者並非原來的SGI,而是逐漸在ARB中佔據主動地位的3DLabs。2.0版本首先要做的是與舊版本之間的完整相容性,同時在頂點與畫素及記憶體管理上與DirectX共同合作以維持均勢。OpenGL 2.0將由OpenGL 1.3的現有功能加上與之完全相容的新功能所組成(如圖一)。藉此可以對在ARB停滯不前時代各家推出的各種糾纏不清的擴充套件指令集做一次徹底的精簡。此外,硬體可程式設計能力的實現也提供了一個更好的方法以整合現有的擴充套件指令。
目前,隨著DirectX的不斷髮展和完善,OpenGL的優勢逐漸喪失,至今雖然已有3Dlabs提倡開發的2.0版本面世,在其中加入了很多類似於DirectX中可程式設計單元的設計,但廠商的使用者的認知程度並不高,未來的OpenGL發展前景迷茫。
2、 OpenGL的發展歷程
1992年7月,SGI公司釋出了OpenGL的1.0版本,隨後又與微軟公司共同開發了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上執行的大型3D圖形處理軟體也可以在微機上運用。
1995年OpenGL的1.1版本面市,該版本較1.0效能提高許多,並加入了一些新的功能。包括提高頂點位置、法線、顏色、色彩指數、紋理座標、多邊形邊緣標識的傳輸速度,引入了新的紋理特性等等。
1997年,Windows 95下3D遊戲的大量湧現,遊戲開發公司迫切需要一個功能強大、相容性好的3D圖形介面,而當時微軟公司自己的3D圖形介面DirectX 3.0功能卻是很糟糕。因而以製作《雷神之錘》等經典3D射擊遊戲而著名的id公司同其它一些遊戲開發公司一同強烈要求微軟在Windows 95中加入對OpenGL的支援。微軟公司最終在Windows 95的OSR2版和後來的Windows 版本中加入了對OpenGL的支援。這樣,不但許多支援OpenGL的電腦3D遊戲得到廣泛應用,而且許多在3D圖形設計軟體也可以運用支援OpenGL標準的3D加速卡,大大提高其3D圖形的處理速度。
2003年的7月28日,SGI和ARB公佈了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式擴充套件規格繪製語言“OpenGL Shading Language”。OpenGL 1.5的新功包括:頂點Buffer Object、Shadow功能、隱蔽查詢、非乘方紋理等。
2004年8月,OpenGL2.0版本釋出~OpenGL 2.0標準的主要制訂者並非原來的SGI,而是逐漸在ARB中佔據主動地位的3Dlabs。opengl2.0支援OpenGL Shading Language、新的shader擴充套件特性以及其他多項增強特性。
2008年8月初Khronos工作組在Siggraph 2008大會上宣佈了OpenGL 3.0圖形介面規範,GLSL1.30 shader語言和其他新增功能將再次未來開放3D介面發展指明方向。
OpenGL 3.0 API開發代號為Longs Peak,和以往一樣,OpenGL 3.0仍然作為一個開放性和跨平臺的3D圖形介面標準,在Shader語言盛行的今天,OGL3.0增加了新版本的shader語言:GLSL 1.30,可以充分發揮當前可程式設計圖形硬體的潛能。同時,OGL3.0還引入了一些新的功能,例如頂點矩陣物件,全幀快取物件功能,32bit浮點紋理和渲染快取,基於阻塞佇列的條件渲染,緊湊行半浮點頂點和畫素資料,四個新壓縮機制等等。
2009年3月又公佈了升級版新規範OpenGL 3.1,也是這套跨平臺免費API有史以來的第九次更新。OpenGL 3.1將此前引入的OpenGL著色語言“GLSL”從1.30版升級到了1.40版,通過改程序序增強了對最新可程式設計圖形硬體的訪問,還有更高效的頂點處理、擴充套件的紋理功能、更彈性的緩衝管理等等。寬泛地講,OpenGL 3.1在3.0版的基礎上對整個API模型體系進行了簡化,可大幅提高軟體開發效率。
2009年8月Khronos小組釋出了OpenGL 3.2,這是一年以來OpenGL進行的第三次重要升級。該版本仍然延續了OpenGL發展的方向讓圖形程式開發者能在多種作業系統和平臺下更好的利用新的GPU功能。OpenGL3.2版本提升了效能表現、改進了視覺質量、提高了幾何圖形處理速度,而且使Direct3D程式更容易移植為OpenGL。除OpenGL之外,Khronos還將其開發的其它標準進行了協調改進,以求可以在更廣泛的領域提供強大的圖形功能和計算生態系統,這些標準包括用於平行計算的OpenCL、用於移動3D圖形開發的OpenGL ES和用於網路3D開發的WebGL。
Khronos旗下的OpenGL ARB(Architecture Review Board)工作組推出了GLSL 1.5OpenGLShading Language(OpenGL著色語言)的升級版,以及在OpenGL3.2框架下推出了兩個新功能,可以讓開發者在開發新程式時能夠在使用流水線核心特性或相容性特性之間做出選擇,其中相容性特性會提供與舊版OpenGL之間的相容性。
3、 OpenGL特點及功能
OpenGL是一個開放的三維圖形軟體包,它獨立於視窗系統和作業系統,以它為基礎開發的應用程式可以十分方便地在各種平臺間移植;OpenGL可以與Visual C++緊密介面,便於實現機械手的有關計算和圖形演算法,可保證演算法的正確性和可靠性;OpenGL使用簡便,效率高。它具有七大功能:
1) 建模:OpenGL圖形庫除了提供基本的點、線、多邊形的繪製函式外,還提供了複雜的三維物體(球、錐、多面體、茶壺等)以及複雜曲線和曲面繪製函式。
2) 變換:OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、旋轉、變比映象四種變換,投影變換有平行投影(又稱正射投影)和透視投 影兩種變換。其變換方法有利於減少演算法的執行時間,提高三維圖形的顯示速度。
3) 顏色模式設定:OpenGL顏色模式有兩種,即RGBA模式和顏色索引(Color Index)。
4) 光照和材質設定:OpenGL光有輻射光(Emitted Light)、環境光(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的反射率相乘後形成的顏色。
5) 紋理對映(Texture Mapping)。利用OpenGL紋理對映功能可以十分逼真地表達物體表面細節。
6) 點陣圖顯示和圖象增強圖象功能除了基本的拷貝和畫素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。以上三條可使被模擬物更具真實感,增強圖形顯示的效果。
7) 雙快取動畫(Double Buffering)雙快取即前臺快取和後臺快取,簡言之,後臺快取計算場景、生成畫面,前臺快取顯示後臺快取已畫好的畫面。
此外,利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等特殊效果。從而實現了消隱演算法。
4、 Open GL現狀
Open GL仍然是唯一能夠取代微軟對3D圖形技術的完全控制的API。它仍然具有一定的生命力,但是Silicon Graphics已經不再以任何讓微軟不悅的方式推廣Open GL,因而它存在較高的風險。遊戲開發人員是一個有著獨立思想的群體,很多重要的開發人員目前仍然在使用Open GL。因此,硬體開發商正在設法加強對它的支援。Direct3D目前還不能支援高階的圖形裝置和專業應用; Open GL在這些領域佔據著統治地位。最後,開放原始碼社群(尤其是Mesa專案)一直致力於為任何型別的計算機(無論它們是否使用微軟的作業系統)提供Open GL支援。
08年8月正式公佈OpenGL3.0版本。並且得到了,nv的支援,其官方網站上提供針對N卡的sdk下載。
目前,國內的三維遊戲開發技術正處於趕超國外的關鍵時期,從創意、策劃、研究開發與實現,到遊戲的運營與維護,都有大量的知識值得學習和摸索。由於 Linux 作業系統平臺的大力推廣,基於Linux 的各種應用軟體也不斷壯大,因此基於跨平臺圖形庫的跨平臺三維遊戲開發也越來越受重視。OpenGL(open graphics library)是一種獨立的平臺無關的三維圖形開發庫,在各種語言下進行主框架開發並結合應用OpenGL 函式都可以開發出三維遊戲。但是由於框架開發的平臺相關性使遊戲無法跨平臺編譯執行,因此glut+OpenGL 的方式成了一種很好的選擇。但是在對複雜框架和各種媒體的支援方面,glut 並不理想。在Linux 下可以採用FLTK 等框架平臺技術實現包括按鈕在內的比較複雜的框架功能,但是需要專門的Linux 開發環境,眾多的Window 環境下的KDE 愛好者明顯對此無法適從。相反,SDL(Simple DirectMedia Layer)作為免費的跨平臺多媒體應用程式設計介面,已經被人們廣泛用於開發二維遊戲,其優秀的訊息框架支援、檔案支援和聲音支援等都使得它成為能與微軟DirectX 匹敵的最為成熟的技術之一。
5、 OpenGL 3.1規範
Khronos Group在2009年3月又公佈了升級版新規範OpenGL 3.1,也是這套跨平臺免費API有史以來的第九次更新。
OpenGL 3.1將此前引入的OpenGL著色語言“GLSL”從1.30版升級到了1.40版,通過改程序序增強了對最新可程式設計圖形硬體的訪問,還有更高效的頂點處理、擴充套件的紋理功能、更彈性的緩衝管理等等。寬泛地講,OpenGL 3.1在3.0版的基礎上對整個API模型體系進行了簡化,可大幅提高軟體開發效率。
OpenGL 3.1主要新特性:Texture Buffer Objects(紋理緩衝物件)、Uniform Buffer Objects(統一緩衝物件)、Signed Normalized Textures(符號正常化紋理)、Primitive Restart(基本元素重啟)、Instancing(例項化)、CopyBuffer API(拷貝緩衝介面)……
與OpenGL 3.1規範同步,OpenGL架構評審委員會(ARB)也釋出了一個相容性擴充套件,能讓開發人員在訪問OpenGL 3.1裡已經刪除的OpenGL 1.x/2.x功能,確保應用程式的全面向下相容性。
OpenGL 3.1公佈後,業界圖形廠商很快予以了大力支援。AMD OpenGL主管Suki Samra表示:“AMD全面使用者OpenGL API,會在今後的Radeon和FirePro產品驅動程式中支援OpenGL 3.1。”NVIDIA市場營銷副總裁Dan Vivoli表示:“NVIDIA承諾儘快部署OpenGL 3.1,我們也很自豪地在規範公佈同一天放出了自己的測試版驅動程式。”
市場調研機構Jon Peddie Research預測,OpenGL 3.1規範圖形硬體的安裝規模將超過1億。AMD、NVIDIA、S3 Graphics的顯示卡驅動目前都已經支援OpenGL 3.0。
6、 OpenGL與DirectX的區別
OpenGL 只是圖形函式庫。
DirectX 包含圖形, 聲音, 輸入, 網路等模組。
OpenGL穩定,可跨平臺使用。DirectX僅能用於Windows系列平臺,包括Windows Mobile/CE系列以及XBOX/XBOX360。
二、 OpenCV
1、 為什麼存在OpenCV
計算機視覺市場巨大而且持續增長,且這方面沒有標準API,目前的計算機視覺軟體大概有以下三種:
1) 研究程式碼(慢,不穩定,獨立並與其他庫不相容)
2) 耗費很高的商業化工具(比如Halcon, MATLAB+Simulink)
3) 依賴硬體的一些特別的解決方案(比如視訊監控,製造控制系統,醫療裝置)
這是目前的現狀。而標準的API將簡化計算機視覺程式和解決方案的開發。OpenCV致力於成為這樣的標準API。
2、 專案歷史
1999年1月,CVL專案啟動。主要目標是人機介面,能被UI呼叫的實時計算機視覺庫,為Intel處理器做了特定優化。
2000年6月,第一個開源版本OpenCV alpha 3釋出。
2000年12月,針對linux平臺的OpenCV beta 1釋出。
期間,繼續各種研究。。。
2006年,支援Mac OS的OpenCV 1.0釋出。
2009年9月,OpenCV1.2(beta2.0)釋出。
2009年10月1日,Version 2.0釋出。
OpenCV 擁有包括 500 多個C函式的跨平臺的中、高層 API。它不依賴於其它的外部庫——儘管也可以使用某些外部庫。
OpenCV 使用類BSDlisence,所以對非商業應用和商業應用都是免費(FREE)的。(細節參考 license)。
OpenCV 為Intel Integrated Performance Primitives (IPP) 提供了透明介面。 這意味著如果有為特定處理器優化的的IPP 庫, OpenCV 將在執行時自動載入這些庫。
OpenCV提供的視覺處理演算法非常豐富,並且他不分以C語言編寫,加上其開源的特性,處理得當,不需要新增新的外部支援也可以完整的編譯連結生成執行程式,所以很多人用它來做演算法的移植,OpenCV的程式碼經過適當改寫可以正常的執行在DSP系統和微控制器系統中,目前這種移植在大學中經常作為相關專業本科生畢業設計或者研究生課題的選題。
3、 誰建立了它
作者列表可以在檔案AUTHORS中找到。
此外,還有很多人給出了建議、補丁、BUG 報告等等。一個不太完整的列表在檔案THANKS中。
4、 新特徵
請參考OpenCVChangeLog。
5、 從哪裡下載 OpenCV
訪問 http://www.sourceforge.net/projects/opencvlibrary 。
如果有問題,在 Google (http://www.google.com )中輸入 "OpenCV" 搜尋。