OpenCV的全稱是Open Source Computer Vision Library,是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫(kù)(主要操作對(duì)象是圖像)。OpenCV是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費(fèi)使用。OpenCV可用于開發(fā)實(shí)時(shí)的圖像處理、計(jì)算機(jī)視覺以及模式識(shí)別程序。該程序庫(kù)也可以使用英特爾公司的IPP進(jìn)行加速處理。
OpenGL(全寫Open Graphics Library)是個(gè)定義了一個(gè)跨編程語言、跨平臺(tái)的應(yīng)用程序接口(API)的規(guī)格,它用于生成二維、三維圖像。這個(gè)接口由近三百五十個(gè)不同的函數(shù)調(diào)用組成,用來從簡(jiǎn)單的圖形比特繪制復(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 之后的版本,那么會(huì)發(fā)現(xiàn) cv::ogl namespace,ogl 自然是 OpenGL了。一個(gè)三維計(jì)算機(jī)圖形庫(kù)為何出現(xiàn)在計(jì)算機(jī)視覺中,傳統(tǒng)的 CV 開發(fā)者是否需要學(xué)習(xí)它,這些問題待我一一來回答。
問題一:為何引入 OpenGL?
在 2.3 之前 OpenCV 的渲染部分都是由 CPU 來實(shí)現(xiàn)的,不論是畫線還是把圖片顯示到屏幕上。這有兩個(gè)問題,速度慢,同時(shí)沒法畫三維物體。引入 OpenGL 是為了借助 顯卡的力量,顯卡比 CPU 更擅長(zhǎng)渲染,同時(shí)顯卡和 CPU 可以同時(shí)干活。比方說,CPU 在獲取攝像頭畫面然后檢測(cè)人臉時(shí),顯卡在渲染三維的人臉網(wǎng)格模型和高精度抗鋸齒的二維界面。
另外,隨著民用深度傳感器的普及,cv::VideoCapture 第一時(shí)間增加了對(duì) Kinect、華碩 Xtion、Intel Perceptual Computing SDK 等的支持。傳統(tǒng)的視覺計(jì)算中,深度圖只能當(dāng)做單通道的灰度圖進(jìn)行處理。想實(shí)現(xiàn)隔空的多點(diǎn)觸摸是綽綽有余,但是如果想實(shí)現(xiàn)三維重建(比如 Kinect Fushion)那么我們必須將算法升級(jí)到三維空間。相應(yīng)的,三維空間的算法也需要三維的 API 進(jìn)行渲染,也就是 OpenGL。
想開啟該功能,需要在配置 CMake 時(shí)選上 WITH_OPENGL=ON,然后重新編譯完整的 OpenCV 庫(kù)。我簡(jiǎn)要介紹下幾個(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ā)的是命令行程序并不顯示任何圖像,或者顯示的圖片很簡(jiǎn)單,那么不需要轉(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 模塊,對(duì)于渲染的時(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。
評(píng)論