У меня есть приложение, которое выполняет предварительный просмотр камеры, выполняет некоторые основные функции обработки изображения для каждого кадра (например, обнаружение краев, изменение цвета, искажение изображения и т. Д.) И отображает измененный кадр на экране в режиме «реального времени».Аналогично приложению «Бумажная камера» в 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-кадра (byte []) и рисую растровое изображение на холсте.
Это работает (между 5 к / с и 10 к / с на разных устройствах), но мне хотелось бы услышать, как другие подошли к этой проблеме и как ее можно улучшить.В частности:
- Получу ли я какую-либо производительность за счет расширения GLSurfaceView, а не View, для создания класса LiveView?
- Звучит очень неэффективно, когда две поверхности обновляются для каждого кадра.Есть ли альтернатива?
- Чтобы сделать это более эффективно, я должен получить доступ к камере на родном уровне?- Я полагаю, что OpenCV использует этот подход?
Большое спасибо