王嘉鑫+鄒科文+陳義明
摘要摘要:人臉識(shí)別技術(shù)是當(dāng)前人工智能中較為熱門的一個(gè)分支,已經(jīng)有許多開源的視覺(jué)庫(kù)為其奠定了良好基礎(chǔ),如OpenCV等,然而OpenCV在Java環(huán)境下有諸多不便。為了解決這一問(wèn)題,介紹了JNI技術(shù),以及在Java環(huán)境下,如何通過(guò)JNI調(diào)用OpenCV庫(kù)實(shí)現(xiàn)人臉與微笑檢測(cè)。實(shí)驗(yàn)結(jié)果表明,將JNI應(yīng)用于Java虛擬機(jī)的人臉檢測(cè),可獲得更高的人臉檢測(cè)速度。
關(guān)鍵詞關(guān)鍵詞:OpenCV;人臉檢測(cè);微笑檢測(cè);JNI
DOIDOI:10.11907/rjdk.162330
中圖分類號(hào):TP319文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):16727800(2017)001011502
隨著人工智能技術(shù)的發(fā)展,機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺(jué)等領(lǐng)域也逐漸成為計(jì)算機(jī)科學(xué)中的熱點(diǎn)問(wèn)題,人臉檢測(cè)便是計(jì)算機(jī)視覺(jué)中的一個(gè)分支。OpenCV作為一個(gè)開源的視覺(jué)庫(kù),提供了不少關(guān)于人臉檢測(cè)的模型與處理接口,而大部分接口與算法均采用C/C++語(yǔ)言編寫。Java雖有其跨平臺(tái)的巨大優(yōu)勢(shì),但是這種特性也給Java帶來(lái)了局限性,在調(diào)用動(dòng)態(tài)數(shù)據(jù)庫(kù)文件時(shí)存在不便。因此,通過(guò)JNI工具,可以利用C/C++語(yǔ)言的特性彌補(bǔ)Java的不足[13]。
1相關(guān)技術(shù)原理
1.1JNI技術(shù)分析
JNI(Java Native Interface)提供了若干API 實(shí)現(xiàn)Java與其它語(yǔ)言的通信(主要是C/C++)。從Java 1.1開始,JNI標(biāo)準(zhǔn)成為Java平臺(tái)的一部分,它允許Java和其它語(yǔ)言編寫的代碼進(jìn)行交互。然而使用Java與本地已編譯的代碼交互,通常會(huì)喪失平臺(tái)可移植性[45]。
通常遇到以下幾種情況需要使用JNI:①所開發(fā)的程序需要用到其它平臺(tái)屬性,但在Java的標(biāo)準(zhǔn)庫(kù)中不支持此屬性;②程序?qū)τ谶\(yùn)行效率要求較高,因此希望能用較低級(jí)的語(yǔ)言(如C/C++)來(lái)實(shí)現(xiàn);③Java已經(jīng)擁有實(shí)現(xiàn)需要的程序和庫(kù),希望C/C++對(duì)其直接進(jìn)行調(diào)用[67]。
1.2JNI技術(shù)架構(gòu)
JNI允許運(yùn)行在Java虛擬機(jī)上的應(yīng)用程序調(diào)用其它語(yǔ)言(如C/C++語(yǔ)言)來(lái)編寫需要的方法或類庫(kù),也能將Java虛擬機(jī)嵌入到本地應(yīng)用程序中。
圖1是JNI在本地應(yīng)用程序與Java應(yīng)用之間各自扮演的角色圖。從圖中可以看出,JNI作為Java與C/C++函數(shù)庫(kù)之間的橋梁,可以實(shí)現(xiàn)Java代碼與C/C++庫(kù)函數(shù)當(dāng)中本地代碼之間的交互。然而JNI沒(méi)有改變Java語(yǔ)言的屬性,只是讓Java語(yǔ)言擁有一種能夠?qū)ν庹{(diào)用的形式[89]。
1.3OpenCV介紹
OpenCV(Open Source Computer Vision Library)是一個(gè)基于BSD許可發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù)。它輕量而且高效,由C函數(shù)與C++類構(gòu)成,同時(shí)提供了Python、Java等語(yǔ)言的接口,可實(shí)現(xiàn)圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。OpenCV中對(duì)于人臉的檢測(cè)方法是基于處理成的灰度圖像的弱特征檢測(cè)方法。該方法建立在Haar特征[10]檢測(cè)方法基礎(chǔ)上,可以獲得檢測(cè)人臉的實(shí)時(shí)處理速度。
OpenCV中也提供了訓(xùn)練分類器[1112]的程序及方法來(lái)檢測(cè)特征。使用者可以將此方法應(yīng)用于一些項(xiàng)目中的二次開發(fā),比如雙目視覺(jué)的三維重構(gòu)、物體識(shí)別,協(xié)助機(jī)器人完成復(fù)雜任務(wù),以及在智能監(jiān)控中的人臉檢測(cè)、智能交通中的行人檢測(cè)等。
2開發(fā)工具選擇
選用的工具是eclipse,Java版本為JDK1.7,C++使用的是VS2010。另外PC端需要具備內(nèi)置或外置攝像頭,PC機(jī)配置為Inter Core i5-3230M CPU 2.6GHz。
3實(shí)現(xiàn)過(guò)程
從圖2中編寫JNI代碼的大致步驟可以看出Java需要將字節(jié)碼文件通過(guò)javah生成頭文件,再與C代碼共同生成動(dòng)態(tài)鏈接庫(kù),進(jìn)而與Java中的代碼進(jìn)行交互。
3.4人臉檢測(cè)實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)結(jié)果如圖3以及表1所示,Java捕獲的圖像上會(huì)圈出特征檢測(cè)出的人臉,并在控制臺(tái)輸出人臉的X、Y坐標(biāo)以及微笑值。微笑值越高代表被檢測(cè)的人臉表情越開心。表2使用JNI檢測(cè)明顯比單獨(dú)從Java視頻流中獲取圖像檢測(cè)人臉?biāo)俣雀?。因此,將JNI應(yīng)用于Java虛擬機(jī)的人臉檢測(cè)中,可以幫助后臺(tái)進(jìn)行高效的圖片信息處理。
第1期 侯賀,馬林,鄭偉:基于大數(shù)據(jù)的微課評(píng)價(jià)模型研究軟 件 導(dǎo) 刊2017年標(biāo)題