C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

カメラプレビューに対して顔を検出するには, FaceDetectionListenerインタフェースを実装し, カメラ(Camera)に登録する.

顔の検出(API Level 16)

プレビュー画像を表示する」を参照し, カメラプレビューを表示するようにする.
  • src/MainActivity.java
    • SurfaceHolder.CallbackインタフェースのsurfaceCreatedメソッドをオーバーライドする.
      • Camera#setFaceDetectionListenerメソッドで, リスナーを登録する.
    • SurfaceHolder.CallbackインタフェースのsurfaceChangedメソッドをオーバーライドする.
      • Camera#stopFaceDitectionメソッドで, 顔検出を停止する.
      • Camera#getParametersメソッドで, Camera.Parametersのインスタンスを取得する.
      • Parameters#getMaxNumDetectedFacesメソッドで, 検出可能な最大の顔数を取得する.
      • 顔数が1以上の場合には顔検出に対応しているので, Camera#startFaceDetectionメソッドで顔検出を開始する.
    • SurfaceHolder.CallbackインタフェースのsurfacDestroyedメソッドをオーバーライドする.
      • Camera#stopFaceDitectionメソッドで, 顔検出を停止する.
    • Camera.FaceDetectionListenerインタフェースのonFaceDetectionメソッドをオーバーライドする.
      • 顔を検出した際の処理を記述する.
package com.moonlight_aska.android.facedetect02;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Face;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity
    implements SurfaceHolder.Callback, Camera.FaceDetectionListener {
  private Camera mCamera = null;
  private SurfaceView mView = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mView = new SurfaceView(this);
    setContentView(mView);
    SurfaceHolder holder = mView.getHolder();
    holder.addCallback(this);
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera = Camera.open();
    // リスナーの登録
    mCamera.setFaceDetectionListener(this);
    try {
      // プレビューの設定
      mCamera.setPreviewDisplay(holder);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub
    mCamera.stopFaceDetection();
    mCamera.stopPreview();
    // プレビュー画面のサイズ設定
    Camera.Parameters params = mCamera.getParameters();
    List<Size> previewSizes = params.getSupportedPreviewSizes();
    Size size = previewSizes.get(0);
    params.setPreviewSize(size.width, size.height);
    mCamera.setParameters(params);
    // プレビュー開始
    mCamera.startPreview();
    // 顔検出対応か?
    if (params.getMaxNumDetectedFaces() > 0) {
      // 顔検出開始
      mCamera.startFaceDetection();
    }
    else {
      Log.e("FaceDetector", "Face detection is not supported.");
    }
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera.stopFaceDetection();
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
  }

  @Override
  public void onFaceDetection(Face[] faces, Camera camera) {
    // TODO Auto-generated method stub
    if (faces.length > 0) {
      Log.v("FaceDetection", faces.length + " faces");
    }
  }
}



コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます