2012-04-25 1 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

Я опубликовал выше как класс основного класса, так и класс стороны. – RAJESH

ответ

3

getFace.confidence() является то, что вам нужно.

доверие общественности поплавок()

С: API Level 1 Возвращает коэффициент достоверности между 0 и 1. Это указывает на то, как некоторые, что было найдено на самом деле лицо. Доверительный коэффициент выше 0,3 обычно достаточно хорош.

Смотрите ссылку из Android Developers

0

FaceDetector на самом деле просто не работает. У меня было приложение, которое нужно было использовать, я потратил день или два на него, и он просто не распознает лица последовательно или точно. Это не стоит использовать, не тратьте свое время. Это просто не работает со стандартом, который любой мог ожидать. Я попробовал десятки фотографий и, возможно, половину лиц, которые он должен распознать, мог быть узнан.

+0

В Android есть новый детектор лица, который немного лучше. Обратите внимание, что он находится в другом пакете (com.google.android.gms.vision.face.FaceDetector). См. Https://developers.google.com/vision/ – pm0733464

 Смежные вопросы

  • Нет связанных вопросов^_^