公衍宇, 郭 琦 ,于 超
(1.河北工業(yè)大學 信息工程學院,天津 300380;2.河北工業(yè)大學 機械工程學院,天津 300380)
Android是Google開發(fā)的基于Linux平臺的開源手機操作系統(tǒng),本意為“機器人”。它包括操作系統(tǒng)、用戶界面和應用程序——移動電話工作所需的全部軟件,而且不存在任何以往阻礙移動產(chǎn)業(yè)創(chuàng)新的專有權障礙。OpenCV于1999年由Intel建立,現(xiàn)在由Willow Garage提供支持。OpenCV是一個基于BSD許可證授權(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Mac OS和Android操作系統(tǒng)上。它輕量級而且高效——由一系列C函數(shù)和少量C++類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現(xiàn)了圖像處理和計算機視覺的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法[1-2]。Android應用程序是通過Android SDK(Software Develo-pment Kit)利用Java編程語言進行開發(fā)的,此虛擬機支持JNI,同時伴隨著Android NDK的發(fā)布,使開發(fā)者利用第三方C/C++庫協(xié)助編寫Android程序成為可能,如OpenCV庫便可方便地應用在Android系統(tǒng)中[3]。
OpenCV從2.2版本以后支持Android,本設計的編譯環(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++)的動態(tài)庫,并能自動將so和java應用一起打包成apk。同時還集成了交叉編譯器,并提供了相應的mk文件隔離CPU、平臺、等差異,開發(fā)人員只需要簡單修改mk文件 (指出 “哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。
官方提供的Android NDK R4版本對于有些OpenCV中使用的一些C++概念不支持Cryta x為我們提供了一種支持OpenCV的Android NDK修訂版。本設計Android NDK所使用的版本為android-ndk-r4-linux-cry-tax-4在開始編譯安裝OpenCV庫之前,需要在PC機Ubuntu操作系統(tǒng)下安裝如:cmake、buid-essential等編譯OpenCV庫需要用到的工具。在此環(huán)境下編譯并安裝OpenCV庫。
OpenCV現(xiàn)已官方支持在Android環(huán)境下的開發(fā),OpenCV2.2源文件包中包含一android文件夾,在此文件夾中包括一些官方提供的編譯文件,利用NDK并借助這些編譯文件對OpenCV源碼進行編譯,就可生成適用于在Android環(huán)境下運行的靜態(tài)庫。在編譯之前需要解壓縮android-ndkr4-linux-x86-crytax-4.tar.bz2,完成修訂版本 NDK 的安裝。 進入OpenCV2.2內(nèi)的android文件夾下,執(zhí)行 “mkdir build”指令,完成創(chuàng)建build文件夾,然后執(zhí)行 “cd build”指令進入build文件夾,隨后執(zhí)行“cmake..”指令生成makefile編譯文件,最后執(zhí)行“make”指令對其進行編譯,編譯完成后將生成OpenCV靜態(tài)庫,用于在Android環(huán)境下基于OpenCV的Android應用軟件開發(fā)。
在Android系統(tǒng)下基于OpenCV的人臉檢測實現(xiàn)需通過Android NDK工具集將利用JNI編寫的本地代碼組件嵌入到Android應用程序中,所以整個實現(xiàn)過程分為兩個步驟首先,通過JNI與OpenCV接口編寫本地C/C++代碼,并利用Android NDK對其進行編譯生成Java可調(diào)用的共享庫,接下來利用Android應用程序框架編寫Java端代碼,最后通過Android SDK生成Android應用程序,整體設計框架如圖1所示。
圖1 整體設計框架Fig.1 Overall design framework
打開 eclipse,新建一個 workspace,在 Window->Preferences中設置好Android SDK的路徑。然后新建一個Android項目,Build Target選擇Android2.2,命名為"facedetect",活動名改為“facedetect”,Package name 中 填 寫 com.testopencv.facedetect,最后點擊finish。
首先在工程目錄下新建jni文件夾,新建C++源代碼文件并引入此頭文件,編寫函數(shù)實現(xiàn)代碼。
分類器文件與圖片文件的路徑分別在Java端利用String靜態(tài)變量進行存儲,在本地代碼端需要得到此String變量的UTF-8形式用來加載分類器和圖片文件,這就需要通過JNI來實現(xiàn)。關鍵代碼如下:
以上代碼可得到分類器的絕對路徑,圖片文件的存儲絕對路徑也可以此方式得到[4]。
人臉檢測是指在輸入圖像中將人臉從龐雜的背景中提取出來,并返回人臉在圖像中的位置、大小等信息。首先將彩色圖像轉(zhuǎn)換為灰度圖像,然后對圖像進行直方圖均衡化,最后利用分類器對圖像中某一區(qū)域是否為人臉進行檢測。OpenCV將分類器信息利用xml文件進行存儲,同時OpenCV自帶分類器訓練程序:haartrfimng.exe,可以使用它來方便的進行haar-like特征分類器的訓練。將分類器xm l文件放在Java工程目錄下的asset文件夾內(nèi),當安裝應用時,利用流操作將此文件寫入sd卡上的指定路徑下,同時將此途徑存儲在一靜態(tài)變量String,人臉檢測函數(shù)實現(xiàn)關鍵代碼如下:
檢測到的人臉位置信息將會存入數(shù)據(jù)類型為vector<RECT>的faces中,最后通過迭代將檢測到人臉的矩形信息分別換算成空心圓信息存入一個int數(shù)組,此空心圓信息包括圓心的x坐標、y坐標以及半徑。
在C/C++端得到人臉位置信息后,需要將此信息傳入Java端進行UI更新,這依然需要通過JNI來完成。在IntentService類中新建一int數(shù)組用來存放檢測到的人臉位置信息,當本地人臉檢測操作執(zhí)行完成后對其進更新與讀取,關鍵代碼如下:
有兩個腳本文件需要編寫,分別是Android.mk和Application.mk文件。Android.mk文件描述了需要NDK進行編譯的源文件,以及所要形成的組件,Application.mk文件描述一些關于本應用的輔助編譯信息,這個編譯文件是可選的。
在Java工程目錄下的jni文件夾下新建Android.mk文件。 打開此文件,首先定 LOCAL_PATH:=$(call my-dir)”, 用來定位源代碼文件所在目錄;其次 “include$(CLEAR_VARS)”,用來清除許多LOCAL_XXX變量,因為所有編譯控制文件都是在一個GNU Make執(zhí)行上下文中進行解析,而此時所有變量都是全局可見的,所以需要這一操作;由于利用第三方庫OpenCV協(xié)助開發(fā),需要指定此庫通過NDK編譯好的靜態(tài)版本的頭文件、靜態(tài)庫文件的搜索路徑與連接標記,所以編寫如下如下6條語句:
最后需說明所要產(chǎn)生的是靜態(tài)庫還是動態(tài)庫,由于動態(tài)庫為所需,故編寫如下代碼:
include$(BUILD_SHARED_LIBRARY)
在Java工程目錄下的jni文件夾下新建Application.mk文件,由于需要在ARM-V7構架的CPU上運行,所以通過定義“APP_ABI:=armeabi-v7a“來指定。 打開 Cygwin,進入本Android工程目錄下的jni文件中,執(zhí)行”$NDK/ndk-build”命令,執(zhí)行完畢后將生成共享文件libface detect.so。
人臉檢測的實現(xiàn)充分說明了在Android系統(tǒng)下利用OpenCV進行計算機視覺研究與開發(fā)的可行性與實用性,雖然由于Android NDK工具還處于初級發(fā)展階段,不夠成熟,以及硬件配置的差距,致使最后人臉檢測操作的運行速度相對較慢,但隨著NDK的發(fā)展,利用其進行編譯的本地代碼在Android系統(tǒng)中的運行將更加高效,同時越來越強大的硬件配置也將給予有力支持。Android系統(tǒng)如今發(fā)展迅速,許多第三方庫現(xiàn)已提供Android通用編程接口,這為Android應用軟件開發(fā)人員提供極大的便利,OpenCV也會在下一版本提供此接口,但對于計算機視覺算法研究人員以及對軟件深度開發(fā)人員來說,利用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的通用人臉檢測模塊設計[J].計算機工程與科學,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結合實現(xiàn)的目標檢測模塊[J].計算機應用,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技術實現(xiàn)跨平臺開發(fā)的研究[J].計算機應用研究,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特征的人臉圖像的人臉檢測[J].計算機工程與應用,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]張靠社,張增強,楊寶杰.基于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]孟洪波,王亞軍,方濤.氣相色譜法檢測無水肼中水含量的不確定度評定[J].火箭推進,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.