Почему класс ImageReader в Android такой медленный? - PullRequest
0 голосов
/ 24 июня 2018

Я попробовал 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 Ответ

0 голосов
/ 28 июня 2018

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

...