Как стать автором
Обновить

Комментарии 21

В сторону CameraX не смотрели? Хоть и в бете, но для задачи просто фоточки сойдёт уже.

В камере 1 есть метод onFrame, можно каждый кадр из камеры анализировать.
В camera2 такого решения не нашел, как можно обрабатывать кадры, кто знает?

CaptureRequest.Builder может принимать разные таргеты(surface'ы). Одна surface обычная(SurfaceView/TextureView) для отображения превью, другая для анализа(эту surface можно сделать из ImageReader например.

Этот вариант не подходит, потому что:


  1. Он вызывает зависание preview
  2. Fps никак не 30 кадров в секунду. Очень медленно они приходят
  3. Кадр который приходит расходится с тем, что на preview.
ImageReader действильно тормозит и подходит больше для снятие фоток, а не видео-стрима.
Есть небольшой хак чтоб брать текстуру из самой превьюшки. Главное, после получения текстуры, обрабатывать её в другом потоке.

Вырезка из рабочего кода для видео-потока + превью:

все как обычно по статье создаём TextureView и надо добавить callback
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);

дальше в самом callback
@Override
        public void onSurfaceTextureUpdated(SurfaceTexture texture) {
            long time = System.currentTimeMillis();
            Bitmap b = Bitmap.createBitmap(1920,1080,Bitmap.Config.ARGB_8888)
            b = mTextureView.getBitmap(b);
            int[] pixels = new int[b.getByteCount()];
            b.getPixels(pixels,0,1920,0,0,1920,1080);
            imageProcessStream.pushImage(pixels,time/1000L);
        }
А почемуГугловцы тогда пишут
You normally cannot access the raw video data when using a Surface, but you can use the ImageReader class to access unsecured decoded (raw) video frames
Мне то как раз видео надо
этот пример как раз-таки и вызовет подвисание preview.
Дык, не совсем корректный способ вроде.
Как раз вот mTextureView.getBitmap(b) на разных девайсах занимает от 20 до 100мс.
А onSurfaceTextureUpdated срабатываем вообще на main потоке.
Если и getBitmap() выносить на другой поток — то тут я не уверен насчёт thread safe такого действия…
Просто для интереса, зачем вам каждый кадр анализировать? Мое мнение, что для такого больше подойдет не API камеры, а ARCore. Получаете фрейм + информацию об окружающем пространстве (сцене), запихиваете в очередь и асинхронно обрабатываете.

Как написали ниже, для считывания bar/qr кодов в реальном времени.
Но и не только их.

Опишите что нужно вам именно, я так делаю для считывания bar/qr кодов, превью не тормозит если сам анализ после imagereader уносить на другой поток. Опять же, посмотрите исходники CameraX, там тот же imagereader, ну и может, что то для своего кейса найдёте…

Именно это и нужно. Использую для распознавания bar/qr кодов и OCR.
Почему-то не удалось нормально подрубить Camera2, чтобы получать фреймы.

А какой размер surface устанавливаете для анализа? На поток отдельный выносите?
размер как раз full hd, попробовал ваш способ. Но есть проблемы с подвисанием превью. если уменьшить размер, то, возможно подвисание будет меньше. Но для моих целей full hd желательно использовать.

также, на сколько я понял, значение iso из каждого фрейма получить не получится.
Слежу за этой вашей веткой, т.к. уперся в теже проблемы с подвисанием.
Старое API позволяет искать qr-коды на моем железе 4 раза в секунду, а с Camera2 только получение каждого preview FullHD кадра занимает у меня ~0.45 секунды, без учета дальнейшего распознавания еще :(
Не говоря о том, что подвисает интерфейс, т.е. вообще неюзабельно.
Как же с Camera2 распознавать qr-коды «почти realtime», но и имея возможность крутить настройки камеры?
Есть предположение, что процессинг нужно выносить на отдельный тред, в Camera2 API и в самом ImageReader есть всё для этого(передача handler). При этом в примере для CameraX походу так и делают…
не разобрались с подходящей реализацией?

Странно, когда я делал свой 3D сканер https://habr.com/ru/post/412479/
то работа с камерой не показалась слишком сложной. Все логично и дает почти полный доступ. Да и примеров и документации просто масса.


Наверное, не хватает простой "кнопки счастье" "записать видео" в API. Но для этого проще поискать обертку вокруг фактически низкоуровневого (скорее средне..) управления камерой от Android.


Хотя, если честно, не понял зачем 2019 году очередная статья "как я разбирался с Camera2 API".


А теперь, если вам всё ещё интересно зачем мне потребовалось пилить свой пост на эту тему уже в 2019, то добро пожаловать под кат.

Аплодирую! Эта фраза заставила меня заглянуть внутрь.

Я согласен с автором, апи Гугл сделал, но для простых случаев использования слишком много гемора, хорошо хоть CameraX в процессе
А никто не сталкивался с тем, что на некоторых телефонах превью отображается с инвертированными цветами(как негатив)?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории