Очки знаний Android CameraX
Очки знаний Android CameraX

1. Предисловие

В основномCameraXкакой-то ключ Знание Краткое введение баллов。не будет полностью представленCameraXизиспользовать。

Далее приведены некоторые концепции и моменты внимания, а также введение существительных и другой контент.

2 Разница между CameraX и Camera2

Android Сейчасиспользоватькамера В основномпроходитьCameraXиCamera2。Общие приложенияизразвиватьиспользоватьCameraXПросто используйте библиотеку для вызова камеры。

потому чтоCameraX СравниватьCamera2Простой,Простой,Простой。 Многие функции непосредственно инкапсулированы вapiЭто внутри, чтобы мы могли позвонить,В то же время совместимость также высока.

CameraXоснован наCamera2Сборка пакетаиз。Если вам нужен низкий уровень(Нижний уровень)изкамера控件来支持复杂用пример。ТакCamera2Сразуданасизлучший выбор。

Оригинальная камера для использования,Нужна сама Конфигурация, много вариантов. И обратите внимание на выпуск объектов камеры и данных предварительного просмотра и т. д.,Конфигурациягромоздкий。иGoogleИнкапсулированныйCamera2,Помогли нам упростить управление многими камерами.,Пусть разработчикам нужно сосредоточиться только на предварительном просмотре,Фотография,анализировать。Подождите реальной сцены。Вся эта библиотека методов инкапсулирована вCameraX,Позже объединились вJetpackбиблиотека。

2.1 CameraXиз Функции:

Подводя итогCameraXиз一些Функции,Семейная история. Только для справки.

  1. Поддерживает Android API 21 и выше, охватывая более 98% существующих устройств Android. (Данные предоставлены официально и не поддерживаются более ранними версиями)
  2. Высокая простота использования: прямая обработка инкапсулирует предварительный просмотр,Анализ изображений,фотосессия,Фото с видео. Вышеупомянутые функции напрямую предоставляют API для удобной работы.
  3. Сильная совместимость: независимо от того, какое устройство, соотношение сторон, угол поворота, размер и т. д. изображения упаковываются унифицированным образом.
  4. Хорошая масштабируемость: предоставление расширений API может реализовать те же функции и функции, что и собственное приложение камеры.

То есть мы можем игнорировать настройку и разрушение камеры. Сосредоточьтесь на таких данных, как изображения, выводимые камерой.

3. Знание CameraX

Наши общие функции делятся на:

  • Предварительный просмотр: Отображение данных, снятых камерой, в обозначенной области приложения в режиме реального времени.,использоватьPreviewViewВ основном для предварительного просмотра
  • Анализ изображений. Анализ данных изображений, сделанных камерами, например распознавание лиц, распознавание действий и т. д., требует анализа изображений, сделанных камерами.
  • Фотосъемка: эта функция предназначена в основном для хранения, при котором предварительно просмотренный эффект изображения сохраняется локально.
  • videoCapture: в основном через класс VideoCapture.,Храните аудиоданные.

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

Вышеупомянутые четыре функции не обязательно использовать и вызывать по порядку. Все они могут использоваться независимо. Например, мне нужен только анализ изображений и другие функции не нужны.

Их также можно использовать в комбинации, обычно это предварительный просмотр + анализ + съемка.

Вышеупомянутая функция является вариантом использования. И мы используем CameraX для достижения этих требований, комбинируя различные варианты использования.

3.1 Жизненный цикл

Процесс использования CameraX,жизненный цикличный, не требующий от нас управления камерой, система автоматически поможет нам контролировать время входа и выхода из камеры и т. д. Будет основан на жизненном текущей страницы. циклвзять под контроль。переданосистемапо умолчаниюизLifecycleOwnerвзять под контрольиз: Примеры следующие: Обычно это даActivityилиFragment

Язык кода:javascript
копировать
 cameraProvider.bindToLifecycle(this, cameraSelector, previewUseCase);

и如果нас想自己控制CameraXизжизненный цикл Тогда этого можно добиться путем настройки:

Язык кода:javascript
копировать
public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry lifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        lifecycleRegistry = new LifecycleRegistry(this);
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
        super.onStart();
        lifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }
}

а потомbindToLifecycleсерединаиз lifecycleOwnerизменение объектадля нас自定义изlifecycleRegistry

3.2 Уровень оснащения

