Почему класс Android ImageReader такой медленный?

Я попробовал новый JavaCamera2View OpenCV для Android 3.4.1, но он был слишком медленным (~ 15 кадров в секунду только для отображения вида камеры). Когда я попробовал старый JavaCameraView, он дал мне хорошие результаты (~ 30 кадров в секунду, что является пределом моей камеры).

Я задался вопросом, почему версия Camera2 была такой медленной, и изучил реализацию. Я закомментировал все обработки и рендеринг изображения (просто позволив камере рисовать внутренний объект ImageReader, а затем считывая его с помощью метода acquireLastImage()), и это все еще было 15 кадров в секунду. Однако, когда я изменил целевую поверхность с ImageReader объекта на поверхность самого вида, он внезапно дал мне 30 кадров в секунду.

Итак, вопрос в том, почему класс ImageReader такой медленный? Я предполагаю, что ImageReader считывает изображение с поверхности, которая использует OpenGL, с glReadPixels(), и это очень медленно, потому что требует передачи изображения из памяти графического процессора в память процессора (или, возможно, он ожидает сброса графического процессора?), но я не могу быть уверен, потому что все, что делает ImageReader, скрыто в нативном коде.

Или вместо этого ImageReader в порядке, а в OpenCV чего-то не хватает?

Я использую ASUS Zenfone 4 Max, Android 7.1.1.


person eivour    schedule 24.06.2018    source источник
comment
Поскольку я хочу, чтобы он работал только на моем собственном мобильном телефоне Android, и в будущем мне понадобится точный контроль над устройством камеры, я не хочу прибегать к JavaCameraView.   -  person eivour    schedule 24.06.2018
comment
Прочтите github.com/opencv/opencv/issues/11261. TL;NR: это может быть связано с размером кадра, преобразованием цвета или ограниченной поддержкой камеры2 на вашем устройстве.   -  person Alex Cohn    schedule 24.06.2018
comment
Я не думаю, что это проблема размера кадра или поддержки камеры2, потому что, когда я рисую непосредственно на поверхности или когда я рисую текстуру OpenGL, я получаю хорошую производительность. Я также прокомментировал преобразование YUV420 в ARGB, и оно осталось прежним.   -  person eivour    schedule 25.06.2018


Ответы (1)


Я предполагаю, что это как-то связано с камерой LEGACY HAL. Недавно я тоже столкнулся с этой проблемой, и на самом деле, если вы просто используете glReadPixel, вы можете добиться более высокой частоты кадров, чем ImageReader. Проверьте этот ответ: https://stackoverflow.com/a/51083567/2606068

person wdanxna    schedule 28.06.2018