web-dev-qa-db-ja.com

顔認識API

Java Androidを使用して、写真を与えられたカメラで顔の認識を行う方法を見つけようとしています。

何か案は? APIの提案はありますか?

71
Roshan Wijesena

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

画像識別リンク:

46
A. Abiri

Microsoft Face APIを試すことができます。人を検出して識別することができます。フェイスAPIの詳細 こちら

0
VivekRajendran

macgyver は、使いやすいAPIを介して顔検出プログラムを提供します。

以下のプログラムは、パブリックイメージへの参照を取得し、イメージで検出された顔の座標と寸法の配列を返します。

https://askmacgyver.com/explore/program/face-location/5w8J9u4z

0
Timothy Moody

このコードを使用

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

0
Gibs