Первые шаги в создании эффекта цветности с использованием камеры Android

Я хотел бы создать эффект цветной клавиши с помощью камеры Android. Мне не нужно шаг за шагом, но я хотел бы узнать, как лучше всего захватить камеру Android и применить фильтры. Я проверил API и не нашел ничего сверх того, как манипулировать данными, поступающими с камеры. Сначала я изучал текстуру поверхности, но я не совсем понимаю, как это помогает или как ее использовать. Затем я проверил, используя GLSurfaceView, который может быть в правильном направлении, но не совсем уверен.

Кроме того, чтобы добавить к моему вопросу, как мне обрабатывать как предварительный просмотр, так и сохранение изображения? Я бы обработал изображение минимум, дважды? После предварительного просмотра и один раз при сохранении? Я думаю, что это, наверное, лучшее решение.

Наконец, было бы целесообразно создать обертку C / ++ для обработки обработки для оптимизации скорости?

Любая помощь вообще была бы весьма признательна. Следует также с удовлетворением отметить ссылку на некоторые примеры.

Благодарю.

Единственный реальный шанс – использовать openGL ES и фрагментарный шейдер (для этого потребуется хотя бы openGL ES 2.0) и сделать эффект цветности на GPU. Сам шейдер будет довольно простым (google).

Но для этого вам необходимо отобразить предварительный просмотр камеры с помощью обратного вызова. Вам нужно будет реализовать Camera.PreviewCallback , создать буфер для данных изображения и использовать метод setPreviewCallbackWithBuffer . Вы можете получить основную идею из моего ответа на аналогичный вопрос. Обратите внимание, что существует значительная проблема с производительностью этого пользовательского предварительного просмотра камеры, но она может работать на аппаратном обеспечении, поддерживающем ES 2.0.

Чтобы отобразить предварительный просмотр с помощью openGL, вам необходимо расширить GLSurfaceView а также реализовать GLSurfaceView.Renderer . Затем вы привяжете рамку предварительного просмотра камеры как текстуру с glTexImage2D к некоторому простому прямоугольнику, а остальные будут обрабатываться шейдерами. Посмотрите, как использовать шейдеры в ES здесь, или если у вас нет опыта работы с шейдерами, этот учебник может быть хорошим началом.

К другому вопросу: вы можете сохранить текущее изображение из предварительного просмотра, но предварительный просмотр имеет более низкое разрешение, чем изображение, поэтому вы, вероятно, захотите сделать снимок, а затем обработать его отдельно (вы можете использовать для него тот же шейдер) ,

Что касается C ++, то для этого много дополнительных усилий с сомнительным результатом. Но это может улучшить производительность, если сделать все правильно. Попробуйте проверить эту статью, она похожа на тему, она описывает, как использовать NDK для обработки предварительного просмотра камеры и отображения ее в openGL. Но если вы подумывали о том, как сделать эффект цветности в C ++, это будет значительно медленнее, чем шейдеры.

Вы можете проверить эту библиотеку: https://github.com/cyberagent/android-gpuimage . Он обеспечивает основу для обработки изображений на графическом процессоре устройства с использованием GL-шейдеров. Существует также пример, показывающий, как использовать библиотеку с камерой.

В Google-коде есть проект Chroma-Key: http://code.google.com/p/chroma-key-project/. Он включает в себя способ загрузки изображений, которые являются токеном, с использованием цветной клавиши:

После исчерпывающего поиска в Интернете мне не удалось найти какие-либо проекты с открытым исходным кодом, работающие с Chroma-keying для Android-устройств. Цель этого проекта – предоставить полезную библиотеку Chroma-key, которая упростит реализацию приложений и игр, которые могут выполнять> изображения перед зеленым или синим экраном, и применять изображения на выбранном фоне. > Кроме того, приложение также позволит пользователю загружать изображение с помощью Intent.