杜聰
摘 要:用C、C++、Java等計算機語言編一個圖像識別程序,常常需要借助一些圖像處理的工具庫,OpenCV就是其中之一,使用OpenCV要比使用計算機應用軟件困難,需要前期復雜的準備工作,如果了解了OpenCV與其他圖像處理應用軟件的區(qū)別、學習OpenCV的基礎、運行環(huán)境、圖像操作原理以及OpenCV文檔包含的內容,學習和使用OpenCV就會容易很多。
關鍵詞:圖像處理 OpenCV C C++
中圖分類號:TP31 文獻標識碼:A 文章編號:1672-3791(2016)10(a)-0007-02
圖像識別技術已經(jīng)應用到生活中的許多方面。文字識別系統(tǒng),直接把圖片上的文字掃描成文本文檔格式。人臉識別技術已經(jīng)用到了智能手機之中,現(xiàn)在的手機解鎖可以直接使用人臉識別。指文圖像識別的應用更為廣泛,如辦理身份證、入學考試、駕照等用來確認身份。百度、Google、蘋果等公司研究的無人駕駛汽車,將該技術用于對障礙物、路標、行人及其他車輛的判斷。道路交通監(jiān)控系統(tǒng)中,系統(tǒng)自動檢索違規(guī)車輛,并對車輛的車牌等信息進行識別。通過車牌提取、圖像預處理、特征提取、車牌字符識別等技術,識別車輛牌號,目前,字母和數(shù)字的識別率可達96%,漢字的識別率可達95% [1-2]。所有的這些都用到了圖像識別功能,要編寫圖像識別程序使用OpenCV是一個不錯的選擇。
1 OpenCV簡介
OpenCV是Intel公司于1999年推出的一種面向圖像處理的開源計算機視覺庫,其中,OpenCV是Open Source Computer Vision Library的縮寫,如今由Willow Garage提供支持,其中包括了3個版本OpenCV1、OpenCV2、OpenCV3,除了OpenCV1現(xiàn)在很少使用外,其他兩個版本已經(jīng)有了很多改進的版本。OpenCV有開源的函數(shù)庫,可以滿足不同領域的圖像處理需求,使用時以函數(shù)調用的形式提供給用戶,也可以對其代碼進行改進,便于用戶實驗教學或程序開發(fā)使用。
2 OpenCV的特點
(1)開源。OpenCV是一個開源的圖像處理函數(shù)庫,無論是商業(yè)應用,還是做科學研究,完全是免費的,與Linux類似它的源代碼也是公開的,這樣程序的安全性就得到保障,OpenCV的函數(shù)庫是用C語言和C++語言進行編寫的,源代碼可讀性比較高,發(fā)現(xiàn)其中不足之處可以自行進行修改,避免編譯后的可執(zhí)行文件出現(xiàn)漏洞。
(2)跨平臺。OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Windows、Linux、Mac OS和嵌入式等操作系統(tǒng)上[3]。
(3)應用領域廣。OpenCV圖像處理可以使用到多個領域當中,包括生物醫(yī)學、工業(yè)、軍事安防、機器視覺、航空航天等。目前已知OpenCV編程系統(tǒng)在航空航天定位、衛(wèi)星地圖繪制、工廠大規(guī)模生產(chǎn)視覺檢測等方面得到了廣泛的應用,同時對于無人飛行器的視覺捕捉技術也有極大的幫助[4]。
(4)支持多種語言進行開發(fā)。OpenCV中包括了多種編程語言的接口,其中支持的編程語言包括C、C++、C#、Java、Python等。
3 OpenCV與圖像處理應用軟件
在計算機學習中也會學到一些其他的圖像處理軟件,如Photo Shop、Windows畫圖工具等在計算機中使用的圖像處理工具。在手機中有一個比較流行的軟件,在拍好照片后可以對個人照片進行智能美化,這些軟件都是應用軟件缺少編程需要的接口,這些軟件處理圖像后只是給出結果,無法取到程序處理所需要的中間參數(shù),只能局限于最后的結果展示,如果只是單純的圖像制作, Photo Shop類的圖像處理工具已經(jīng)足夠了。但是對于圖像識別、機器視覺等,需要對圖像內容做出判斷,用類似于Photo Shop這樣的圖像處理軟件就無法完成了,因為無法集成到所編寫的程序當中。OpenCV是一個圖像處理函數(shù)庫,其中包涵了對于計算機操作系統(tǒng)和計算機語言編譯平臺支持的API接口以及源碼庫,可以在編寫的程序中去處理圖像,不但可以得到圖像處理后的結果,還可以對圖像中間的處理過程進行控制,可以對圖像中的內容用自己編寫的程序代碼進行判定,實現(xiàn)識別操作。
4 學習OpenCV的基礎
C和C++語言在工科類專業(yè)中一般設置必修課程,C語言常作為一門基礎的編程語言來教,有的學生覺得C比較容易,有的學生感覺比較難,這個取決于每個人對計算機語言的理解能力與對計算機語言的興趣,C和C++的區(qū)別在于C++增加了類,支持面向對象編程。新版OpenCV函數(shù)庫是基于C++的,打開源代碼的文件夾可以看到許多以.cpp結尾的C++代碼文件,所以對于C和C++的掌握情況直接關系到對OpenCV的學習。
5 OpenCV的運行環(huán)境
在學習每種計算機語言之前都要對每種計算機語言的IDE(Integrated Development Environment,集成開發(fā)環(huán)境)進行安裝和配置,集成開發(fā)環(huán)境不只是用來編輯程序代碼,還包括了對代碼的編譯、調試與運行等。如Java語言,在Windows操作系統(tǒng)中Java語言最簡單的編輯環(huán)境是記事本,對于Java的編譯與運行需要用到命令窗調用所安裝JDK(Java Development Kit,Java開發(fā)包)中的編譯程序與運行環(huán)境,如果是集成的IDE,如Eclipse、MyEclipse等,點擊IDE上的運行或是調試按鈕,就可以在IDE中的結果輸出窗口上直接查看運行結果。OpenCV是用C和C++語言所編寫的圖像處理函數(shù)庫,它沒有自己獨立的IDE,所以它需要借助其他編程語言的IDE進行編寫和調用,如Microsoft Visual Studio、QT Creator等。
配置開發(fā)環(huán)境是學習OpenCV中重要的一步,但是這個過程相對于初學者來說有些復雜。首先,要從網(wǎng)上下載并安裝計算機語言的開發(fā)環(huán)境,如微軟的Visual Studio、QT集成開發(fā)環(huán)境等。其次,下載并安裝OpenCV的安裝包,安裝OpenCV是一個解壓的過程。下一步,就是對開發(fā)環(huán)境的配置,其中要對系統(tǒng)變量、包含目錄、附加依賴項進行配置。然后進行調試運行。在對開發(fā)環(huán)境配置時,為保證OpenCV庫與本地開發(fā)環(huán)境兼容性更好,最好使用CMaker(Cross Platform Make)在本地環(huán)境中對OpenCV源代碼重新編譯。
6 OpenCV中的Hello World
在學習C或是java語言時,常常會有一個重要的標志就是‘Hello World!,標志著系統(tǒng)配置完成并且整個IDE環(huán)境運行正常,編譯系統(tǒng)成功的編譯了所寫的代碼,并且在操作系統(tǒng)中執(zhí)行成功。OpenCV中這個標志有所不同,它的‘Hello World!是在IDE中編寫好代碼后,調用OpenCV中的函數(shù)打開一幅代碼中指定的圖片并顯示到新建的窗口中,標志著IDE中的參數(shù)是正確的,這是進行圖像操作的重要一步。
7 OpenCV圖像像素操作
對于數(shù)值的計算是第一步一般輸出一個結果,在學任何一門計算機語言時會有一個很好的例子“計算器”,那圖像如何去表示?其實圖像是多個結果的一個集合,就像在C語言中打出星號所組成的菱形,每一個星號可以比喻成一個圖像中的像素點。對于圖像處理過程中常常見到的有3種:第一種,RGB圖像,彩色的圖像,每個像素點由3個數(shù)值表示。第二種,灰度圖像,像以前的黑白電視機,每個像素點由一個數(shù)值就可以表示。第三種,二值圖像,每個像素點由一個數(shù)值表示。在OpenCV中有多種方法可以對圖像進行操作,其中比較方便的就是利用cv::Mat類,對圖像進行打開、顯示、修改和保存,這也是進行圖像操作的重要一步。
8 OpenCV的文檔
大家在OpenCV官網(wǎng)提供的文檔中可以得到更多幫助。在OpenCV的文檔中包括了對組件結構的介紹,了解OpenCV的組件結構對學習OpenCV是十分有利的,該介紹包括了一系列的動態(tài)或靜態(tài)庫,如矩陣數(shù)組的定義、圖像處理模塊包含的內容、視頻分析所需要的算法、基本的多視覺算法、外部特征的檢測類、物體的檢測類、UI類的使用、圖像算法的硬件加速等,在編寫代碼時可以查找其類中對象所包含成員和方法。一些OpenCV圖書所帶的光盤中或互聯(lián)網(wǎng)上網(wǎng)友提供的圖像處理代碼,由于編程使用的操作系統(tǒng)或編譯環(huán)境不同,有些代碼會包含未知的頭文件或者缺少頭文件,代碼本身并沒有錯誤,但總是編譯出錯,了解了這些知識后在編程時,有利于定位在程序中所引用的文件所屬的位置,從而有效地處理文件引用出現(xiàn)的問題。
無論對什么樣的物體進行識別,圖像識別過程基本是不變的,包括:圖像預處理、圖像分割,特征提取、判斷匹配、輸出結果。圖像預處理中會用到圖像的灰度化、圖像的二值化、去除圖像的噪聲等算法。特征提取中會用到圖像變換、圖像邊緣檢測等算法。判斷匹配中用到直方圖、投影等算法。圖像分割有3種:基于閾值的分割、基于區(qū)域分割、基于邊緣的分割[5]。在OpenCV的文檔中都詳細提供了基本算法類的定義與方法,通過OpenCV的代碼庫中的基本算法類或幾個基本算法類的組合可以實現(xiàn)以上所列算法的所有功能。
9 結語
據(jù)統(tǒng)計,一個人獲取的信息大約有75%來自視覺 [6]。在工業(yè)4.0的時代里機器也需要有自己的視覺系統(tǒng),基于圖像處理的機器視覺在人工智能領域會得到更廣泛的應用,如:無人駕駛汽車、智能機器人、智能安防系統(tǒng)等。OpenCV是一個進入這些行業(yè)的重要工具之一,圖像處理的學習過程是一個循序漸進的過程,希望學習者在OpenCV的基礎上提高對于圖像處理的認識及對圖像處理的技術水平。
參考文獻
[1] 姚楠,耿奇.基于MATLAB GUI 的車牌自動識別系統(tǒng)設計[J].軟件,2016,37(3):44-46.
[2] 李珊珊,劉純.基于FPGA 車牌識別系統(tǒng)的設計與實現(xiàn)[J].軟件,2012,33(3):72-74.
[3] (加)Robert Laganière,著.OpenCV計算機視覺編程攻略[M].2版.相銀初,譯.北京:人民郵電出版社,2015.
[4] 陳雪嬌.基于OpenCV的計算機視覺技術研究[J].電腦知識與技術,2015(30):137-138,141.
[5] 張家怡.圖像識別的技術現(xiàn)狀和發(fā)展趨勢[J].電腦知識與技術,2010(21):6045-6046.
[6] 賈永紅.數(shù)字圖像處理[M].武漢:武漢大學出版社,2003:1.