Если вы хотите одновременно поддерживать предварительный просмотр и съемку видео,Таккамера都能支持。но Если вы хотите просмотреть+видеострельба+фотосессия,ТакнуждатьсяLIMITEDи лучшеизкамера,

И предпросмотр+видеосъемка+анализ Просто нужноLEVEL_3и лучшеизкамера。

Потому что производительность передней и задней двойной камеры многих устройств различна. Поэтому некоторые функции поддерживаются задней камерой, но не поддерживаются передней камерой. Так как узнать?

может пройтиCamera2CameraInfoкатегории для понимания。

Пример. Следующий код проверяет, включена ли задняя камера по умолчанию. LEVEL_3 оборудование:

Язык кода:javascript
копировать
@androidx.annotation.OptIn(markerClass = ExperimentalCamera2Interop.class)
Boolean isBackCameraLevel3Device(ProcessCameraProvider cameraProvider) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        List\ filteredCameraInfos = CameraSelector.DEFAULT_BACK_CAMERA
                .filter(cameraProvider.getAvailableCameraInfos());
        if (!filteredCameraInfos.isEmpty()) {
            return Objects.equals(
                Camera2CameraInfo.from(filteredCameraInfos.get(0)).getCameraCharacteristic(
                        CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL),
                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3);
        }
    }
    return false;
}

Диапазон уровней:LEGACY < LIMITED < FULL < LEVEL_3

Если мы используем комбинацию вариантов использования (предпросмотр+анализ+фото+видео), то она будет вызываться в первый раз. createCaptureSession()Появлятьсяаномальный.

3.3 Выбор камеры

CameraX автоматически выбирает лучшее устройство камеры на основе требований вашего приложения и вариантов использования. Если вы хотите использовать устройство, отличное от выбранного для вас, у вас есть несколько вариантов:

  • использовать CameraSelector.DEFAULT_FRONT_CAMERA Запрашивает префикс по умолчанию Камера.
  • использовать CameraSelector.DEFAULT_BACK_CAMERAпроситьпо умолчаниюиззадний Камера。
  • использовать CameraSelector.Builder.addCameraFilter() в соответствии с CameraCharacteristics Отфильтруйте список доступных устройств.

Все устройства камеры должны быть распознаны системой и отображены в CameraManager.getCameraIdList(), прежде чем мы сможем их использовать.

Этот процесс идентификации – это то, что должны выполнить производители оборудования.

Язык кода:javascript
копировать
CameraSelector cameraSelector =
        CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build()

Затем передайте cameraSelector в CameraProvider для настройки камеры.

3.4 Угол поворота камеры

По умолчанию угол, полученный при предварительном просмотре, — это тот, который был выбран.,иImageAnalysisАнализ изображенийикартина ФотографияImageCaptureНет,нуждатьсянас根据传递过来изimageProxy.getImageInfo().getRotationDegrees()Процесс。

Например, ImageCapture может выполнять поворот напрямую:

Язык кода:javascript
копировать
    ImageCapture imageCapture = new ImageCapture.Builder().build();

    OrientationEventListener orientationEventListener = new OrientationEventListener((Context)this) {
       @Override
       public void onOrientationChanged(int orientation) {
           int rotation;

           // Monitors orientation values to determine the target rotation value
           if (orientation >= 45 && orientation < 135) {
               rotation = Surface.ROTATION_270;
           } else if (orientation >= 135 && orientation < 225) {
               rotation = Surface.ROTATION_180;
           } else if (orientation >= 225 && orientation < 315) {
               rotation = Surface.ROTATION_90;
           } else {
               rotation = Surface.ROTATION_0;
           }

           imageCapture.setTargetRotation(rotation);
       }
    };

    orientationEventListener.enable();

разрешение 3,5

По умолчанию CameraX использует систему отображения наилучшего разрешения.,ифотосессияImageCaptureи Анализ изображенийImageAnalysisрежим,Будет использоваться по умолчанию4:3изширина и высота Сравнивать值 也Сразуда640*480

CameraX будет использовать разные разрешения для разных случаев использования. Не все последовательны. По умолчанию

режим предварительного просмотра:Самый высокий предварительный просмотр по умолчаниюразрешение。Следуй за щитомразрешение Сделать матчиз Лучший размер。(Можно регулировать)

режим анализа:по умолчаниюразрешениедля640*480。(Можно регулировать)

