2012-04-25 24 views
1

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

メインクラス:

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); 
      } 
     } 
} 
+0

あなたが使用したコードを投稿する必要があります。 – Jared

+0

私はメインクラスとfacedetectクラスの両方の上に投稿しました。 – RAJESH

答えて

3

getFace.confidence()は何が必要です。

公共フロート信頼()

以降:APIレベル1 これは何が発見されたが、実際に顔であるか特定を示す0と1の間の信頼係数を返します。 0.3を超える確信度が通常は十分です。

は、実際にはうまく動作しません Android Developers

0

FaceDetectorからリファレンスを参照してください。私はそれを使用する必要があるアプリを持っていた、私はそれに1日か2日を費やし、それはちょうど一貫してまたは正確に顔を認識しません。それはあなたの時間を無駄にしないで、使用する価値はありません。誰もが期待する標準にはうまくいきません。私は何十枚もの写真を撮りました。そして、認識すべき顔の半分が認識されたかもしれません。

+0

Androidには新しい顔検出器が用意されていますが、かなり優れています。別のパッケージ(com.google.android.gms.vision.face.FaceDetector)にあることに注意してください。参照:https://developers.google.com/vision/ – pm0733464