我想实现什么?
我在我的tensorflow应用中实现了什么?
背景:我在使用TensorFlow lite应用,效果很差我使用的是TensorFlow lite应用,效果很差,因为打开闪光灯后产生的图像很模糊,很多类似的白色物体无法分辨。(图像是在一种杯子里拍摄的,这是一个封闭的环境,这就是为什么闪光灯一直开着的原因)
如果你想重现这个项目,你可以按照下面的说明进行操作。
设置工作目录
git clone https://github.com/tensorflow/examples.git
用Android Studio打开项目
通过以下步骤,用Android Studio打开一个项目。
打开Android Studio。加载后选择" Open an existingAndroid Studio project"。
在文件选择器中,从你的工作目录中选择 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的帖子,并试图自己修复它。
我不知道该如何继续,任何想法都非常感谢。
你使用的是 老掉牙 中的相机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为你做这些工作。
建议:对于OpenCamera,把所有的东西都切换到手动模式,然后看看你是否能找到一个闪光灯、快门速度、对焦模式和ISO的组合来实现你的期望;然后你可以尝试在你的代码中重现这些参数。
另外,我建议将来使用Camera2 API,因为它允许对一些参数进行更精细的控制。看看你是否可以使用 CameraConnectionFragment
而不是 LegacyCameraConnectionFragment
.
补充一下。OpenCamera将所有参数保存在图像的EXIF数据中,因此你可以使用任何体面的图像查看器查找 "好 "图像的参数。