2011-07-26 44 views
59

Java Androidを使用して、カメラの画像で顔を認識する方法を見つけようとしています。Java用の顔認識API Android

アイデア?誰もAPIの提案はありますか?

+1

チェックアウトトン彼はCV(コンピュータビジョン)ライブラリを開くAndroidのポート@ http://opencv.willowgarage.com/wiki/Android – evandrix

+0

あなたに近づいた@Roshan Wijesenaが使用されましたか?私はopencvとその作業を使用しましたが、私が得たい出力は、ひげで顔をスキャンし、次の画像をスキャンして認識しなければならない場合と同じです。しかし、私は以前にスキャンしたものと同じ顔を認識しています。 –

答えて

41

私は顔認識ライブラリで見つけたいくつかのリンクを紹介します。

画像識別リンク:

+1

アップデートを確認してください。 –

+2

さらにいくつかのリンク:http://fivedots.coe.psu.ac.th/~ad/jg/nui08/およびhttp://code.google.com/p/javafaces/ – earcam

+1

http:// face。com/ – TiansHUo

3

あなたはボックス学習アルゴリズムの全く出ていない組み込みAPIを使用することができます。

@sinceのAPIレベル1 http://developer.android.com/reference/android/media/FaceDetector.html

歓声、

オーレリアン

+0

これは答えではない理由はありますか? –

+13

質問は顔認識ではありません顔検出ではありません – insomniac

+2

認識、黒魔法では予備学習なしではできません。したがって、APIでFaceDetectorが指定された画像内の顔を識別する(たとえば、それらに関する情報を提供する)ことを読み取ることができます。見つかった情報と既知のモデルとを比較することは、クライアントの責任です。これは、顔ロックの仕組みです。 – Arcadien

0

あなたは自由のための顔を検出するには、Androidでクラスmedia.FaceDetectorを使用しています。

これは、顔検出の例である:https://github.com/betri28/FaceDetectCamera

+0

彼は顔認識について尋ねました –

0

使用このコード

public class MainActivity extends AppCompatActivity { 

private FaceOverlayView mFaceOverlayView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mFaceOverlayView = (FaceOverlayView) findViewById(R.id.face_overlay); 

    InputStream stream = getResources().openRawResource(R.raw.face); 
    Bitmap bitmap = BitmapFactory.decodeStream(stream); 

    mFaceOverlayView.setBitmap(bitmap); 

} } 

Faceoverlay.java

public class FaceOverlayView extends View { 

private Bitmap mBitmap; 
private SparseArray<Face> mFaces; 

public FaceOverlayView(Context context) { 
    this(context, null); 
} 

public FaceOverlayView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public FaceOverlayView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

public void setBitmap(Bitmap bitmap) { 
    mBitmap = bitmap; 
    FaceDetector detector = new FaceDetector.Builder(getContext()) 
      .setTrackingEnabled(true) 
      .setLandmarkType(FaceDetector.ALL_LANDMARKS) 
      .setMode(FaceDetector.ACCURATE_MODE) 
      .build(); 

    if (!detector.isOperational()) { 
     //Handle contingency 
    } else { 
     Frame frame = new Frame.Builder().setBitmap(bitmap).build(); 
     mFaces = detector.detect(frame); 
     detector.release(); 
    } 
    logFaceData(); 
    invalidate(); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    if ((mBitmap != null) && (mFaces != null)) { 
     double scale = drawBitmap(canvas); 
     drawFaceLandmarks(canvas, scale); 
    } 
} 

private double drawBitmap(Canvas canvas) { 
    double viewWidth = canvas.getWidth(); 
    double viewHeight = canvas.getHeight(); 
    double imageWidth = mBitmap.getWidth(); 
    double imageHeight = mBitmap.getHeight(); 
    double scale = Math.min(viewWidth/imageWidth, viewHeight/imageHeight); 

    Rect destBounds = new Rect(0, 0, (int)(imageWidth * scale), (int)(imageHeight * scale)); 
    canvas.drawBitmap(mBitmap, null, destBounds, null); 
    return scale; 
} 

private void drawFaceBox(Canvas canvas, double scale) { 
    //This should be defined as a member variable rather than 
    //being created on each onDraw request, but left here for 
    //emphasis. 
    Paint paint = new Paint(); 
    paint.setColor(Color.GREEN); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(5); 

    float left = 0; 
    float top = 0; 
    float right = 0; 
    float bottom = 0; 

    for(int i = 0; i < mFaces.size(); i++) { 
     Face face = mFaces.valueAt(i); 

     left = (float) (face.getPosition().x * scale); 
     top = (float) (face.getPosition().y * scale); 
     right = (float) scale * (face.getPosition().x + face.getWidth()); 
     bottom = (float) scale * (face.getPosition().y + face.getHeight()); 

     canvas.drawRect(left, top, right, bottom, paint); 
    } 
} 

private void drawFaceLandmarks(Canvas canvas, double scale) { 
    Paint paint = new Paint(); 
    paint.setColor(Color.GREEN); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(5); 

    for(int i = 0; i < mFaces.size(); i++) { 
     Face face = mFaces.valueAt(i); 

     for (Landmark landmark : face.getLandmarks()) { 
      int cx = (int) (landmark.getPosition().x * scale); 
      int cy = (int) (landmark.getPosition().y * scale); 
      canvas.drawCircle(cx, cy, 10, paint); 
     } 

    } 
} 

private void logFaceData() { 
    float smilingProbability; 
    float leftEyeOpenProbability; 
    float rightEyeOpenProbability; 
    float eulerY; 
    float eulerZ; 
    for(int i = 0; i < mFaces.size(); i++) { 
     Face face = mFaces.valueAt(i); 

     smilingProbability = face.getIsSmilingProbability(); 
     leftEyeOpenProbability = face.getIsLeftEyeOpenProbability(); 
     rightEyeOpenProbability = face.getIsRightEyeOpenProbability(); 
     eulerY = face.getEulerY(); 
     eulerZ = face.getEulerZ(); 

     Log.e("Tuts+ Face Detection", "Smiling: " + smilingProbability); 
     Log.e("Tuts+ Face Detection", "Left eye open: " + leftEyeOpenProbability); 
     Log.e("Tuts+ Face Detection", "Right eye open: " + rightEyeOpenProbability); 
     Log.e("Tuts+ Face Detection", "Euler Y: " + eulerY); 
     Log.e("Tuts+ Face Detection", "Euler Z: " + eulerZ); 
    } 
} } 

リファレンス

https://github.com/tutsplus/Android-PlayServices-FaceDetection/tree/master/app/src/main