標籤:android style blog http java color
1. 相關背景
Google 於2006年8月收購Neven Vision 公司 (該公司擁有 10 多項應用於行動裝置領域的Image Recognition的專利),以此獲得了Image Recognition的技術,並不是常快應用到免費的 Picasa 相冊管理程式中,提供基於Face Service的相片管理功能,另外還推出了一個新項目叫Goggle ,能從照片中識別世界各地的地標建築,相同Google 也把Face Service功能加入?到了Android 中。只是因為個人隱私等相關因素,Google Goggles好像臨時屏蔽了Face Service功能 。
2. Android 中的Face Service技術
底層庫:android/external/neven/
framework 層:frameworks/base/media/java/android/media/FaceDetector.java
Java 層介面的限制:
僅僅能接受 Bitmap 格式的資料
僅僅能識別雙眼距離大於 20 像素的人臉像(當然,這個可在framework層中改動)
僅僅能檢測出人臉的位置(雙眼的中心點及距離)
不能對人臉進行匹配(尋找指定的臉譜)
3. Face Service技術的應用
A. 為 Camera 加入?Face Service的功能:使得 Camera 的取景器上能標識出人臉範圍;假設硬體支援,能夠對人臉進行對焦。
4. 靜態圖片處理代碼執行個體:
package com.example.mydetect2;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.media.FaceDetector; //Face Service的關鍵類import android.media.FaceDetector.Face; import android.view.View; public class MainActivity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main_activity2);setContentView(new myView(this));//使用自建的view來顯示Log.i("zhangcheng","MainActivity2 run here");}private class myView extends View{private int imageWidth, imageHeight;private int numberOfFace = 5;//最大檢測的人臉數private FaceDetector myFaceDetect;//Face Service類的執行個體private FaceDetector.Face[] myFace;//儲存多張人臉的陣列變數float myEyesDistance; //兩眼之間的距離int numberOfFaceDetected; //實際檢測到的人臉數Bitmap myBitmap;public myView(Context context){//view類的建構函式,必須有super(context); BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;//構造位元影像產生的參數,必須為565。類名+enummyBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baby, BitmapFactoryOptionsbfo); imageWidth = myBitmap.getWidth(); imageHeight = myBitmap.getHeight(); myFace = new FaceDetector.Face[numberOfFace]; //分配人臉數組空間myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); //FaceDetector 構造執行個體並解析人臉Log.i("zhangcheng","numberOfFaceDetected is " + numberOfFaceDetected);}protected void onDraw(Canvas canvas){//override函數,必有canvas.drawBitmap(myBitmap, 0, 0, null);//畫出位元影像 Paint myPaint = new Paint(); myPaint.setColor(Color.GREEN); myPaint.setStyle(Paint.Style.STROKE); myPaint.setStrokeWidth(3); //設定位元影像上paint操作的參數for(int i=0; i < numberOfFaceDetected; i++){Face face = myFace[i];PointF myMidPoint = new PointF(); face.getMidPoint(myMidPoint); myEyesDistance = face.eyesDistance(); //得到人臉中心點和眼間距離參數,並對每一個人臉進行畫框canvas.drawRect( //矩形框的位置參數 (int)(myMidPoint.x - myEyesDistance), (int)(myMidPoint.y - myEyesDistance), (int)(myMidPoint.x + myEyesDistance), (int)(myMidPoint.y + myEyesDistance), myPaint);}}}}
效果例如以下:
如要注意的地方:
依據文檔描寫敘述,輸入圖片必須為Bitmap RGB565格式。
人臉的檢測方法是用雙眼來檢測人臉的位置,也就是說無法檢測到嘴、側臉等,雙眼必須同一時候可見,而且眼鏡會影響檢測的效果。
實際上,FaceDetector檢測到的並非人的全臉,而僅僅是雙眼。
實際測試中,發現圖片太小的話檢測不到人臉,實驗中使用小於100x100的圖片檢測不到人臉,可是因為Android記憶體有限,圖片太大的話,會出現無法載入圖片的異常。
檢測到的人臉存放到FaceDetector.Face類中,該類無法再擴充。從該類能夠擷取到人眼的中心位置和雙眼之間的詳細。