3

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

4

2 回答 2

2

据我所知,Android 4.0 中并没有真正支持人脸识别(只有你知道的人脸检测)。人脸解锁是一个独立的解决方案,不会暴露任何东西。

于 2013-01-10T09:01:21.340 回答
1

资源/值/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>

资源/布局/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>

主.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; 
                    }
            }
    };
}

还有摇滚!!!!!!!

于 2013-03-09T09:51:39.470 回答