Androidでカメラを作る ~ その4:フォーカス位置の指定

2021年8月17日

これまで作成したカメラプログラムで写真は撮れるのですが、フォーカスがお任せで、合わせたい以外の場所に焦点が合う場合があります。

やはり、自分の指定した場所にフォーカスが合うようにしたいです。そのロジックを用意します。

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.動作させてみる

実際に動作させてみると、指定した矩形にフォーカスが合います。これ、結構いい感じです。マス目のある方が、構図を決めるのに便利です。ピントが合った部分が、画面の中でどういうバランスになるかが分かりやすくて使えます。

これで、フォーカス位置を指定できるようになりました。次にやりたいこととして、カメラ撮影で大事なシャッター速度露出などのマニュアル指定がありますが、ここでスマートフォンのカメラに重大な欠点があることを知ります。

それは、次回の記事でご紹介します。