Androidでカメラを作る ~ その4:フォーカス位置の指定
これまで作成したカメラプログラムで写真は撮れるのですが、フォーカスがお任せで、合わせたい以外の場所に焦点が合う場合があります。
やはり、自分の指定した場所にフォーカスが合うようにしたいです。そのロジックを用意します。
1.フォーカスの指定方法
Camera2でフォーカスを合わせるには、合わせる矩形を指定することで実現できます。画面の中で、フォーカスを合わたい矩形を指定すれば良いです。
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
maxRegionsAF = characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
activeArraySize = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
画面サイズがactiveArraySizeで取得できます。この画面サイズの中で、フォーカスを合わせる矩形を指定します。
矩形は複数指定できるようですが、今回は1つだけにします。
MeteringRectangle[] afRegions = new MeteringRectangle[1]; // フォーカスを指定する配列(1個だけ)
// フォーカスを合わせる矩形座標を指定する(※各自指定してください)
int wLeft = XXXXX ;
int wTop = XXXXX ;
int wRight = XXXXX;
int wBottom = XXXXX ;
// フォーカスを合わせる矩形を作る
Rect p = new Rect(Math.max(activeArraySize.left, wLeft), Math.max(activeArraySize.top, wTop),
Math.min(wRight, activeArraySize.right), Math.min(wBottom, activeArraySize.bottom));
// 配列に代入する
afRegions[0] = new MeteringRectangle(p, MeteringRectangle.METERING_WEIGHT_MAX);
try {
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
if (0 < afRegions.length) {
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, afRegions);
}
mPreviewCaptureRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
mCaptureSession.setRepeatingRequest(mPreviewCaptureRequestBuilder.build(), null, null) ;
} catch (CameraAccessException e) {
e.printStackTrace();
}
2.フォーカスの矩形をどう決める?
今回作成するカメラでは、画面に5×5のマス目を用意して、そのマス目をタッチすることでフォーカス位置を指定する仕組みにしています。これは、カメラのフォーカスポイントと少し似ています。
スマートフォンのカメラアプリでは、タッチした点を中心に任意のフォーカスエリアを決めているものが多いです。しかし、今回作成するカメラアプリはマス目を用意し、そのマス目がフォーカスを合わせる矩形になります。将来的には、マス目を任意の大きさにするのが良いと思っています。
マス目の描画は、カメラの画面を表示しているActivityの上に配置したSurfaceView上で行っています。 SurfaceView の画面サイズは、取得した画面サイズ(activeArraySize)とは違うので、変換する必要があります。
※SurfaceViewのソースは割愛させていただきます。
3.動作させてみる
実際に動作させてみると、指定した矩形にフォーカスが合います。これ、結構いい感じです。マス目のある方が、構図を決めるのに便利です。ピントが合った部分が、画面の中でどういうバランスになるかが分かりやすくて使えます。
これで、フォーカス位置を指定できるようになりました。次にやりたいこととして、カメラ撮影で大事なシャッター速度や露出などのマニュアル指定がありますが、ここでスマートフォンのカメラに重大な欠点があることを知ります。
それは、次回の記事でご紹介します。