Почему класс 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

Другие вопросы по тегам