web-dev-qa-db-ja.com

Tensorflowのアプリのカメラ画像がぼやける

私が達成しようとしていること:

enter image description here

Tensorflowアプリで達成すること:

enter image description here

背景:TensorFlow liteアプリケーションを使用しています。フラッシュをオンにして生成される画像がぼやけており、多くの同様の白いオブジェクトが原因で問題が発生する可能性があります区別される。 (画像は、閉じた環境であるカップのようなもので撮影されています。これがフラッシュが常にオンになっている理由です)

プロジェクトを再現したい場合は、以下の手順に従ってください:

作業ディレクトリをセットアップします

git clone https://github.com/tensorflow/examples.git

Android Studioでプロジェクトを開きます

Android Studioでプロジェクトを開くには、次の手順を実行します:

  1. 開くAndroid Studio。読み込まれた後、[既存のAndroid Studioプロジェクトを開く]を選択します。

  2. ファイルセレクタで、作業ディレクトリからexamples/lite/examples/image_classification/Androidを選択してプロジェクトをロードします。

LegacyCameraConnectionFragment.Javaの関数「onSurfaceTextureAvailable

90行目に追加します。このコードは、フラッシュを常にオンにするために追加されます(デフォルトではオフです)。

List<String> flashModes = parameters.getSupportedFlashModes();
if (flashModes.contains(Android.hardware.Camera.Parameters.FLASH_MODE_TORCH))
{
  parameters.setFlashMode(parameters.FLASH_MODE_TORCH);
}

より詳しい情報。インストールについてはここにあります: https://www.tensorflow.org/lite/models/image_classification/overview#example_applications_and_guides

私が試したもの:

まず、カメラのパラメータを微調整してみました。

            previewRequestBuilder.set(
                CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AF_MODE_MACRO);

            previewRequestBuilder.set(CaptureRequest.FLASH_MODE,
                    CaptureRequest.FLASH_MODE_TORCH);

        parameters.setFlashMode(parameters.FLASH_MODE_TORCH);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
        parameters.set("iso","100");
        parameters.setJpegQuality(100);

そして、

私は次のコードでオートフォーカスを実装しようとしました(これはいくつかのフォーカスを行うようですが、それでも画像はほとんど同じままです)

 private Camera.AutoFocusCallback myAutoFocusCallback = new Camera.AutoFocusCallback() {

    @Override
    public void onAutoFocus(boolean arg0, Camera arg1) {
      if (arg0) {
        LegacyCameraConnectionFragment.camera.cancelAutoFocus();
      }
    }
  };

  public void doTouchFocus(final Rect tfocusRect) {
    try {
      Camera mCamera = LegacyCameraConnectionFragment.camera;
      List<Camera.Area> focusList = new ArrayList<Camera.Area>();
      Camera.Area focusArea = new Camera.Area(tfocusRect, 1000);
      focusList.add(focusArea);

      Camera.Parameters param = mCamera.getParameters();
      param.setFocusAreas(focusList);
      param.setMeteringAreas(focusList);
      mCamera.setParameters(param);

      mCamera.autoFocus(myAutoFocusCallback);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      float x = event.getX();
      float y = event.getY();
  Rect touchRect = new Rect(
          (int) (x - 100),
          (int) (y - 100),
          (int) (x + 100),
          (int) (y + 100));


  final Rect targetFocusRect = new Rect(
          touchRect.left * 2000 / previewWidth - 1000,
          touchRect.top * 2000 / previewHeight - 1000,
          touchRect.right * 2000 / previewWidth - 1000,
          touchRect.bottom * 2000 / previewHeight - 1000);

  doTouchFocus(targetFocusRect);
}

return false;

}

3番目に、いくつかのリポジトリを確認してみました。最初のリポジトリはCamera2Basicです。

https://github.com/googlearchive/Android-Camera2Basic

このレポは同じ悪い結果を生みます。

次に、source-forge.netにあるOpenCameraのソースコードを試しました。

https://sourceforge.net/projects/opencamera/files/test_20200301/

そして、アプリは本当に良い結果を生み出しますが、それでも数日後、私はこの作品を作るためにそこからどの部分を取るべきかわからなかったのです。私はそれが焦点を合わせて行う必要があると信じていますが、そこからコードを取得する方法を理解することができませんでした。

私もいくつかのYouTubeビデオを見て、AndroidのStudio Camera API v1とv2に関する10件を超える投稿を行って、自分で修正しようとしました。

どうすればいいのかわからない、どんなアイデアでも大歓迎です。

3

提案:OpenCameraの場合は、すべてを手動に切り替えて、フラッシュ、シャッタースピード、フォーカスモード、および期待どおりのISOの組み合わせが見つかるかどうかを確認します。次に、これらのパラメーターをコードで再現してみます。

また、Camera2 APIを使用すると、一部のパラメーターをよりきめ細かく制御できるため、将来的に使用することをお勧めします。 CameraConnectionFragmentの代わりにLegacyCameraConnectionFragmentを使用できるかどうかを確認してください。

補遺:OpenCameraはすべてのパラメーターを画像のEXIFデータに保存するため、適切な画像ビューアーを使用して「良好な」画像のパラメーターを検索できます。

0
Florian Echtler