Android: обработка изображений в реальном времени - PullRequest
9 голосов
/ 15 марта 2012

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

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

1 Ответ

4 голосов
/ 15 марта 2012

Я тоже сделал что-то подобное. Что я делаю, так это расширяю вид из камеры. Я не думаю, что вид с камеры обновляется каждый кадр, но восстановлен. И только вид, который вы изменили, должен быть обновлен. OpenCv делает лучше, чем родная камера. После импорта org.opencv.highgui.VideoCapture вы можете получить прямой доступ к камере, используя:

VideoCapture camera;
camera.retrieve(mGrayMat, Highgui.CV_CAP_ANDROID_GREY_FRAME);

для преобразования mGrayMat в mRgbaMat: (org.opencv.imgproc.Imgproc)

Imgproc.cvtColor(mGrayMat, mRgbaMat, Imgproc.COLOR_GRAY2BGRA, 4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...