Android中的人脸识别

时间:2012-11-19 05:18:09

标签: android face-recognition

我需要在Android 4.0的应用中实现面部识别登录。由于面部识别解锁在Android Ice-Cream Sandwich中可用,是否有任何开放的SDK或内置库来实现此功能。到目前为止,我遇到了外部API,例如http://www.kooaba.com/http://developers.face.com/docs/。我知道如何检测面部但是有任何内置支持面部识别登录或我必须使用外部API ? 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

据我所知,Android 4.0中没有对人脸识别的实际支持(如您所知,只有人脸检测)。 Face Unlock是一个独立的解决方案,不会暴露任何东西。

答案 1 :(得分:1)

RES /值/ strings.xml中:

<resources>

    <string name="app_name">FaceDetectionExample</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_face_detection_example">FaceDetectionExample</string>
    <string name="app_info">Click on the \'Take Picture\' to take a picture using Camera and detect the face(s) in the picture taken.</string>
    <string name="take_picture">Take Picture</string>
    <string name="detect_face">Detect Face</string>
</resources>

RES /布局/ detectlayout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <ImageView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/image_view"
                android:layout_weight="1.0"/>

        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/detect_face"
                android:text="@string/detect_face"
                android:layout_gravity="center_horizontal"/>

</LinearLayout>

main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dip">

        <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_info"
        android:gravity="center_horizontal"
        android:layout_weight="1.0"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/take_picture"
        android:layout_margin="5dip"
        android:text="@string/take_picture"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>

的AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.facedetectionexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".FaceDetectionExample"
            android:label="@string/title_activity_face_detection_example" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

FaceDetectionExample.java

package com.example.facedetectionexample;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
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.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class FaceDetectionExample extends Activity {
    private static final int TAKE_PICTURE_CODE = 100;
    private static final int MAX_FACES = 5;

    private Bitmap cameraBitmap = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ((Button)findViewById(R.id.take_picture)).setOnClickListener(btnClick);
}

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if(TAKE_PICTURE_CODE == requestCode){
                    processCameraImage(data);
            }
    }

private void openCamera(){
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

    startActivityForResult(intent, TAKE_PICTURE_CODE);
}

private void processCameraImage(Intent intent){
    setContentView(R.layout.detectlayout);

    ((Button)findViewById(R.id.detect_face)).setOnClickListener(btnClick);

    ImageView imageView = (ImageView)findViewById(R.id.image_view);

    cameraBitmap = (Bitmap)intent.getExtras().get("data");

    imageView.setImageBitmap(cameraBitmap);
}

private void detectFaces(){
    if(null != cameraBitmap){
            int width = cameraBitmap.getWidth();
            int height = cameraBitmap.getHeight();

            FaceDetector detector = new FaceDetector(width, height,FaceDetectionExample.MAX_FACES);
            Face[] faces = new Face[FaceDetectionExample.MAX_FACES];

            Bitmap bitmap565 = Bitmap.createBitmap(width, height, Config.RGB_565);
            Paint ditherPaint = new Paint();
            Paint drawPaint = new Paint();

            ditherPaint.setDither(true);
            drawPaint.setColor(Color.RED);
            drawPaint.setStyle(Paint.Style.STROKE);
            drawPaint.setStrokeWidth(2);

            Canvas canvas = new Canvas();
            canvas.setBitmap(bitmap565);
            canvas.drawBitmap(cameraBitmap, 0, 0, ditherPaint);

            int facesFound = detector.findFaces(bitmap565, faces);
            PointF midPoint = new PointF();
            float eyeDistance = 0.0f;
            float confidence = 0.0f;

            Log.i("FaceDetector", "Number of faces found: " + facesFound);

            if(facesFound > 0)
            {
                    for(int index=0; index<facesFound; ++index){
                            faces[index].getMidPoint(midPoint);
                            eyeDistance = faces[index].eyesDistance();
                            confidence = faces[index].confidence();

                            Log.i("FaceDetector",
                                            "Confidence: " + confidence +
                                            ", Eye distance: " + eyeDistance +
                                            ", Mid Point: (" + midPoint.x + ", " + midPoint.y + ")");

                            canvas.drawRect((int)midPoint.x - eyeDistance ,
                                                            (int)midPoint.y - eyeDistance ,
                                                            (int)midPoint.x + eyeDistance,
                                                            (int)midPoint.y + eyeDistance, drawPaint);
                    }
            }

            String filepath = Environment.getExternalStorageDirectory() + "/facedetect" + System.currentTimeMillis() + ".jpg";

                    try {
                            FileOutputStream fos = new FileOutputStream(filepath);

                            bitmap565.compress(CompressFormat.JPEG, 90, fos);

                            fos.flush();
                            fos.close();
                    } catch (FileNotFoundException e) {
                            e.printStackTrace();
                    } catch (IOException e) {
                            e.printStackTrace();
                    }

                    ImageView imageView = (ImageView)findViewById(R.id.image_view);

                    imageView.setImageBitmap(bitmap565);
    }
}

    private View.OnClickListener btnClick = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    switch(v.getId()){
                            case R.id.take_picture:         openCamera();   break;
                            case R.id.detect_face:          detectFaces();  break; 
                    }
            }
    };
}

和摇滚!!!!!!!