Android應用開發提高篇(6)—–FaceDetector(臉部偵測)

來源:互聯網
上載者:User

一、概述

      初次看到FaceDetector這個類時,心裡想:Android真的很強大。但直到我實際應用它的時候,心情從高山跌倒了穀底(看實現中的結果就知道了),再仔細看看官方文檔,才知道這個類是API LEVEL1的,我就暈了,這就說明這個類很早就有了,但為什麼到現在還沒有得到改善呢。寫這篇文章的目的還有一個,就是想強調一下用SurfaceView來畫圖的時候,要用某個事件來觸發,而不能在程式一開始啟動並執行時候就直接畫圖。好吧,下面看看這個類有多“強大”。


二、實現

     建立工程MyFace,修改/res/layout/main.xml檔案,在裡面添加一個Button和一個SurfaceView,完整的main.xml如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <Button
8 android:id="@+id/button"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="開始檢測"
12 />
13 <SurfaceView
14 android:id="@+id/surfaceview"
15 android:layout_width="fill_parent"
16 android:layout_height="fill_parent"
17
18 />
19
20 </LinearLayout>

修改MyFaceActivity.java檔案,實現按鈕的監聽,在按鈕被點擊後實現畫圖和臉部偵測,詳細說明看代碼注釋:

 

  1 package com.nan.face;
2
3 import android.app.Activity;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.graphics.Canvas;
7 import android.graphics.Color;
8 import android.graphics.Paint;
9 import android.graphics.PointF;
10 import android.graphics.Rect;
11 import android.media.FaceDetector;
12 import android.os.Bundle;
13 import android.util.Log;
14 import android.view.SurfaceHolder;
15 import android.view.SurfaceView;
16 import android.view.View;
17 import android.widget.Button;
18
19 public class MyFaceActivity extends Activity
20 {
21 private Button mButton = null;
22 private SurfaceView mSurfaceView = null;
23 private SurfaceHolder mSurfaceHolder = null;
24
25 @Override
26 public void onCreate(Bundle savedInstanceState)
27 {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30
31 mButton = (Button)findViewById(R.id.button);
32 mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
33 mSurfaceHolder = mSurfaceView.getHolder();
34
35 //按鈕監聽
36 mButton.setOnClickListener(new View.OnClickListener()
37 {
38
39 public void onClick(View v)
40 {
41 // TODO Auto-generated method stub
42
43 BitmapFactory.Options bitmapOption = new BitmapFactory.Options();
44 //圖片的參數(這個參數要有,不然找不到人臉)
45 bitmapOption.inPreferredConfig = Bitmap.Config.RGB_565;
46 Bitmap myBitmap;
47 //擷取圖片資源
48 myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mm,bitmapOption);
49 //假設最多有5張臉
50 int numOfFaces = 5;
51 FaceDetector mFaceDetector = new FaceDetector(myBitmap.getWidth(),myBitmap.getHeight(),numOfFaces);
52 FaceDetector.Face[] mFace = new FaceDetector.Face[numOfFaces];
53 //擷取實際上有多少張臉
54 numOfFaces = mFaceDetector.findFaces(myBitmap, mFace);
55 Log.v("------------->", ""+numOfFaces);
56
57 //鎖定整個SurfaceView
58 Canvas mCanvas = mSurfaceHolder.lockCanvas();
59 //畫圖
60 mCanvas.drawBitmap(myBitmap, 0f, 0f, null);
61 //繪製完成,提交修改
62 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
63 //重新鎖一次
64 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
65 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
66
67 Paint mPaint = new Paint();
68 //畫筆顏色
69 mPaint.setColor(Color.GREEN);
70 //畫筆的樣式是矩形框,不是矩形塊
71 mPaint.setStyle(Paint.Style.STROKE);
72 //線寬
73 mPaint.setStrokeWidth(2.0f);
74
75 float eyesDistance = 0f;
76
77 //將所有檢測到的臉框出來
78 for(int i=0;i < numOfFaces;i++)
79 {
80 PointF eyeMidPoint = new PointF();
81 //兩眼的中點距離
82 mFace[i].getMidPoint(eyeMidPoint);
83 //兩眼之間的距離
84 eyesDistance = mFace[i].eyesDistance();
85
86 //鎖定整個SurfaceView
87 mCanvas = mSurfaceHolder.lockCanvas();
88 //畫矩形框
89 mCanvas.drawRect((int)(eyeMidPoint.x-eyesDistance),
90 (int)(eyeMidPoint.y-eyesDistance),
91 (int)(eyeMidPoint.x+eyesDistance),
92 (int)(eyeMidPoint.y+eyesDistance),
93 mPaint);
94 //繪製完成,提交修改
95 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
96 //重新鎖一次
97 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
98 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
99
100 }
101
102 }
103 });
104 }
105
106 }

好,運行這個程式看看:

 

嗯,是檢測出來了。等等,換一張有2張人臉的圖片,再運行這個程式看看:

 

嗯,也檢測出來了,不過只檢測出來一個。

      檢測速度先不說了,不知道是我寫的程式有問題,還是Android本身只能檢測一個?希望是我的程式有問題。


PS:所用的圖片是網上找的。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.