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