Я попробовал новый 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.
JavaCameraView
. - person eivour   schedule 24.06.2018