OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫(主要操作對象是圖像)。OpenCV是由英特爾公司發起并參與開發,以BSD許可證授權發行,可以在商業和研究領域中免費使用。OpenCV可用于開發實時的圖像處理、計算機視覺以及模式識別程序。該程序庫也可以使用英特爾公司的IPP進行加速處理。
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平臺的應用程序接口(API)的規格,它用于生成二維、三維圖像。這個接口由近三百五十個不同的函數調用組成,用來從簡單的圖形比特繪制復雜的三維景象。而另一種程序接口系統是僅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虛擬實境、科學可視化程序和電子游戲開發
兩者的區別就是Computer Vision和Computer Graphics這兩個學科之間的區別,前者專注于從采集到的視覺圖像中獲取信息,是用機器來理解圖像;后者是用機器繪制合適的視覺圖像給人看
OpenCV 與 OpenGL 的關系是什么?
如果讀者留意 OpenCV 2.3 之后的版本,那么會發現 cv::ogl namespace,ogl 自然是 OpenGL了。一個三維計算機圖形庫為何出現在計算機視覺中,傳統的 CV 開發者是否需要學習它,這些問題待我一一來回答。
問題一:為何引入 OpenGL?
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 來實現的,不論是畫線還是把圖片顯示到屏幕上。這有兩個問題,速度慢,同時沒法畫三維物體。引入 OpenGL 是為了借助 顯卡的力量,顯卡比 CPU 更擅長渲染,同時顯卡和 CPU 可以同時干活。比方說,CPU 在獲取攝像頭畫面然后檢測人臉時,顯卡在渲染三維的人臉網格模型和高精度抗鋸齒的二維界面。
另外,隨著民用深度傳感器的普及,cv::VideoCapture 第一時間增加了對 Kinect、華碩 Xtion、Intel Perceptual Computing SDK 等的支持。傳統的視覺計算中,深度圖只能當做單通道的灰度圖進行處理。想實現隔空的多點觸摸是綽綽有余,但是如果想實現三維重建(比如 Kinect Fushion)那么我們必須將算法升級到三維空間。相應的,三維空間的算法也需要三維的 API 進行渲染,也就是 OpenGL。
想開啟該功能,需要在配置 CMake 時選上 WITH_OPENGL=ON,然后重新編譯完整的 OpenCV 庫。我簡要介紹下幾個組件:
ogl::Buffer 是 OpenGL 中的緩存區,可以用于保存多邊形的頂點和顏色等。
ogl::Texture2D 是保存在顯卡中的二維貼圖,可以認為是得到 GPU 加速的 cv::Mat。
前面這兩個類都只是保存數據,要把數據畫出來,還要用到 ogl::render 函數。
oid ogl::render(const Texture2D& tex, Rect_《double》 wndRect=Rect_《double》(0.0, 0.0, 1.0, 1.0), Rect_《double》 texRect=Rect_《double》(0.0, 0.0, 1.0, 1.0))
問題二:是否應該學習 OpenGL?
It depends.
如果你開發的是命令行程序并不顯示任何圖像,或者顯示的圖片很簡單,那么不需要轉換到 cv::ogl 下。
如果你的應用耗費了大量時間在圖片的顯示上,或是希望擁有高質量的界面系統,那么你可以借助 cv::ogl::Texture2D 加速圖像的渲染。
如果你開發的是增強現實應用,你肯定已經擁有了自己的三維渲染模塊,可以考慮與 cv::ogl::Buffer 整合。
如果你已經在使用 CUDA 模塊,對于渲染的時候數據需要回傳到 CPU 表示多此一舉,那么你可以使用 CUDA 與 OpenGL 的協同功能去除多余的數據傳輸。
另一方面,如果你不是 OpenCV 的用戶但是你正在開發虛擬現實應用,你可以考慮將視覺計算引入到你的系統中,實現類似 HoloLens 的設備。
未來展望:OpenCV 與顯卡的關系
由于顯卡能力的增強以及硬件公司的支持,OpenCV 逐漸展露出新的形態,大量的視覺計算位于顯卡上。
運算通過 CUDA 模塊或 OpenCL 模塊,這兩個模塊分別得到 NVIDIA 與 AMD 的大力支持。
渲染通過 OpenGL 模塊。
這意味著除了文件讀寫(highgui 模塊)外,視覺應用可以逐漸脫離 CPU。
opencv和opengl哪個更有前途?
OpenGL
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發展前景迷茫。
為什么存在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系統和單片機系統中,目前這種移植在大學中經常作為相關專業本科生畢業設計或者研究生課題的選題。
OpenCV學術氣息太強,功能雖多,但針對特定功能的優化不足,適合創建原型,不適合開發產品,所以也沒什么前途——當然總比死掉的OpenGL有前途。
評論