режим съемки:по умолчанию Самый высокий доступныйразрешение,Или максимальное разрешение, предпочтительное для устройства, соответствующее указанному выше соотношению сторон.

нас也может пройтиsetTargetResolution(Size resolution)Укажите конкретныеизразрешение,Сделайте анализные снимки. Пример:

Язык кода:javascript
копировать
ImageAnalysis imageAnalysis =
  new ImageAnalysis.Builder()
    .setTargetResolution(new Size(1280, 720))
    .build();

Вышеуказанное разрешение,нас还может пройти指定ширина и высота Сравниватьосознать:setTargetAspectRatio

но,Два параметра Конфигурация не могут использоваться одновременно.,В противном случае это будет ПоявлятьсяIllegalArgumentException аномальный.

То есть в конкретном случае вы не можете одновременно установить соотношение сторон и разрешение.

в то же время,может пройтиStreamConfigurationMap.getOutputSizes(int)для просмотра текущей поддержки устройстваиз Функцииразрешение。

3.6 Вспышка

Вспышка в основном используется при фотосъемке, и способ ее включения относительно прост:

Язык кода:javascript
копировать
ImageCapture mImageCapture = new ImageCapture.Builder().setFlashMode(ImageCapture.FLASH_MODE_AUTO).build();

setFashMode: включать ли вспышку, есть четыре основных режима:

  • ImageCapture.FLASH_MODE_UNKNOWN: Неизвестный режим
  • ImageCapture.FLASH_MODE_AUTO: автоматически включать вспышку в зависимости от окружающего освещения.
  • ImageCapture.FLASH_MODE_ON: Включать вспышку каждый раз
  • ImageCapture.FLASH_MODE_OFF:закрытиевспышка

3.7 Управление камерой

Мы можем добиться масштабирования, фонарика, замера фокусировки (нажмите для фокусировки) и компенсации экспозиции с помощью элементов управления камерой.

Язык кода:javascript
копировать
Camera camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)

//Можно использовать часто используемые функции камеры
CameraControl cameraControl = camera.getCameraControl()
// Вы можете запросить состояние этих часто используемых функций камеры.
CameraInfo cameraInfo = camera.getCameraInfo()

масштабировать:CameraControl.setZoomRatio()используется дляв соответствии смасштабировать Сравниватьпримернастраиватьмасштабировать,CameraControl.setZoomRatio()используется для0приезжать1.0междуиз Линейныймасштабировать。

фонарик:CameraControl.enableTorch(boolean) Фонарик (также называемый фонариком) можно включить или отключить.

фокус:CameraControl.startFocusAndMetering() может быть указано в соответствии с FocusMeteringAction настраивать AF/AE/AWB Область замера для запуска автофокусировки и замера экспозиции. Существует множество приложений для камеры, которые таким образом реализуют функцию фокусировки касанием.

3.8 VideoCapture

В основном речь идет о настройке камеры, записывающей видео. В остальном все аналогично. В основном мы вводим некоторые общие элементы конфигурации:

Язык кода:javascript
копировать
VideoCapture mVideoCapture = new VideoCapture.Builder().build();//Для записи видео
processCameraProvider.bindToLifecycle(this, mCameraSelector, mVideoCapture, mPreview);

Перед созданием VideoCapture мы можем настроить следующие параметры:

Язык кода:javascript
копировать
        VideoCapture capture= new VideoCapture.Builder()
                .setVideoFrameRate()
                .setBitRate()
                .setAudioBitRate()
                ...
                .build()
  • setVideoFrameRate(): частота кадров, по умолчанию — 30;
  • setBitRate(): скорость передачи данных, по умолчанию 8 * 1024 * 1024;
  • setIFrameInterval(): интервал кадров, по умолчанию 1;
  • setAudioBitRate(): битрейт аудио, по умолчанию — 64000;
  • setAudioSampleRate(): частота сбора аудио, по умолчанию 8000;
  • setAudioChannelCount(): количество аудиоканалов, по умолчанию 1;
  • setAudioMinBufferSize(): минимальный размер аудиобуфера, по умолчанию — 1024;
  • setMaxResolution(): максимальное разрешение, по умолчанию 1920, 1080.
  • setTargetAspectRatio(): соотношение сторон, значение по умолчанию — 16:9;

Ссылка: https://developer.android.google.cn/training/camerax.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose