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