web-dev-qa-db-ja.com

Camera2 API、Androidでフォーカスをロックする方法は?

カスタムカメラがフォーカスを見つけた後、フォーカスをロックしようとしています。最初に自動モードに設定されたAFモード:

builder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_AUTO);

そしてプレビューに触れた後、焦点距離を見つけ、このコードを使用してAFとAEをロックする必要があります:

builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
builder.set(CaptureRequest.CONTROL_AE_LOCK, true);

AEのロックはどのデバイスでも正常に機能します。ロックAFはNexus5およびNexus 5xで機能しています。しかし、Samsung S5とS6に関しては、検索フォーカスを試み続けます。

フォーカスをロックする最良の方法は何ですか?

15
mudin

AFをロックするには、capture()の代わりにrepeatingRequest()を使用して_AF_TRIGGER_を1回だけリクエストする必要があります(そうでない場合は、af要求ループに入り、常に残ります)焦点を合わせようとしているが、いくつかのネクサスはそのFWでこれを修正しているので、_Nexus 5_としてのいくつかのデバイスは、そうでない場合でもうまく焦点を合わせます)

したがって、正しい順序は次のとおりです。

  • 必要に応じて_CONTROL_AF_MODE_を_CONTROL_AF_MODE_AUTO_(session.setRepeatingRequest()経由)および_AF_REGIONS_および_AE_REGIONS_に設定します

  • totalCaptureRequestからCaptureCallbackをチェックすることで、_CONTROL_AF_MODE_がすでに自動になっていることを確認するまで待ちます。

  • ビルダーで_AF_TRIGGER_START_を_CONTROL_AF_MODE_AUTO_とともに設定しますが、今回はsession.setRepeatingRequest()を使用する代わりにsession.capture()を使用します。

  • その直後に、_AF_TRIGGER_を設定して、_AF_TRIGGER_IDLE_(キャンセルしない!)を設定し、_CONTROL_AF_MODE_AUTO_とともにsession.setRepeatingRequest()を再度使用します。

  • フォーカスされるまで待ちます。_FOCUSED_LOCKED_または_NOT_FOCUSED_LOCKED_を受け取ります。

_PASSIVE_FOCUSED_状態は、_CONTROL_AF_MODE_が自動ではなく連続画像にある場合のみです!

トリガーを実行する前に、実際にオートフォーカスモードになっていることに注意してください。

すべてのトリガーで常にsession.capture()を使用する必要があります(_CONTROL_AE_PRECAPTURE_TRIGGER_も使用)が、その後は必ずsession.repeatingRequest()IDLE(キャンセルしない)にトリガーを配置することを忘れないでください

22
Yamidragut

CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTUREに焦点を当てることはできません。

AFモードをCONTROL_AF_MODE_AUTOに設定し、AFトリガー中にFOCUSED_LOCKED状態を待つ必要があります。 Androidフォーカスマシンが ここにリンクの説明を入力してください