公衍宇, 郭 琦 ,于 超
(1.河北工業(yè)大學(xué) 信息工程學(xué)院,天津 300380;2.河北工業(yè)大學(xué) 機(jī)械工程學(xué)院,天津 300380)
Android是Google開發(fā)的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng),本意為“機(jī)器人”。它包括操作系統(tǒng)、用戶界面和應(yīng)用程序——移動(dòng)電話工作所需的全部軟件,而且不存在任何以往阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙。OpenCV于1999年由Intel建立,現(xiàn)在由Willow Garage提供支持。OpenCV是一個(gè)基于BSD許可證授權(quán)(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),可以運(yùn)行在Linux、Windows、Mac OS和Android操作系統(tǒng)上。它輕量級(jí)而且高效——由一系列C函數(shù)和少量C++類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法[1-2]。Android應(yīng)用程序是通過Android SDK(Software Develo-pment Kit)利用Java編程語(yǔ)言進(jìn)行開發(fā)的,此虛擬機(jī)支持JNI,同時(shí)伴隨著Android NDK的發(fā)布,使開發(fā)者利用第三方C/C++庫(kù)協(xié)助編寫Android程序成為可能,如OpenCV庫(kù)便可方便地應(yīng)用在Android系統(tǒng)中[3]。
OpenCV從2.2版本以后支持Android,本設(shè)計(jì)的編譯環(huán)境PC端為ubuntu 10.10,所用OpenCV版本為2.2 1。OpenCV只提供C/C++、Python接口,這就涉及到Java與C/C++混合編程、Java程序與C/C++程序互相調(diào)用的問題,而Android NDK很好地解決了這一問題,它提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和java應(yīng)用一起打包成apk。同時(shí)還集成了交叉編譯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、等差異,開發(fā)人員只需要簡(jiǎn)單修改mk文件 (指出 “哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。
官方提供的Android NDK R4版本對(duì)于有些OpenCV中使用的一些C++概念不支持Cryta x為我們提供了一種支持OpenCV的Android NDK修訂版。本設(shè)計(jì)Android NDK所使用的版本為android-ndk-r4-linux-cry-tax-4在開始編譯安裝OpenCV庫(kù)之前,需要在PC機(jī)Ubuntu操作系統(tǒng)下安裝如:cmake、buid-essential等編譯OpenCV庫(kù)需要用到的工具。在此環(huán)境下編譯并安裝OpenCV庫(kù)。
OpenCV現(xiàn)已官方支持在Android環(huán)境下的開發(fā),OpenCV2.2源文件包中包含一android文件夾,在此文件夾中包括一些官方提供的編譯文件,利用NDK并借助這些編譯文件對(duì)OpenCV源碼進(jìn)行編譯,就可生成適用于在Android環(huán)境下運(yùn)行的靜態(tài)庫(kù)。在編譯之前需要解壓縮android-ndkr4-linux-x86-crytax-4.tar.bz2,完成修訂版本 NDK 的安裝。 進(jìn)入OpenCV2.2內(nèi)的android文件夾下,執(zhí)行 “mkdir build”指令,完成創(chuàng)建build文件夾,然后執(zhí)行 “cd build”指令進(jìn)入build文件夾,隨后執(zhí)行“cmake..”指令生成makefile編譯文件,最后執(zhí)行“make”指令對(duì)其進(jìn)行編譯,編譯完成后將生成OpenCV靜態(tài)庫(kù),用于在Android環(huán)境下基于OpenCV的Android應(yīng)用軟件開發(fā)。
在Android系統(tǒng)下基于OpenCV的人臉檢測(cè)實(shí)現(xiàn)需通過Android NDK工具集將利用JNI編寫的本地代碼組件嵌入到Android應(yīng)用程序中,所以整個(gè)實(shí)現(xiàn)過程分為兩個(gè)步驟首先,通過JNI與OpenCV接口編寫本地C/C++代碼,并利用Android NDK對(duì)其進(jìn)行編譯生成Java可調(diào)用的共享庫(kù),接下來(lái)利用Android應(yīng)用程序框架編寫Java端代碼,最后通過Android SDK生成Android應(yīng)用程序,整體設(shè)計(jì)框架如圖1所示。
圖1 整體設(shè)計(jì)框架Fig.1 Overall design framework
打開 eclipse,新建一個(gè) workspace,在 Window->Preferences中設(shè)置好Android SDK的路徑。然后新建一個(gè)Android項(xiàng)目,Build Target選擇Android2.2,命名為"facedetect",活動(dòng)名改為“facedetect”,Package name 中 填 寫 com.testopencv.facedetect,最后點(diǎn)擊finish。
首先在工程目錄下新建jni文件夾,新建C++源代碼文件并引入此頭文件,編寫函數(shù)實(shí)現(xiàn)代碼。
分類器文件與圖片文件的路徑分別在Java端利用String靜態(tài)變量進(jìn)行存儲(chǔ),在本地代碼端需要得到此String變量的UTF-8形式用來(lái)加載分類器和圖片文件,這就需要通過JNI來(lái)實(shí)現(xiàn)。關(guān)鍵代碼如下:
以上代碼可得到分類器的絕對(duì)路徑,圖片文件的存儲(chǔ)絕對(duì)路徑也可以此方式得到[4]。
人臉檢測(cè)是指在輸入圖像中將人臉從龐雜的背景中提取出來(lái),并返回人臉在圖像中的位置、大小等信息。首先將彩色圖像轉(zhuǎn)換為灰度圖像,然后對(duì)圖像進(jìn)行直方圖均衡化,最后利用分類器對(duì)圖像中某一區(qū)域是否為人臉進(jìn)行檢測(cè)。OpenCV將分類器信息利用xml文件進(jìn)行存儲(chǔ),同時(shí)OpenCV自帶分類器訓(xùn)練程序:haartrfimng.exe,可以使用它來(lái)方便的進(jìn)行haar-like特征分類器的訓(xùn)練。將分類器xm l文件放在Java工程目錄下的asset文件夾內(nèi),當(dāng)安裝應(yīng)用時(shí),利用流操作將此文件寫入sd卡上的指定路徑下,同時(shí)將此途徑存儲(chǔ)在一靜態(tài)變量String,人臉檢測(cè)函數(shù)實(shí)現(xiàn)關(guān)鍵代碼如下:
檢測(cè)到的人臉位置信息將會(huì)存入數(shù)據(jù)類型為vector<RECT>的faces中,最后通過迭代將檢測(cè)到人臉的矩形信息分別換算成空心圓信息存入一個(gè)int數(shù)組,此空心圓信息包括圓心的x坐標(biāo)、y坐標(biāo)以及半徑。
在C/C++端得到人臉位置信息后,需要將此信息傳入Java端進(jìn)行UI更新,這依然需要通過JNI來(lái)完成。在IntentService類中新建一int數(shù)組用來(lái)存放檢測(cè)到的人臉位置信息,當(dāng)本地人臉檢測(cè)操作執(zhí)行完成后對(duì)其進(jìn)更新與讀取,關(guān)鍵代碼如下:
有兩個(gè)腳本文件需要編寫,分別是Android.mk和Application.mk文件。Android.mk文件描述了需要NDK進(jìn)行編譯的源文件,以及所要形成的組件,Application.mk文件描述一些關(guān)于本應(yīng)用的輔助編譯信息,這個(gè)編譯文件是可選的。
在Java工程目錄下的jni文件夾下新建Android.mk文件。 打開此文件,首先定 LOCAL_PATH:=$(call my-dir)”, 用來(lái)定位源代碼文件所在目錄;其次 “include$(CLEAR_VARS)”,用來(lái)清除許多LOCAL_XXX變量,因?yàn)樗芯幾g控制文件都是在一個(gè)GNU Make執(zhí)行上下文中進(jìn)行解析,而此時(shí)所有變量都是全局可見的,所以需要這一操作;由于利用第三方庫(kù)OpenCV協(xié)助開發(fā),需要指定此庫(kù)通過NDK編譯好的靜態(tài)版本的頭文件、靜態(tài)庫(kù)文件的搜索路徑與連接標(biāo)記,所以編寫如下如下6條語(yǔ)句:
最后需說明所要產(chǎn)生的是靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù),由于動(dòng)態(tài)庫(kù)為所需,故編寫如下代碼:
include$(BUILD_SHARED_LIBRARY)
在Java工程目錄下的jni文件夾下新建Application.mk文件,由于需要在ARM-V7構(gòu)架的CPU上運(yùn)行,所以通過定義“APP_ABI:=armeabi-v7a“來(lái)指定。 打開 Cygwin,進(jìn)入本Android工程目錄下的jni文件中,執(zhí)行”$NDK/ndk-build”命令,執(zhí)行完畢后將生成共享文件libface detect.so。
人臉檢測(cè)的實(shí)現(xiàn)充分說明了在Android系統(tǒng)下利用OpenCV進(jìn)行計(jì)算機(jī)視覺研究與開發(fā)的可行性與實(shí)用性,雖然由于Android NDK工具還處于初級(jí)發(fā)展階段,不夠成熟,以及硬件配置的差距,致使最后人臉檢測(cè)操作的運(yùn)行速度相對(duì)較慢,但隨著NDK的發(fā)展,利用其進(jìn)行編譯的本地代碼在Android系統(tǒng)中的運(yùn)行將更加高效,同時(shí)越來(lái)越強(qiáng)大的硬件配置也將給予有力支持。Android系統(tǒng)如今發(fā)展迅速,許多第三方庫(kù)現(xiàn)已提供Android通用編程接口,這為Android應(yīng)用軟件開發(fā)人員提供極大的便利,OpenCV也會(huì)在下一版本提供此接口,但對(duì)于計(jì)算機(jī)視覺算法研究人員以及對(duì)軟件深度開發(fā)人員來(lái)說,利用JNI編寫本地代碼,NDK編譯本地代碼的方式還是必須的,并且這一方式也更加靈活。
[1]Gray Bradski,Adrian Kaebler.Learning OpenCV:Computer Vision with the OpenCV Library[M].USA:O Reilly media,2008.
[2]Willow Garage.OpenCV wiki[EB/OL].[2012-05](2012-07).http://opencv.willowgarage.com/wiki/Welcome.
[3]Google.Android Guide[EB/OL].[2012-02](2012-07).http://developer.android.com/guide/index.htm l.
[4]張瑩,李勇平,敖新宇.基于OpenCV的通用人臉檢測(cè)模塊設(shè)計(jì)[J].計(jì)算機(jī)工程與科學(xué),2011(1):97-101.ZHANG Ying,LI Yong-ping,AO Xin-yu.Common face detection module design based on OpenCV[J].Computer Eng ineering and Science,2011(1):97-101.
[5]韓露,李祖樞,陳東義.一種Java與OpenCV結(jié)合實(shí)現(xiàn)的目標(biāo)檢測(cè)模塊[J].計(jì)算機(jī)應(yīng)用,2008(3):773-775.HAN Lu,LI Zu-shu,CHEN Dong-yi.A Java and OpenCV combination of the goal detection module[J].Computer Applications,2008(3):773-775.
[6]任俊偉,林東岱.JNI技術(shù)實(shí)現(xiàn)跨平臺(tái)開發(fā)的研究[J].計(jì)算機(jī)應(yīng)用研究,2005(7):180-184.REN Jun-wei,LIN Dong-dai.JNI technology to achieve crossplatform development[J].Computer Applications Research,2005(7):180-184.
[7]陳勇飛,劉新明.基于膚色和類Harr特征的人臉圖像的人臉檢測(cè)[J].計(jì)算機(jī)工程與應(yīng)用,2008(33):174-180.CHEN Yong-fei,LIU Xin-ming.Face images based on skin color and class Harr features face detection[J].Computer Engineering and Applications,2008(33):174-180.
[8]張靠社,張?jiān)鰪?qiáng),楊寶杰.基于Hamilton能量函數(shù)含TCSC的電力系統(tǒng)非線性控制[J].陜西電力,2009(3):23-26.ZHANG Kao-she,ZHANG Zeng-qiang,YANG Bao-jie.Nonlinear control for power system with TCSC based on hamiltonian energy function[J].Shaanxi Electric Power,2009(3):23-26.
[9]孟洪波,王亞軍,方濤.氣相色譜法檢測(cè)無(wú)水肼中水含量的不確定度評(píng)定[J].火箭推進(jìn),2011(3):68-72.MENG Hong-bo,WANG Ya-jun,F(xiàn)ANG Tao.Uncertainty evaluation of detecting the water content in anhydrous hydrazine with gas chromatography[J].Journal of Rocket Propulsion,2011(3):68-72.