Tensorflow的应用相机图像模糊不清

问题描述 投票:1回答:1

我想实现什么?

enter image description here

我在我的tensorflow应用中实现了什么?

enter image description here

背景:我在使用TensorFlow lite应用,效果很差我使用的是TensorFlow lite应用,效果很差,因为打开闪光灯后产生的图像很模糊,很多类似的白色物体无法分辨。(图像是在一种杯子里拍摄的,这是一个封闭的环境,这就是为什么闪光灯一直开着的原因)

如果你想重现这个项目,你可以按照下面的说明进行操作。

设置工作目录

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

用Android Studio打开项目

通过以下步骤,用Android Studio打开一个项目。

  1. 打开Android Studio。加载后选择" Open an existingAndroid Studio project"。

  2. 在文件选择器中,从你的工作目录中选择 examplesliteexamplesimage_classificationandroid 来加载项目。

在 "文件选择器 "中,选择examplesliteexamplesimage_classificationandroid从你的工作目录中加载项目。LegacyCameraConnectionFragment.java,在函数"onSurfaceTextureAvailable

添加在第90行~这段代码是为了一直打开flash而添加的(默认是关闭的)。

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

更多关于安装的信息可以在这里找到。https:/www.tensorflow.orglitemodelsimage_classificationoverview#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;

}

第三,我试着检查了一些仓库:第一个仓库是Camera2Basic。

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

这个repo产生的结果同样不好。

然后,我尝试了OpenCamera的源代码,可以在 source-forge.net:

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

而且这个应用程序产生了非常好的效果,但是过了几天,我还是不明白应该从那里取哪部分来使这个工作。我相信这与焦点有关,但我不明白如何从那里获取代码。

我还看了一些YouTube的视频,并在这里看了10个关于Android的Studio Camera API v1和v2的帖子,并试图自己修复它。

我不知道该如何继续,任何想法都非常感谢。

android android-studio tensorflow android-camera tensorflow-lite
1个回答
1
投票

你使用的是 老掉牙 中的相机API的实现。LegacyCameraConnectionFragment,也就是 弃用. 你应该 使用 android.hardware.camera2在另一个 tensorflow 示例中使用。摄像机连接片段(CameraConnectionFragment). 最近,CameraX发布了Beta版,网上可能会少了一些例子供大家效仿,但有些人在 享受 它已经。关于 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
投票

建议:对于OpenCamera,把所有的东西都切换到手动模式,然后看看你是否能找到一个闪光灯、快门速度、对焦模式和ISO的组合来实现你的期望;然后你可以尝试在你的代码中重现这些参数。

另外,我建议将来使用Camera2 API,因为它允许对一些参数进行更精细的控制。看看你是否可以使用 CameraConnectionFragment 而不是 LegacyCameraConnectionFragment.

补充一下。OpenCamera将所有参数保存在图像的EXIF数据中,因此你可以使用任何体面的图像查看器查找 "好 "图像的参数。

© www.soinside.com 2019 - 2024. All rights reserved.