Почему класс ImageReader в Android такой медленный?
Я попробовал 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.
1 ответ
Я думаю, это как-то связано с LEGACY camera HAL. Я недавно столкнулся с этой проблемой тоже, и на самом деле, если вы просто используете glReadPixel
Вы можете достичь лучшей частоты кадров, чем ImageReader. Проверьте этот ответ: /questions/20194021/android-kamera2-vyivodit-v-format-imagereader-yuv420888-po-prezhnemu-medlenno/20194037#20194037