天天看點

Android自帶的人臉識别

1.     Android自帶的人臉識别

Android自帶的人臉識别隻能識别出人臉在畫面中的位置,中點,眼間距,角度等基本特性,提供給拍照性質的應用使用。從基本功能中不能得出明顯的特征資料

2.     底層庫支援

external/neven/*

3.     接口

frameworks/base/media/java/android/media/FaceDetector.java4.          
packages/apps/Gallery/src/com/android/camera/*      
package com.android.mydetect;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
import android.media.FaceDetector;    // 人臉識别接口​
import android.widget.ImageView;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.Matrix;
import android.util.Log;
import android.graphics.Canvas;
import android.graphics.Paint;

public class MyDetectActivity extends Activity {
       private ImageView mImageView;    // 圖檔顯示控件​
       private Bitmap mBitmap;
       private float mScale = 1F;

       @Override
       public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                mImageView = (ImageView) this.findViewById(R.id.image);
                detect();      // 識别函數​
       }

       private void handleFace(FaceDetector.Face f) {        // 在圖檔上對每張臉進行處理​
                PointF midPoint = new PointF();
                int r = ((int) (f.eyesDistance() * mScale * 1.5));         // 取眼睛間距離​
                f.getMidPoint(midPoint);       // 取臉的中點​
                midPoint.x *= mScale;
                midPoint.y *= mScale;
                Canvas c = new Canvas(mBitmap);
                Paint p = new Paint();
                p.setAntiAlias(true);
                p.setAlpha(0x80);
                c.drawCircle(midPoint.x, midPoint.y, r, p)        // 用半透明标出人臉區域;
                mImageView.setImageBitmap(mBitmap);          // 顯示圖檔​
       }

       private void detect() {
                Matrix matrix = new Matrix();
                FaceDetector.Face[] mFaces = new FaceDetector.Face[3];         // 定義最多識别三張臉​
                int mNumFaces = 0;

                mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baby);     // 取原始圖​
                if (mBitmap == null) {
                         return;
                }
                if (mBitmap.getWidth() > 256) {
                         mScale = 256.0F / mBitmap.getWidth();
                }
                matrix.setScale(mScale, mScale);
                Bitmap faceBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap
                                   .getWidth(), mBitmap.getHeight(), matrix, true);        // 生成縮放後的新圖​

                mScale = 1.0F / mScale;
                if (faceBitmap != null) {
                         FaceDetector detector = new FaceDetector(faceBitmap.getWidth(),
                                            faceBitmap.getHeight(), mFaces.length); // 建立識别器​
                         mNumFaces = detector.findFaces(faceBitmap, mFaces);    // 識别​
                         if (mNumFaces > 0) {
                                   for (int i = 0; i < mNumFaces; i++) {
                                            handleFace(mFaces[i]);        // 調用函數對人臉畫面進行處理​
                                   }
                         }
                }
       }
}