Я попробовал OpenCV для Android 3.4.1 совершенно новый JavaCamera2View
, но он был слишком медленным (~ 15 кадров в секунду для отображения камеры). Когда я попробовал более старый JavaCameraView
, он дал мне хорошие результаты (~ 30 кадров в секунду, что является пределом для моей камеры).
Я удивился, почему версия Camera2 была такой медленной, и посмотрел на реализацию. Я закомментировал все обработки и визуализации изображения (просто позволил камере прорисовать внутренний объект ImageReader
, а затем считал его, используя метод acquireLastImage()
), и он все еще составлял 15 кадров в секунду. Однако, когда я изменил поверхность цели с ImageReader
объекта на поверхность самого вида, он неожиданно дал мне 30 кадров в секунду.
Итак, вопрос в том, почему класс ImageReader
такой медленный?
Я предполагаю, что ImageReader читает изображение из Surface, который использует OpenGL, с glReadPixels()
, и это очень медленно, потому что требует передачи изображения из памяти GPU в память CPU (или, возможно, он ожидает сброса GPU?), но я не уверен, потому что то, что делает ImageReader
, скрыто в нативном коде.
Или вместо этого ImageReader
просто отлично и OpenCV что-то упустил?
Я использую ASUS Zenfone 4 Max, Android 7.1.1.