通過兩個主要的API,Android提供了一個直接在位圖上進行臉部檢測的方法,這兩個API分別是 android.media.FaceDetector和android.media.FaceDetector.Face,已經包含在Android官方API中。本教程來自Developer網站,向大家介紹了這些API,同時提供教程中實例代碼下載(見 http://www.linuxidc.com/Linux/2012-06/63789p4.htm )。
圖片來源:Wikipedia
所謂人臉檢測就是指從一副圖片或者一幀視頻中標定出所有人臉的位置和尺寸。人臉檢測是人臉識別系統中的一個重要環節,也可以獨立應用於視頻監控。在數字媒體日益普及的今天,利用人臉檢測技術還可以幫助我們從海量圖片數據中快速篩選出包含人臉的圖片。 在目前的數碼相機中,人臉檢測可以用來完成自動對焦,即“臉部對焦”。“臉部對焦”是在自動曝光和自動對焦發明後,二十年來最重要的一次攝影技術革新。家用數碼相機,占絕大多數的照片是以人為拍攝主體的,這就要求相機的自動曝光和對焦以人物為基准。
構建一個人臉檢測的Android Activity
你可以構建一個通用的Android Activity,我們擴展了基類ImageView,成為MyImageView,而我們需要進行檢測的包含人臉的位圖文件必須是565格式,API才能正常工作。被檢測出來的人臉需要一個置信測度(confidence measure),這個措施定義在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。
最重要的方法實現在setFace(),它將FaceDetector對象實例化,同時調用findFaces,結果存放在faces裡,人臉的中點轉移到MyImageView。代碼如下:
- public class TutorialOnFaceDetect1 extends Activity {
- private MyImageView mIV;
- private Bitmap mFaceBitmap;
- private int mFaceWidth = 200;
- private int mFaceHeight = 200;
- private static final int MAX_FACES = 1;
- private static String TAG = "TutorialOnFaceDetect";
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- mIV = new MyImageView(this);
- setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
-
- // load the photo
- Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);
- mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);
- b.recycle();
-
- mFaceWidth = mFaceBitmap.getWidth();
- mFaceHeight = mFaceBitmap.getHeight();
- mIV.setImageBitmap(mFaceBitmap);
-
- // perform face detection and set the feature points setFace();
-
- mIV.invalidate();
- }
-
- public void setFace() {
- FaceDetector fd;
- FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];
- PointF midpoint = new PointF();
- int [] fpx = null;
- int [] fpy = null;
- int count = 0;
-
- try {
- fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);
- count = fd.findFaces(mFaceBitmap, faces);
- } catch (Exception e) {
- Log.e(TAG, "setFace(): " + e.toString());
- return;
- }
-
- // check if we detect any faces
- if (count > 0) {
- fpx = new int[count];
- fpy = new int[count];
-
- for (int i = 0; i < count; i++) {
- try {
- faces[i].getMidPoint(midpoint);
-
- fpx[i] = (int)midpoint.x;
- fpy[i] = (int)midpoint.y;
- } catch (Exception e) {
- Log.e(TAG, "setFace(): face " + i + ": " + e.toString());
- }
- }
- }
-
- mIV.setDisplayPoints(fpx, fpy, count, 0);
- }
- }