1

Android でサンプルの顔検出アプリケーションを開発しようとしています。Android SDK 自体で利用可能なクラスを試してみましたFaceDetecorが、正しい結果が得られません。私はビットマップを持っています。ライブラリは分析し、ビットマップで顔が使用可能かどうかを示す必要があります。いくつかの提案をお願いします。より良い結果を期待しています。顔がないと言われているこの画像に対して、次の参照画像画像を試しました。

メインクラス:

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

public class DetectFace1Activity extends Activity {
    /** Called when the activity is first created. */

    ImageView image;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        image=(ImageView)findViewById(R.id.image);
        FaceView faceView = new FaceView(this);
        setContentView(faceView);
    }
}    

顔検出クラス :

 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.graphics.Rect;
 import android.media.FaceDetector;
 import android.util.Log;
 import android.view.View;

 public class FaceView extends View {
 private static final int NUM_FACES = 10; // max is 64
 private static final boolean DEBUG = true;

 private FaceDetector arrayFaces;
 private FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES];
 private FaceDetector.Face getFace = null;

 private PointF eyesMidPts[] = new PointF[NUM_FACES];
 private float  eyesDistance[] = new float[NUM_FACES];

 private Bitmap sourceImage;

 private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 private Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);
 private Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);

 private int picWidth, picHeight;
 private float xRatio, yRatio;

 public FaceView(Context context) {
      super(context);

      pInnerBullsEye.setStyle(Paint.Style.FILL);
      pInnerBullsEye.setColor(Color.RED);

      pOuterBullsEye.setStyle(Paint.Style.STROKE);
      pOuterBullsEye.setColor(Color.RED);

      tmpPaint.setStyle(Paint.Style.STROKE);
      tmpPaint.setTextAlign(Paint.Align.CENTER);

      BitmapFactory.Options bfo = new BitmapFactory.Options();
      bfo.inPreferredConfig = Bitmap.Config.RGB_565;

      sourceImage = BitmapFactory.decodeResource( getResources() ,R.drawable.black, bfo);

      picWidth = sourceImage.getWidth();
      picHeight = sourceImage.getHeight();

      arrayFaces = new FaceDetector( picWidth, picHeight, NUM_FACES );
      arrayFaces.findFaces(sourceImage, getAllFaces);

      for (int i = 0; i < getAllFaces.length; i++)
      {
           getFace = getAllFaces[i];
           try {
                PointF eyesMP = new PointF();
                getFace.getMidPoint(eyesMP);
                eyesDistance[i] = getFace.eyesDistance();
                eyesMidPts[i] = eyesMP;

                if (DEBUG)
                {
                     Log.i("Face", i +  " " + getFace.confidence() + " " +     getFace.eyesDistance() + " " + "Pose: ("+ getFace.pose(FaceDetector.Face.EULER_X) + ","
+ getFace.pose(FaceDetector.Face.EULER_Y) + "," +     getFace.pose(FaceDetector.Face.EULER_Z) + ")" + "Eyes Midpoint: ("+eyesMidPts[i].x + "," + eyesMidPts[i].y +")");
                }
           } catch (Exception e) {
                if (DEBUG) Log.e("Face", i + " is null");
           }

      }
 }

 @Override
 protected void onDraw(Canvas canvas)
 {
      xRatio = getWidth()*1.0f / picWidth;
      yRatio = getHeight()*1.0f / picHeight;
      canvas.drawBitmap( sourceImage, null , new Rect(0,0,getWidth(),getHeight()),tmpPaint);
      for (int i = 0; i < eyesMidPts.length; i++)
      {
           if (eyesMidPts[i] != null)
           {
                pOuterBullsEye.setStrokeWidth(eyesDistance[i] /6);
                canvas.drawCircle(eyesMidPts[i].x*xRatio, eyesMidPts[i].y*yRatio, eyesDistance[i] / 2 , pOuterBullsEye);
                canvas.drawCircle(eyesMidPts[i].x*xRatio, eyesMidPts[i].y*yRatio, eyesDistance[i] / 6 , pInnerBullsEye);
           }
      }
 }
4

2 に答える 2

3

getFace.confidence()必要なものです。

公開フロートの信頼 ()

導入されたバージョン: API レベル 1 0 から 1 の間の信頼係数を返します。通常、0.3 を超える信頼係数で十分です。

Android Developersからの参照を参照してください

于 2012-10-01T17:38:14.527 に答える
0

FaceDetector は実際にはうまく機能しません。私はそれを使用する必要があるアプリを持っていました.1日か2日費やしましたが、一貫して正確に顔を認識しません. 使う価値はありません。時間を無駄にしないでください。誰もが期待する標準では機能しません。数十枚の写真を試してみたところ、認識できるはずの顔の半分が認識された可能性があります。

于 2014-07-07T17:16:31.310 に答える