當下人工智能的發展是前所未有的迅猛,而計算機視覺(Computer Vision)無疑是人工智能一個非常重要的分支,計算機視覺的發展也成為了很多科研人員和業界開發人員聚焦的熱點。我們常說的無人駕駛、智能安防、人臉識別、文字識別、以圖搜圖、VR/AR、3D重構等等都是以計算機視覺做為技術基礎的應用實踐。
在計算機視覺項目的開發中,OpenCV作為最大眾的開源庫,擁有了豐富的常用圖像處理函數庫,采用C/C++語言編寫,可以運行在Linux/Windows/Mac等操作系統上,能夠快速的實現一些圖像處理和識別的任務。此外,OpenCV還提供了java、python、cuda等的使用接口、機器學習的基礎算法調用,從而使得圖像處理和圖像分析變得更加易于上手,讓開發人員更多的精力花在算法的設計上。
本文主要介紹OpenCV開發的一些基礎知識以及入門上手的方法。
1、OpenCV的起源背景
OpenCV誕生于Intel研究中心,其目的是為了促進CPU密集型應用。為了達到這一目的,Intel啟動了多個項目,包括實時光線追蹤和三維顯示墻。一個在Intel工作的OpenCV作者在訪問一些大學時,注意到許多頂尖大學中的研究組(如MIT媒體實驗室)擁有很好的內部使用的開放計算機視覺庫(在學生們間互相傳播的代碼),這會幫助一個新生從一個很高的起點開始ta的計算機視覺研究。這樣一個新生可以在以前的基礎上繼續開始研究,而不用去從底層編寫基本函數。
因此,OpenCV的目的是開發一個普遍可用的計算機視覺庫。在Intel的性能庫團隊的幫助下,OpenCV實現了一些核心代碼以及算法,并發給Intel俄羅斯的庫團隊。這就是OpenCV的誕生之地:在與軟件性能庫團隊的合作下,它開始于Intel的研究中心,并在俄羅斯得到實現和優化(這再一次驗證了俄羅斯程序員的卓越之處!)。
俄羅斯團隊的主要負責人是俄羅斯人Vadim Pisarevsky,他負責管理項目、寫代碼并優化OpenCV的大部分代碼,在OpenCV中很大一部分功勞都屬于他。跟他一起,Victor Eruhimov幫助開發了早期的架構,Valery Kuriakin管理俄羅斯實驗室并提供了很大的支持。在開始時,OpenCV就定下了以下三大目標:
(1)為基本的視覺應用提供開放且優化的源代碼,以促進視覺研究的發展。能有效地避免“閉門造車”。
(2)通過提供一個通用的架構來傳播視覺知識,開發者可以在這個架構上繼續開展工作,所以代碼應該是非常易讀的且可改寫。
(3)本庫采用的協議不要求商業產品繼續開放代碼,這使得可移植的、性能被優化的代碼可以自由獲取,可以促進基于視覺的商業應用的發展。
這些目標說明了OpenCV的緣起。計算機視覺應用的發展會增加對快速處理器的需求。與單獨銷售軟件相比,促進處理器的升級會為Intel帶來更多收入。這也許是為什么這個開放且免費的庫出現在一家硬件生產企業中,而不是在一家軟件公司中。從某種程度上說,在一家硬件公司里,在軟件方面會有更多創新的空間。就像華為這樣的網絡通訊設備公司,與硬件相配套的軟件也是非常的強大!
2、OpenCV簡介
OpenCV的全稱是:Open Source Computer Vision Library。OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它是輕量級的,而且是高效的,由一系列C函數和少量C++類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python、Java and MATLAB/OCTAVE的接口。這些語言的API接口函數可以通過在線文檔獲得。如今也提供對于C#、Ruby等的支持。
OpenCV是一個用于圖像處理、分析、機器視覺方面的開源函數庫。無論你是做科學研究,還是商業應用,OpenCV都可以作為你理想的工具庫,因為對于這兩者,它完全是免費的。
同時,由于計算機視覺與機器學習密不可分,該庫也包含了比較常用的一些機器學習算法,比如圖像識別、機器視覺在安防領域有廣泛的應用。但很少有人知道,在航拍圖片、街道圖片(例如google street view)中,要嚴重依賴于機器視覺的攝像頭標定、圖像融合等技術。
近年來,在入侵檢測、特定目標跟蹤、目標檢測、人臉檢測、人臉識別、人臉跟蹤等領域,OpenCV可謂大顯身手,而這些,僅僅是其應用的冰山一角。
如今,來自世界各地的各大公司、科研機構的研究人員,共同維護支持著OpenCV的開源庫開發。這些公司和機構包括:微軟,IBM,索尼、西門子、google、intel、斯坦福、MIT、CMU、劍橋。
計算機視覺市場巨大而且持續增長,且這方面沒有標準API,如今的計算機視覺軟件大概有以下三種:
(1)研究代碼(慢,不穩定,獨立并與其他庫不兼容)
(2)耗費很高的商業化工具(比如Halcon, MATLAB+Simulink)
(3)依賴硬件的一些特別的解決方案(比如視頻監控,制造控制系統,醫療設備)這是如今的現狀。
如果能有一個統一的標準API,將簡化計算機視覺程序和解決方案的開發,而OpenCV致力于成為這樣的標準API。
OpenCV致力于真實世界的實時應用,通過優化的C代碼的編寫對其執行速度帶來了可觀的提升,并且可以通過購買Intel的IPP高性能多媒體函數庫(Integrated Performance Primitives)得到更快的處理速度(注:OpenCV 2.0版的代碼已顯著優化,無需IPP來提升性能,故2.0版不再提供IPP接口)。下圖為OpenCV與當前其他主流視覺函數庫的性能比較。
3、OpenCV內部構成
OpenCV主體分為五個模塊,其中四個模塊如下所示:
OpenCV的CV模塊包含基本的圖像處理函數和高級的計算機視覺算法。ML是機器學習庫,包含一些基于統計的分類和聚類工具。HighGUI包含圖像和視頻輸入/輸出的函數。CXCore包含OpenCV的一些基本數據結構和相關函數。
目前,OpenCV的最高版本為OpenCV4.3.0。其中OpenCV3.0和OpenCV2.0的版本相比,改動比較大,主要改動如下:
(1)大體上保留了OpenCV 2經典的C++和Python編程接口風格。其中,Python接口大大增強,也加入了Python 3.x的支持。一般來說,以前版本的程序只要做少數修改,就可以使用OpenCV 3了。另外還改善了Java接口,并且加入了MATLAB支持。
(2)架構調整。圖片、視頻編解碼從highgui模塊分離出來,組成了imgcodecs和videoio。原先的OpenCL模塊ocl事實上與其 它模塊融為一體,而CUDA加速模塊gpu分解成了數個以cuda開頭的模塊。此外,除了官方支持的OpenCV代碼,還有一些自發貢獻的內容、不穩定的 內容,或者版權尚存爭議的內容,都放到了新的倉庫opencv_contrib中。
(3)更多新算法。新版本包括了TLD、魚眼鏡頭模型等全新算法,還包括了一些更高層次可以直接拿來用的高級封裝,比如汽車檢測等。
(4)引入T-API,使OpenCL加速更容易。目前可以參考OpenCV源代碼中T-API的范例。可以發現,開啟和關閉OpenCL加速,只需要一個語句就夠了。這也就是為什么ocl模塊會消失了吧。
(5)更多指令集優化。除了之前為Intel CPU做的優化以外,OpenCV 3還容納了ARM平臺NEON指令集的支持。通過英特爾的幫助,OpenCV 3對x86和x64平臺默認使用IPP。下圖是OpenCV3.0中部分函數得到加速的示意圖。
下面主要介紹OpenCV3.0版本的東西。
OpenCV3.0的sources文件結構:
(1)3rdparty/,包含第三方的庫,比如視頻解碼用的 ffmpeg,jpg、png、tiff等圖片的開源解碼庫。
(2)apps/,包含進行 haar 分類器訓練的工具,opencv 進行人臉檢測便是基于 haar 分類器。如果你想檢測人臉以外的圖片,千萬不要錯過這幾個工具。
(3)cmake/,包含生成工程項目時 cmake 的依賴文件,用于智能搜索第三方庫,普通開發者不需要關心這個文件夾的內容。
(4)data/,包含 opencv 庫以及范例中用到的資源文件,haar 物體檢測的分類器位于haarcascades子文件中。
(5)doc/,包含生成文檔所需的源文件以及輔助腳本。
(6)include/,包含入口頭文件。opencv 子文件夾中是 C 語言風格的API,也就是《Learning OpenCV (第一版)》中描述的API函數,官方將逐漸淘汰 C 風格函數,因此我不推薦大家使用該文件夾中的頭文件。opencv2 子文件中只有一個 opencv.hpp 文件,這是 cv2 以及 cv3 推薦使用的頭文件。
(7)modules/,包含核心代碼,opencv 真正的代碼都在這個文件夾中。opencv 從2.0開始以模塊的方式組織各種功能,近兩年模塊的數量增長得很快,后面我會依次介紹每個模塊的作用。
(8)platforms/,包含交叉編譯所需的工具鏈以及額外的代碼,交叉編譯指的是在一個操作系統中編譯供另一個系統使用的文件。
(9)samples/,范例文件夾。
常用模塊介紹:
(1)androidcamera/,僅用于android平臺,使得可以通過與其他平臺相同的接口來控制android設備的相機。
(2)core/,核心功能模塊,定義了基本的數據結構,包括最重要的 Mat 類、XML 讀寫、opengl三維渲染等。
(3)imgproc/,全稱為 image processing,即圖像處理。包括圖像濾波、集合圖像變換、直方圖計算、形狀描述子等。圖像處理是計算機視覺的重要工具。
(4)imgcodec/,負責各種格式的圖片的讀寫,這個模塊是從以前的 highgui 中剝離的。
(5)highgui/,高級圖形界面及與 QT 框架的整合。
(6)video/,視頻分析模塊。包括背景提取、光流跟蹤、卡爾曼濾波等,做視頻監控的讀者會經常使用這個模塊。
(7)videoio/,負責視頻文件的讀寫,也包括攝像頭、Kinect 等的輸入。
(8)calib3d/,相機標定以及三維重建。相機標定用于去除相機自身缺陷導致的畫面形變,還原真實的場景,確保計算的準確性。三維重建通常用在雙目視覺(立體視覺),即兩個標定后的攝像頭觀察同一個場景,通過計算兩幅畫面中的相關性來估算像素的深度。
(9)features2d/,包含 2D 特征值檢測的框架。包含各種特征值檢測器及描述子,例如 FAST、MSER、OBRB、BRISK等。各類特征值擁有統一的算法接口,因此在不影響程序邏輯的情況下可以進行替換。
(10)objdetect/,物體檢測模塊。包括haar分類器、SVM檢測器及文字檢測。
(11)ml/,全稱為 Machine Learning,即機器學習。包括統計模型、K最近鄰、支持向量機、決策樹、神經網絡等經典的機器學習算法。
(12)flann/,用于在多維空間內聚類及搜索的近似算法,做圖像檢索的讀者對它不會陌生。
(13)photo/,計算攝影學。包括圖像修補、去噪、HDR成像、非真實感渲染等。如果讀者想實現Photoshop的高級功能,那么這個模塊必不可少。
(14)stitching/,圖像拼接,可用于制作全景圖。
(15)nonfree/,受專利保護的算法。包含SIFT和SURF,從功能上來說這兩個算法屬于features2d模塊的,但由于它們都是受專利保護的,想在項目中可能需要專利方的許可。
(16)shape/,形狀匹配算法模塊。用于描述形狀、比較形狀。
(17)softcascade/,另一種物體檢測算法,Soft Cascade 分類器。包含檢測模塊和訓練模塊。
(18)superres/,全稱為 Super Resolution,用于增強圖像的分辨率。
(19)videostab/,全稱為 Video Stabilization,用于解決相機移動時拍攝的視頻不夠穩定的問題。
(20)viz/,三維可視化模塊。可以認為這個模塊實現了一個簡單的三維可視化引擎,有各種UI控件和鍵盤、鼠標交互方式。底層實現基于 VTK 這個第三方庫。
Cuda加速模塊,cuda 是顯卡制造商 NVIDIA 推出的通用計算語言,在cv3中有大量的模塊已經被移植到了cuda 語言。
(1)cuda/,CUDA-加速的計算機視覺算法,包括數據結構 cuda::GpuMat、 基于cuda的相機標定及三維重建等。
(2)cudaarithm/,CUDA-加速的矩陣運算模塊。
(3)cudabgsegm/,CUDA-加速的背景分割模塊,通常用于視頻監控。
(4)cudacodec/,CUDA-加速的視頻編碼與解碼。
(5)cudafeatures2d/,CUDA-加速的特征檢測與描述模塊,與features2d/模塊功能類似。
(6)cudafilters/,CUDA-加速的圖像濾波。
(7)cudaimgproc/,CUDA-加速的圖像處理算法,包含直方圖計算、霍夫變換等。
(8)cudaoptflow/,CUDA-加速的光流檢測算法。
(9)cudastereo/,CUDA-加速的立體視覺匹配算法。
(10)cudawarping/,實現了 CUDA-加速的快速圖像變換,包括透視變換、旋轉、改變尺寸等。
(11)cudaev/,實現 CUDA 版本的核心功能,類似 core/ 模塊中的基礎算法。
4、在VS2013中配置使用OpenCV
了解了OpenCV 的數據結構和功能后,下面介紹OpenCV 的配置,Win7 64 + VSW2013 + OpenCV3.0步驟。
(1)下載安裝OpenCV 3.0。下載地址:https://opencv.org/releases/。
(2)配置環境變量:計算機屬性->高級系統設置->環境變量->Path->變量值。
(3)配置VS2013。首先打開VS2013建立一個Win32控制臺項目。然后,在“項目->工程屬性->vc++目錄”中,加入包含目錄
..opencvuildinclude; ..opencvuildincludeopencv;
..opencvuildincludeopencv2。(..代表opencv安裝的文件夾目錄)
加入庫目錄..opencvuildx64vc12lib。
“項目->工程屬性->鏈接器->輸入->附加依賴”中添加附加依賴項。
opencv_ts300d.lib;opencv_world300d.lib
配置完成后,就可以在VS2013中使用OpenCV3.0中的函數了。
5、在VS2013中簡單的調用OpenCV
經過以上的基礎知識介紹后,就可以進行入門的實踐了。在上面配置完成的工程中,來顯示一幅幅圖片,驗證一下是否成功。
在解決方案資源管理器中,打開源文件main.cpp(沒有可以自己創建),添加以下代碼
#include
using namespace cv;
int main(){
Mat src = imread("lena.jpg"); //圖片必須添加到工程目錄下
imshow("src ", src);
waitKey();
}
然后點擊本地Windows調試器,或者按F5運行程序,程序啟動后就可以顯示這張圖像了,如下:
6、總結
本文簡單的介紹了OpenCV的起源和應用領域,以及基本數據結構和組成,可以作為OpenCV開發的一般入門指導。希望能對大家有所幫助。
-
人工智能
+關注
關注
1791文章
46896瀏覽量
237670 -
計算機視覺
+關注
關注
8文章
1696瀏覽量
45930 -
OpenCV
+關注
關注
30文章
628瀏覽量
41274
原文標題:計算機視覺軟件庫OpenCV的開發基礎介紹
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論