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