Изображение камеры в приложении Tensorflow размытое - PullRequest
3 голосов
/ 05 мая 2020

Чего я пытаюсь достичь:

enter image description here

Что я достигаю с моим приложением tenorflow:

enter image description here

Фон: Я использую приложение TensorFlow lite, которое работает плохо, потому что изображения, созданные с помощью fla sh, размыты и имеют много похожего белого цвета. объекты не различимы. (Изображения сделаны в виде чашки, которая представляет собой закрытую среду, поэтому fla sh всегда включен)

Если вы хотите воспроизвести проект, вы можете следить инструкции ниже:

Настройте рабочий каталог

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 ~ этот код добавляется для включения fla sh все время (по умолчанию выключено):

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;

}

В-третьих, я попытался проверить несколько репозиториев: первое репо - Camera2Basi c

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

Это репо дает такие же плохие результаты.

Затем я попробовал Исходный код OpenCamera, который можно найти в source-forge.net:

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

, и приложение дает действительно хорошие результаты, но через несколько дней я все еще не мог понять, какую часть оттуда взять, чтобы сделать эта работа. Я считаю, что это должно происходить с фокусом, но я не мог понять, как взять код оттуда.

Я также смотрел несколько видеороликов на YouTube и просмотрел здесь 10 сообщений о Android ' s Studio Camera API v1 и v2 и попытался исправить это самостоятельно.

Я не знаю, как продолжить, любые идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 13 мая 2020

Вы используете очень старую реализацию Camera API в LegacyCameraConnectionFragment, которая устарела . Вы должны использовать android.hardware.camera2, который используется в другом примере тензорного потока, CameraConnectionFragment . Недавно CameraX была выпущена в бета-версии, и, вероятно, вы могли бы найти меньше примеров в сети, но некоторые люди уже наслаждаются этим. Подробнее о cameraX здесь .

Похоже, CameraConnectionFragment.java уже использует оптимальные настройки для вас?

// Auto focus should be continuous for camera preview.
previewRequestBuilder.set(
    CaptureRequest.CONTROL_AF_MODE,
    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
    // Flash is automatically enabled when necessary.
    previewRequestBuilder.set(
       CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

PS: Я не думаю, что вам следует жестко кодировать или даже «настраивать» настройки камеры, чтобы она работала только в очень небольших случаях. Позвольте API делать всю работу за вас.

0 голосов
/ 07 мая 2020

Предложение: для OpenCamera переключите все в ручной режим, а затем посмотрите, сможете ли вы найти комбинацию fla sh, выдержки, режима фокусировки и ISO, которая делает то, что вы ожидаете; тогда вы можете попытаться воспроизвести эти параметры в своем коде.

Кроме того, я бы предложил использовать Camera2 API в будущем, поскольку он позволяет более детально контролировать некоторые параметры. Посмотрите, можете ли вы использовать CameraConnectionFragment вместо LegacyCameraConnectionFragment.

Дополнение: OpenCamera сохраняет все параметры в данных EXIF ​​изображения, поэтому вы можете просто найти параметры для «хорошего» изображения, используя любой приличный просмотрщик изображений.

...