Android: обработка изображений в реальном времени

У меня есть приложение, которое делает предварительный просмотр камеры, выполняет некоторые базовые функции обработки изображения для каждого кадра (например, обнаружение краев, изменение цвета, деформация изображения и т. д.) и отображает измененный кадр на экран в "реальном времени". Аналогичен приложению «Бумажная камера» в 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 кадров в секунду на разных устройствах), но я хотел бы услышать, как другие решают эту проблему и как ее можно улучшить. В частности:

  • Повысится ли производительность за счет расширения GLSurfaceView вместо View для создания класса LiveView?
  • Очень неэффективно обновлять две поверхности для каждого кадра. Есть ли альтернатива?
  • Чтобы сделать это более эффективно, должен ли я получать доступ к камере на собственном уровне? - Я считаю, что OpenCV использует этот подход?

Большое спасибо

9
задан user1271673 15 March 2012 в 14:01
поделиться