OpenCV的全稱是Open Source Computer Vision Library,是一個(gè)跨平臺的計(jì)算機(jī)視覺庫(主要操作對象是圖像)。OpenCV是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費(fèi)使用。OpenCV可用于開發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺以及模式識別程序。該程序庫也可以使用英特爾公司的IPP進(jìn)行加速處理。
OpenGL(全寫Open Graphics Library)是個(gè)定義了一個(gè)跨編程語言、跨平臺的應(yīng)用程序接口(API)的規(guī)格,它用于生成二維、三維圖像。這個(gè)接口由近三百五十個(gè)不同的函數(shù)調(diào)用組成,用來從簡單的圖形比特繪制復(fù)雜的三維景象。而另一種程序接口系統(tǒng)是僅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虛擬實(shí)境、科學(xué)可視化程序和電子游戲開發(fā)
兩者的區(qū)別就是Computer Vision和Computer Graphics這兩個(gè)學(xué)科之間的區(qū)別,前者專注于從采集到的視覺圖像中獲取信息,是用機(jī)器來理解圖像;后者是用機(jī)器繪制合適的視覺圖像給人看
OpenCV 與 OpenGL 的關(guān)系是什么?
如果讀者留意 OpenCV 2.3 之后的版本,那么會發(fā)現(xiàn) cv::ogl namespace,ogl 自然是 OpenGL了。一個(gè)三維計(jì)算機(jī)圖形庫為何出現(xiàn)在計(jì)算機(jī)視覺中,傳統(tǒng)的 CV 開發(fā)者是否需要學(xué)習(xí)它,這些問題待我一一來回答。
問題一:為何引入 OpenGL?
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 來實(shí)現(xiàn)的,不論是畫線還是把圖片顯示到屏幕上。這有兩個(gè)問題,速度慢,同時(shí)沒法畫三維物體。引入 OpenGL 是為了借助 顯卡的力量,顯卡比 CPU 更擅長渲染,同時(shí)顯卡和 CPU 可以同時(shí)干活。比方說,CPU 在獲取攝像頭畫面然后檢測人臉時(shí),顯卡在渲染三維的人臉網(wǎng)格模型和高精度抗鋸齒的二維界面。
另外,隨著民用深度傳感器的普及,cv::VideoCapture 第一時(shí)間增加了對 Kinect、華碩 Xtion、Intel Perceptual Computing SDK 等的支持。傳統(tǒng)的視覺計(jì)算中,深度圖只能當(dāng)做單通道的灰度圖進(jìn)行處理。想實(shí)現(xiàn)隔空的多點(diǎn)觸摸是綽綽有余,但是如果想實(shí)現(xiàn)三維重建(比如 Kinect Fushion)那么我們必須將算法升級到三維空間。相應(yīng)的,三維空間的算法也需要三維的 API 進(jìn)行渲染,也就是 OpenGL。
想開啟該功能,需要在配置 CMake 時(shí)選上 WITH_OPENGL=ON,然后重新編譯完整的 OpenCV 庫。我簡要介紹下幾個(gè)組件:
ogl::Buffer 是 OpenGL 中的緩存區(qū),可以用于保存多邊形的頂點(diǎn)和顏色等。
ogl::Texture2D 是保存在顯卡中的二維貼圖,可以認(rèn)為是得到 GPU 加速的 cv::Mat。
前面這兩個(gè)類都只是保存數(shù)據(jù),要把數(shù)據(jù)畫出來,還要用到 ogl::render 函數(shù)。
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))
問題二:是否應(yīng)該學(xué)習(xí) OpenGL?
It depends.
如果你開發(fā)的是命令行程序并不顯示任何圖像,或者顯示的圖片很簡單,那么不需要轉(zhuǎn)換到 cv::ogl 下。
如果你的應(yīng)用耗費(fèi)了大量時(shí)間在圖片的顯示上,或是希望擁有高質(zhì)量的界面系統(tǒng),那么你可以借助 cv::ogl::Texture2D 加速圖像的渲染。
如果你開發(fā)的是增強(qiáng)現(xiàn)實(shí)應(yīng)用,你肯定已經(jīng)擁有了自己的三維渲染模塊,可以考慮與 cv::ogl::Buffer 整合。
如果你已經(jīng)在使用 CUDA 模塊,對于渲染的時(shí)候數(shù)據(jù)需要回傳到 CPU 表示多此一舉,那么你可以使用 CUDA 與 OpenGL 的協(xié)同功能去除多余的數(shù)據(jù)傳輸。
另一方面,如果你不是 OpenCV 的用戶但是你正在開發(fā)虛擬現(xiàn)實(shí)應(yīng)用,你可以考慮將視覺計(jì)算引入到你的系統(tǒng)中,實(shí)現(xiàn)類似 HoloLens 的設(shè)備。
未來展望:OpenCV 與顯卡的關(guān)系
由于顯卡能力的增強(qiáng)以及硬件公司的支持,OpenCV 逐漸展露出新的形態(tài),大量的視覺計(jì)算位于顯卡上。
運(yùn)算通過 CUDA 模塊或 OpenCL 模塊,這兩個(gè)模塊分別得到 NVIDIA 與 AMD 的大力支持。
渲染通過 OpenGL 模塊。
這意味著除了文件讀寫(highgui 模塊)外,視覺應(yīng)用可以逐漸脫離 CPU。
opencv和opengl哪個(gè)更有前途?
OpenGL
OpenGL的發(fā)展一直處于一種較為遲緩的態(tài)勢,每次版本的提高新增的技術(shù)很少,大多只是對其中部分做出修改和完善。1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型3D圖形處理軟件也可以在微機(jī)上運(yùn)用。1995年OpenGL的1.1版本面市,該版本比1.0的性能有許多提高,并加入了一些新的功能。其中包括改進(jìn)打印機(jī)支持,在增強(qiáng)元文件中包含OpenGL的調(diào)用,頂點(diǎn)數(shù)組的新特性,提高頂點(diǎn)位置、法線、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識的傳輸速度,引入了新的紋理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,該語言是“OpenGL 2.0”的底核,用于著色對象、頂點(diǎn)著色以及片斷著色技術(shù)的擴(kuò)展功能。
OpenGL 2.0標(biāo)準(zhǔn)的主要制訂者并非原來的SGI,而是逐漸在ARB中占據(jù)主動(dòng)地位的3DLabs。2.0版本首先要做的是與舊版本之間的完整兼容性,同時(shí)在頂點(diǎn)與像素及內(nèi)存管理上與DirectX共同合作以維持均勢。OpenGL 2.0將由OpenGL 1.3的現(xiàn)有功能加上與之完全兼容的新功能所組成(如圖一)。借此可以對在ARB停滯不前時(shí)代各家推出的各種糾纏不清的擴(kuò)展指令集做一次徹底的精簡。此外,硬件可編程能力的實(shí)現(xiàn)也提供了一個(gè)更好的方法以整合現(xiàn)有的擴(kuò)展指令。
目前,隨著DirectX的不斷發(fā)展和完善,OpenGL的優(yōu)勢逐漸喪失,至今雖然已有3Dlabs提倡開發(fā)的2.0版本面世,在其中加入了很多類似于DirectX中可編程單元的設(shè)計(jì),但廠商的用戶的認(rèn)知程度并不高,未來的OpenGL發(fā)展前景迷茫。
為什么存在OpenCV
計(jì)算機(jī)視覺市場巨大而且持續(xù)增長,且這方面沒有標(biāo)準(zhǔn)API,目前的計(jì)算機(jī)視覺軟件大概有以下三種:
1) 研究代碼(慢,不穩(wěn)定,獨(dú)立并與其他庫不兼容)
2) 耗費(fèi)很高的商業(yè)化工具(比如Halcon, MATLAB+Simulink)
3) 依賴硬件的一些特別的解決方案(比如視頻監(jiān)控,制造控制系統(tǒng),醫(yī)療設(shè)備)
這是目前的現(xiàn)狀。而標(biāo)準(zhǔn)的API將簡化計(jì)算機(jī)視覺程序和解決方案的開發(fā)。OpenCV致力于成為這樣的標(biāo)準(zhǔn)API。
2、 項(xiàng)目歷史
1999年1月,CVL項(xiàng)目啟動(dòng)。主要目標(biāo)是人機(jī)界面,能被UI調(diào)用的實(shí)時(shí)計(jì)算機(jī)視覺庫,為Intel處理器做了特定優(yōu)化。
2000年6月,第一個(gè)開源版本OpenCV alpha 3發(fā)布。
2000年12月,針對linux平臺的OpenCV beta 1發(fā)布。
期間,繼續(xù)各種研究。。。
2006年,支持Mac OS的OpenCV 1.0發(fā)布。
2009年9月,OpenCV1.2(beta2.0)發(fā)布。
2009年10月1日,Version 2.0發(fā)布。
OpenCV 擁有包括 500 多個(gè)C函數(shù)的跨平臺的中、高層 API。它不依賴于其它的外部庫——盡管也可以使用某些外部庫。
OpenCV 使用類BSDlisence,所以對非商業(yè)應(yīng)用和商業(yè)應(yīng)用都是免費(fèi)(FREE)的。(細(xì)節(jié)參考 license)。
OpenCV 為Intel Integrated Performance Primitives (IPP) 提供了透明接口。 這意味著如果有為特定處理器優(yōu)化的的IPP 庫, OpenCV 將在運(yùn)行時(shí)自動(dòng)加載這些庫。
OpenCV提供的視覺處理算法非常豐富,并且他不分以C語言編寫,加上其開源的特性,處理得當(dāng),不需要添加新的外部支持也可以完整的編譯鏈接生成執(zhí)行程序,所以很多人用它來做算法的移植,OpenCV的代碼經(jīng)過適當(dāng)改寫可以正常的運(yùn)行在DSP系統(tǒng)和單片機(jī)系統(tǒng)中,目前這種移植在大學(xué)中經(jīng)常作為相關(guān)專業(yè)本科生畢業(yè)設(shè)計(jì)或者研究生課題的選題。
OpenCV學(xué)術(shù)氣息太強(qiáng),功能雖多,但針對特定功能的優(yōu)化不足,適合創(chuàng)建原型,不適合開發(fā)產(chǎn)品,所以也沒什么前途——當(dāng)然總比死掉的OpenGL有前途。
評論
查看更多