Чего я пытаюсь достичь:
Что я достигаю с моим приложением tenorflow:
Фон: Я использую приложение TensorFlow lite, которое работает плохо, потому что изображения, созданные с помощью fla sh, размыты и имеют много похожего белого цвета. объекты не различимы. (Изображения сделаны в виде чашки, которая представляет собой закрытую среду, поэтому fla sh всегда включен)
Если вы хотите воспроизвести проект, вы можете следить инструкции ниже:
Настройте рабочий каталог
git clone https://github.com/tensorflow/examples.git
Откройте проект с помощью Android Studio
Откройте проект в Android Studio, выполнив следующие действия:
Откройте Android Studio. После загрузки выберите «Открыть существующий проект Android Studio».
В селекторе файлов выберите 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 и попытался исправить это самостоятельно.
Я не знаю, как продолжить, любые идеи приветствуются.