1. 程式人生 > >玩轉Android Camera開發 五 基於Google自帶演算法實時檢測人臉並繪製人臉框 網路首發 附完整demo

玩轉Android Camera開發 五 基於Google自帶演算法實時檢測人臉並繪製人臉框 網路首發 附完整demo

               

    本文主要介紹使用Google自帶的FaceDetectionListener進行人臉檢測,並將檢測到的人臉用矩形框繪製出來。本文程式碼基於PlayCameraV1.0.0,在Camera的open和preview流程上進行了改動。原先是放在單獨執行緒裡,這次我又把它放到Surfaceview的生命週期裡進行開啟和開預覽。

    首先要反省下,去年就推出了靜態圖片的人臉檢測demo,當時許諾一週內推出Camera預覽實時檢測並繪製的demo,結果拖到現在才整。哎,屌絲一天又一天,蹉跎啊。在demo製作過程中還是遇到了一些麻煩的,第一個問題是檢測到人臉rect預設是以預覽介面為座標系,這個座標系是經過變換的,中心點為(0, 0),左上頂點座標是(-1000, -1000),右下頂點是(1000, 1000).也就是說不管預覽預覽Surfaceview多大,檢測出來的rect的座標始終對應的是在這個變換座標系。而android裡預設的view的座標系是,左上頂點為(0, 0),橫為x軸,豎為y軸。這就需要把rect座標變換下。另一個難點是,這個人臉檢測必須在camera開啟後進行start,如果一旦拍照或停預覽,則需要再次啟用。啟用時需要加個延遲,否則的話就不起作用了。

    另外,仍要交代下,在預覽介面實時檢測人臉並繪製(基於Google自帶演算法),還是有兩個思路的。一是在PreviewCallback裡的onPreviewFrame裡得到yuv資料後,轉成rgb後再轉成Bitmap,然後利用靜態圖片的人臉檢測流程,即利用FaceDetector類進行檢測。另一個思路是,直接實現FaceDetectionListener介面,這樣在onFaceDetection()裡就得到檢測到的人臉Face[] faces資料了。這裡只需控制何時start,何時stop即可,這都是android標準介面。毫無疑問,這種方法是上選。從Android4.0後android原始碼裡的camera app都是用的這個介面進行人臉檢測。下面上原始碼:

一、GoogleFaceDetect.java

    考慮到下次準備介紹JNI裡用opencv檢測人臉,為此雜家新建了一個包org.yanzi.mode裡面準備放所有的關於影象的東西。新建檔案GoogleFaceDetect.java實現FaceDetectionListener,在建構函式裡傳進來一個Handler,將檢測到的人臉資料發給Activity,經Activity中轉再重新整理UI.