2012-04-25 2 views
1

J'essaye de développer une application de détection de visage d'échantillon dans Android. J'ai essayé avec la classe FaceDetecor qui est disponible dans le SDK Android lui-même, mais il ne fournit pas les bons résultats. J'ai un bitmap. La bibliothèque devrait analyser et devrait dire si le visage est disponible dans le bitmap ou non. S'il vous plaît donnez-moi quelques suggestions. Espérant un meilleur résultat. J'ai essayé l'image suivante Reference Image pour cette image, il dit pas de visages.Détection de visage dans Android

Classe principale:

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

détection de visage Classe:

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

Vous devez publier le code que vous avez utilisé. – Jared

+0

J'ai posté ci-dessus à la fois classe principale et classe face à face. – RAJESH

Répondre

3

getFace.confidence() est ce que vous avez besoin.

confiance du flottant()

depuis: API Niveau 1 Renvoie un facteur de confiance entre 0 et 1. Cela indique comment certains ce qui a été trouvé est en fait un visage. Un facteur de confiance supérieur à 0,3 est généralement suffisant.

Voir la référence de Android Developers

0

FaceDetector fait ne fonctionne tout simplement pas bien. J'avais une application qui avait besoin de l'utiliser, j'ai passé un jour ou deux dessus et ça ne reconnaît pas les visages de manière cohérente ou précise. Cela ne vaut pas la peine d'utiliser, ne perdez pas votre temps. Cela ne fonctionne tout simplement pas selon les normes auxquelles tout le monde s'attendrait. J'ai essayé des dizaines de photos et peut-être la moitié des visages qu'elle devait reconnaître ont pu être reconnus.

+0

Il y a un nouveau détecteur de visage disponible dans Android qui fait un peu mieux. Notez qu'il se trouve dans un package différent (com.google.android.gms.vision.face.FaceDetector). Voir: https://developers.google.com/vision/ – pm0733464