最終更新: moonlight_aska 2014年11月03日(月) 17:52:34履歴
カメラプレビューに対して顔を検出するには, FaceDetectionListenerインタフェースを実装し, カメラ(Camera)に登録する.
「プレビュー画像を表示する」を参照し, カメラプレビューを表示するようにする.
- 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メソッドをオーバーライドする.
- 顔を検出した際の処理を記述する.
- SurfaceHolder.CallbackインタフェースのsurfaceCreatedメソッドをオーバーライドする.
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");
}
}
}
コメントをかく