Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android多媒體-人臉識別

Android多媒體-人臉識別

編輯:關於Android編程

1. 相關背景

Google 於2006年8月收購Neven Vision 公司 (該公司擁有 10 多項應用於移動設備領域的圖像識別的專利),以此獲得了圖像識別的技術,並很快應用到免費的 Picasa 相冊管理程序中,提供基於人臉識別的相片管理功能,另外還推出了一個新項目叫Goggle ,能從照片中識別世界各地的地標建築,同樣Google 也把人臉識別功能添加到了Android 中。不過由於個人隱私等相關因素,Google Goggles好像暫時屏蔽了人臉識別功能 。


2. Android 中的人臉識別技術

底層庫:android/external/neven/

framework 層:frameworks/base/media/java/android/media/FaceDetector.java


Java 層接口的限制:

只能接受 Bitmap 格式的數據
只能識別雙眼距離大於 20 像素的人臉像(當然,這個可在framework層中修改)
只能檢測出人臉的位置(雙眼的中心點及距離)

不能對人臉進行匹配(查找指定的臉譜)


3. 人臉識別技術的應用

A. 為 Camera 添加人臉識別的功能:使得 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; 	//人臉識別的關鍵類
import android.media.FaceDetector.Face; 
import android.view.View; 

public class MainActivity2 extends Activity {

	@Override
	protected 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;	//人臉識別類的實例
		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。類名+enum
			myBitmap = 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類中,該類無法再擴展。從該類可以獲取到人眼的中心位置和雙眼之間的具體。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved