У меня есть приложение, которое делает предварительный просмотр камеры, выполняет некоторые базовые функции обработки изображения для каждого кадра (например, обнаружение краев, изменение цвета, деформация изображения и т. д.) и отображает измененный кадр на экран в "реальном времени". Аналогичен приложению «Бумажная камера» в Android Market.
Резюме моего подхода:
1: Создайте два перекрывающихся представления в макете кадра:
SurfaceView для передачи в Camera.setPreviewDisplay(). (Передача нулевого значения предотвратит запуск предварительного просмотра камеры на некоторых устройствах - opencv делал это до Android 4.0?).
Класс LiveView, расширяющий View и реализующий Camera.PreviewCallBack. Этот вид получает кадры с камеры и отображает кадр после модификации (например, обнаружения края). Этот вид находится поверх SurfaceView.
2: Я вызываю Camera.setPreviewCallbackWithBuffer(), чтобы кадры отправлялись в мой LiveView.
3: В onPreviewFrame() LiveView я беру захваченный кадр (byte[]), конвертирую из YUV в RGB и выполнять функции обработки изображений, а также вызывать postInvalidate() (преобразование YUV2RGB и обработка изображений выполняются в собственном коде)
4: В методе OnDraw() LiveView я создаю растровое изображение из модифицированного кадра RGB (байт []) и нарисуйте растровое изображение на холсте.
Это работает (от 5 кадров в секунду до 10 кадров в секунду на разных устройствах), но я хотел бы услышать, как другие решают эту проблему и как ее можно улучшить. В частности:
Большое спасибо