OpenCV 與 OpenGL 的關係是什麼?
完整版本回答參見專欄文章
OpenCV 為啥勾搭上 OpenGL? - 黑客與畫家 - 知乎專欄一個是最廣泛使用開源的計算機視覺庫
一個是三維工業標準兩者本毫無關係
不過自2.3開始,OpenCV的highgui模塊開始支持OpenGL渲染另外增強現實(AR)應用中,既可能用到OpenCV,也可能用到OpenGL
由於顯卡的能力增強,現在的 OpenCV 已經有新的形態了,即大量的運算位於顯卡上。- 運算通過 CUDA 或 OpenCL
- 渲染通過 OpenGL
這兩點意味著除了用戶界面交互與文件IO外(highgui模塊),可以逐漸脫離 CPU。
這才是 OpenCV 與 OpenGL 的真正關係,或者說 OpenCV 與顯卡的真正關係。Opencv是從圖像到數據OpenGL是從數據到圖像
OpenCV是 Open Source Computer Vision LibraryOpenGL是 Open Graphics LibraryOpenCV主要是提供圖像處理和視頻處理的基礎演算法庫,還涉及一些機器學習的演算法。比如你想實現視頻的降噪、運動物體的跟蹤、目標(比如人臉)的識別這些都是CV的領域OpenGL則專註在Graphics,3D繪圖。其實兩者的區別就是Computer Vision和Computer Graphics這兩個學科之間的區別,前者專註於從採集到的視覺圖像中獲取信息,是用機器來理解圖像;後者是用機器繪製合適的視覺圖像給人看。似乎沒啥關係!
OpenGL和微軟DirectX是同一類東西,相當於一種規範+軟體,目的是為使用圖形處理器(GPU)的用戶(上層軟體)提供統一的軟體介面。
沒有OpenGL的時候,應用軟體是這樣開發的:硬體A--硬體驅動A--應用軟體A硬體B--硬體驅動B--應用軟體B硬體C--硬體驅動C--應用軟體C
有了OpenGL之後,應用軟體是這樣開發的:硬體A--硬體驅動A--OpenGL--應用軟體A硬體B--硬體驅動B--OpenGL--應用軟體A硬體C--硬體驅動C--OpenGL--應用軟體A目的還是避免複雜、重複開發,使得應用軟體開發更專註於應用本身的需求。OpenCV本身是處理標準化圖形數據的一種軟體,標準化的圖形數據(如JPEG, PNG, BMP)處理可以使用CPU,也可以使用GPU。使用CPU處理意味著硬體是通用目的的,一般不能達到最高效率;使用GPU處理,相應的圖形計算可以得到專用硬體加速,但GPU種類多種多樣,如果OpenCV只有一套實現,那最好也是基於OpenGL之類的標準來實現,不然就要做N遍硬體適配工作。一個是讓機器識別東西的,OpenCV是給電腦做眼睛的一個是讓機器計算出更好畫面的,OpenGL用在遊戲渲染方面很多
OpenCV
OpenCV的全稱是:Open Source Computer Vision Library。OpenCV是一個開源發行的跨平台計算機視覺庫,可以運行在Linux、Windows和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的介面,實現了圖像處理和計算機視覺方面的很多通用演算法。OpenCV用C++語言編寫,它的主要介面也是C++語言,但是依然保留了大量的C語言介面。該庫也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的介面。這些語言的API介面函數可以通過在線文檔獲得。如今也提供對於C#,Ch, Ruby的支持。
OpenGL
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平台的編程介面規格的專業的圖形程序介面。它用於三維圖像(二維的亦可),是一個功能強大,調用方便的底層圖形庫。
CV和GL屬於兩個不同的庫,OpenCV是一個基於(開源)發行的跨平台計算機視覺庫,OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平台的編程介面規格的專業的圖形程序介面。
OpenCL
OpenCL全稱Open Computing Language,開放運算語言,是第一個面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境,便於軟體開發人員為高性能計算伺服器、桌面計算系統、手持設備編寫高效輕便的代碼,而且廣泛適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其他並行處理器,在遊戲、娛樂、科研、醫療等各種領域都有廣闊的發展前景。OpenMPOpenMp,全寫 Open Multi-Processing開源的並行編程,是由OpenMP Architecture Review Board牽頭提出的,並已被廣泛接受的,用於共享內存並行系統的多處理器程序設計的一套指導性的編譯處理方案(Compiler Directive)。OpenMP支持的編程語言包括C語言、C++和Fortran;而支持OpenMp的編譯器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMp提供了對並行演算法的高層的抽象描述,程序員通過在源代碼中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程序進行並行化,並在必要之處加入同步互斥以及通信。當選擇忽略這些pragma,或者編譯器不支持OpenMP時,程序又可退化為通常的程序(一般為串列),代碼仍然可以正常運作,只是不能利用多線程來加速程序執行。OpenMP和OpenCL都是用於高性能計算機,但是關鍵點不一樣,前者主要是基於CPU的並行,後者主攻是異構系統中GPU並行。
說白了且說簡單點,opencv用來解析圖片,opengl用來畫圖,前者用來做圖片視頻的處理,後者用來做2D3D場景的繪製
問題應該改成opengl,opencv,opencl三者之間關係
OpenGL是基於C的圖形庫,主要用於三維圖形的渲染。OpenCV是基於C的計算機視覺庫,主要用於計算機視覺的處理。這2個庫都是開源的,分別在計算機圖形學和計算機視覺鄰域被廣泛使用。
推薦閱讀:
※如何學習C++圖像處理?
※ocr中文,字元切分時如何保證切出整個漢字,例如知這個字?
※如何從0學習opencv,完成類似人臉檢測的畢設?