OpenCV簡(jiǎn)介
開放源代碼的計(jì)算機(jī)視覺(jué)類庫(kù)OpenCV由英特爾公司位于俄羅斯的研究實(shí)驗(yàn)室開發(fā),它是一套可以免費(fèi)獲得的由一些C函數(shù)和C++類所組成的庫(kù),用來(lái)實(shí)現(xiàn)常用的圖像處理以及計(jì)算機(jī)視覺(jué)算法。與英特爾公司所開發(fā)的另外一個(gè)圖像處理庫(kù)IPL相比,OpenCV主要針對(duì)圖像的一些高級(jí)處理,例如目標(biāo)分割、運(yùn)動(dòng)分析與跟蹤、特征檢測(cè)以及三維重建等。
OpenCV的特點(diǎn)
OpenCV是開發(fā)的C源碼,基于Intel處理器指令集開發(fā)的優(yōu)化代碼,具有統(tǒng)一的結(jié)構(gòu)以及功能定義、強(qiáng)大的矩陣計(jì)算能力、方便靈活的接口,而且同時(shí)支持windows、linux和MacOS平臺(tái)等。
*開放的源代碼,對(duì)個(gè)人以及商業(yè)的開發(fā)完全是免費(fèi)的;
*支持大多數(shù)的C和C++編譯器,可以在不同的平臺(tái)之間進(jìn)行移植,例如:VC++6.0、VC.NET2005、VC.NET2008以及C++Builder等;
*可移植,跨平臺(tái)性好,可以在windows,linux和MacOS平臺(tái)上運(yùn)行;
*OpenCV所有的算法都是基于封裝于IPL的具有高靈活性的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),并且有一半以上的函數(shù)在設(shè)計(jì)與匯編時(shí)針對(duì)Intel處理器指令集將代碼進(jìn)行了優(yōu)化;
*具有強(qiáng)大的圖像以及矩陣的計(jì)算能力,大大減少了開發(fā)者的工作量,有效提高了程序開發(fā)的效率以及程序運(yùn)行的可靠性;
*具有方便靈活的接口,包含了300多個(gè)C/C++函數(shù),代碼效率高;支持高層API;可以獨(dú)立使用,也可以使用外部庫(kù)。
OpenCV的模塊
本文采用的是OpenCV2.4版本,包括以下幾個(gè)模塊,具體功能是:
*CV模塊:它是主要的OpenCV函數(shù),包括圖像處理、運(yùn)動(dòng)分析與對(duì)象跟蹤、結(jié)構(gòu)分析、模式識(shí)別、相機(jī)標(biāo)定以及三維重建等;
*CVAUX模塊:包括一些三維跟蹤、PCA、HMM等函數(shù);
*CXCORE模塊:該庫(kù)包括了所有OpenCV運(yùn)行時(shí)的一些最基本的數(shù)據(jù)結(jié)構(gòu)、矩陣、數(shù)組的基本運(yùn)算,包括出錯(cuò)處理的一些基本函數(shù);
*ML模塊:機(jī)器學(xué)習(xí)庫(kù),包括一些用于分類、回歸和數(shù)據(jù)聚類的類和函數(shù);
*HIGHGUI模塊:圖像界面函數(shù),包括圖像用戶窗口GUI,圖像視頻I/O,系統(tǒng)調(diào)用函數(shù)等。
數(shù)據(jù)存取方式
OpenCV數(shù)據(jù)的存取方式有三種:間接存取、直接存取、帶指針直接存取。第一種速度較慢,后兩種速度較快。下面對(duì)帶指針直接存取的方式進(jìn)行介紹。
假定圖像定義為IplImage*img,不同類型的圖像元素存取方式為:
8位單通道的圖像,像素I(i,j)存取操作為:
intstep=img-》widthStep/sizeof(uchar);
uchar*data=(uchar*)img-》imageData;I(i,j)~data[i*step+j];
8位3通道的圖像,像素I(i,j)存取操作為:
intstep=img-》widthStep/sizeof(uchar);
intchannels=img-》nChannels;
uchar*data=(uchar*)img-》imageData;
I(i,j)B~data[i*step+j*channels+0];//BLUE分量
I(i,j)G~data[i*step+j*channels+1];
//GREEN分量I(i,j)R~data[i*step+j*channels+2];//RED
? ?OpenCV 在不同編譯環(huán)境下的配置
OpenCV在不同的編譯環(huán)境中必須進(jìn)行正確的配置才能運(yùn)用,但是在不同的編譯環(huán)境中的配置有所不同。
3.1C++BuilderX 環(huán)境下配置
OpenCV 新發(fā)布的版本中取消了對(duì)C++BuilderX 的支持,但是仍然有一個(gè)腳本文件utils\gen_make.py 可以通過(guò)生成文件makfle.bce‘s 來(lái)編譯。本文介紹通過(guò)轉(zhuǎn)換靜態(tài)鏈接庫(kù)的方法在C++BuilderX 環(huán)境下進(jìn)行配置。
OpenCV 的庫(kù)在MSVC 中可以直接使用,但是在BCB環(huán)境下不能直接使用。必須進(jìn)行轉(zhuǎn)換。在BCB 安裝目錄的Bin 目錄下的coff2omf.exe 文件,可以將MSVC 的靜態(tài)庫(kù)轉(zhuǎn)換成C++BuilderX 類的靜態(tài)庫(kù)。具體方法為:
[path ]MSV C 庫(kù)文件(*.lib) [path:]C++Builder 庫(kù)文件(*.lib)coff2omf
接著對(duì)OpenCV 進(jìn)行環(huán)境配置。打開BCB,選擇菜單Project 中的Options,在對(duì)話框中選擇Directories/Conditionals 標(biāo)簽,在Inc lude Path 中添加OpenCV 的頭文件所在的路徑。P ]時(shí)在LibraryPath中添加用上述方法轉(zhuǎn)換而來(lái)的靜態(tài)鏈接文件的路徑。
最后在C++Builder工程中加入OpenCV的庫(kù)文件。選擇菜單View中的ProjectManager,選擇Add添加用上述方法轉(zhuǎn)換而來(lái)的靜態(tài)連接文件。這樣就完成了再C++BuilderX環(huán)境下配置工作。
3.2 MSVC++6.0 環(huán)境下配置周
首先需要在安裝OpenCV時(shí)將其加入到系統(tǒng)變量中。然后配置MSVC++6.0,點(diǎn)擊菜單Tools-》Options-》Directories,先設(shè)置lib 路徑,選擇Library files,在下方填入路徑--OpenCV \lib; 然后選擇Include fles,在下方填入路徑:---OpenCV \excore \include;--\OpenCV \er\ inelude;--\OpenCV \evaux\ inelude---\OpenCV \ml\ in lude;--OpenCV \otheribshighgui 市后需要對(duì)每個(gè)創(chuàng)建的工程進(jìn)行項(xiàng)目配置,點(diǎn)擊菜單:Proect-+Settings,然后將Settingfor 選為All Configurations,然后選擇右邊link標(biāo)簽,在Object/ library modules 附加上excore.lib,cv.lib,ml.lib,evaux.lib,highgui.lib。過(guò)樣就可在MSVC++6.0 環(huán)境下運(yùn)用OpenCV 了。
3.3 VS.NET環(huán)境下的配置
打開.NET環(huán)境,選擇“項(xiàng)目“-》屬性,選擇“C/C ++”-》常規(guī)-》附加包含日錄,在其中加入下面路徑:.OpenCVinclude.。.OpenCVotheibhgh-gui然后選擇“鏈接器“-》常規(guī)-》附加庫(kù)目錄,在附加庫(kù)目錄中加入如下路徑:。-\0penCVlib;最后選擇“鏈接器“-》輸入-》附加依賴項(xiàng),加入如下幾項(xiàng):ev.lib,highgui.lib.經(jīng)過(guò)上述配置可以在.NET 環(huán)境中使用OpenCV 相函數(shù)了。
? 運(yùn)用OpenCV處理圖像舉例
下面例舉幾個(gè)實(shí)例說(shuō)明OpenCV在數(shù)字圖像處理中的實(shí)際運(yùn)用。這些實(shí)例均在BorlandC++6.0環(huán)境中實(shí)現(xiàn)。
4.1困像的載入
在處理圖像之前,首先要做的就是讀取圖像的相關(guān)信息,運(yùn)用OpenCV的函教,可以方便地讀入和顯示圖片,代碼如下:
Illmage *img = ,,loadlmae(”lenajpg“.0;
evNamedW indow(”O(jiān)riginal“.0;
cvShowlmage(”O(jiān)riginal.img
《 wWaitKey(0);
第一句功能為讀入圖像;第二句功能為建立一個(gè)名字為“Original”的窗口,“O”表示窗口大小由系統(tǒng)自動(dòng)給定;第三句功能是將圖像在“Original“窗口中顯示;第四句功能為延遲窗口顯示時(shí)間。按回車鍵會(huì)關(guān)閉,但是如果沒(méi)有這一句,用像會(huì)一閃之后馬上消失,則會(huì)觀察不到具體的圖像,如圖1所示,
4.2 圖像邊緣檢測(cè)
邊緣檢測(cè)是圖像處理和計(jì)算機(jī)視覺(jué)中的基本問(wèn)題,常用的邊緣檢測(cè)經(jīng)典算子有Roberts算子、Prewitt 算子、Sobel 算子、拉普拉斯算子和Camny 算子。OpenCV 提供了evSobel 函數(shù)、evLaplace 函數(shù)、evCamny函數(shù)進(jìn)行邊緣檢測(cè)。下面以cvCanny函數(shù)進(jìn)行舉例。在上節(jié)中圖像載入的基礎(chǔ)上,其邊緣檢測(cè)的代碼為:
Ipllmage *result_img = cvCreatelmage(cvSize(img-》w idth,img-》height),IPL._DEPTH_8U,1);
cvCanny img.result_img.threshold 1,threshold2);
cv NamedW indow(”Result“,0);
cvShow Image(”Result“,result_img);
第一句功能是創(chuàng)建一副與img同樣大小、通道數(shù)為1的用像;第二句的功能為對(duì)圖像進(jìn)行邊緣檢測(cè),threshold1與threshold2中的小園值用來(lái)控制邊緣檢測(cè),大國(guó)值用來(lái)控制強(qiáng)邊緣的初始化分割,最后結(jié)果顯示在“resul”窗口中。如圖2所示.
4.3 人臉檢測(cè)定位
人臉檢測(cè)定位技術(shù)是一種比較高級(jí)的應(yīng)用,如果不借助任何集成軟件。需要研究人員進(jìn)行分析編程實(shí)現(xiàn)的話那將是一個(gè)很繁瑣也必將困難的工作。現(xiàn)利用OpenCV中的cvHaarDetectObjects函數(shù)檢測(cè)圖像中的目標(biāo)能快速實(shí)現(xiàn)對(duì)人臉的定位。如圖3所示。
評(píng)論
查看更多