Работа с необработанными данными изображения в onPictureTaken - PullRequest
1 голос
/ 31 марта 2012

Я реализовал функцию использования камеры для съемки.Вместо того, чтобы хранить его, я хочу сделать некоторую простую обработку изображений (очень простое распознавание текста - в основном, чтобы попробовать собственную способность обрабатывать такие задачи), для чего мне нужно конвертировать imageData в общедоступном void onPictureTaken (byte [] imageData, Camera c) в оттенки серого- 2-х байтовый массив.Единственный пример кода, который я нашел, - преобразовать изображение в растровое изображение с помощью bitmapFactory ( Обработка изображений на Android ).У меня вопрос - может кто-нибудь посоветовать все необработанные форматы и как извлечь из них данные?Или, может быть, мое лучшее предположение - получить растровое изображение и уменьшить его до 2-байтового массива?

Любые ссылки по теме очень приветствуются.

Ответы [ 3 ]

1 голос
/ 13 февраля 2013

Я понимаю, что этот ответ немного запоздал, но вот то, что я узнал за последний месяц, работая с камерой.

Получаете ли вы необработанные данные изображения через onPictureTaken или onPreviewFrame , они могут быть закодированы в нескольких различных форматах (android.graphics.ImageFormat). Единственной гарантированной универсальной поддержкой (согласно документации) является NV21, универсальная поддержка YV12 от сот и выше. Помимо универсальной поддержки, NV21 может очень хорошо соответствовать тому, что вы пытаетесь сделать (конвертировать в черно-белое). NV21 - это формат YUV, где канал Y несет информацию о яркости, а каналы U и V - информацию о цвете. Смотрите более формальное описание здесь:

http://en.wikipedia.org/wiki/YUV
http://www.fourcc.org/fccyvrgb.php
http://www.fourcc.org/yuv.php#NV21

Ссылка на вики содержит пример источника, который обеспечивает преобразование NV21-> RGB (не очень эффективно, как есть, но дает хорошее представление об общем подходе). Если вам интересно сделать это преобразование в C или ассемблере, это был хороший источник информации (предупреждение: нет кода для NV21, и мои быстрые модификации для обработки NV21 не дали ничего хорошего). Тем не менее, он показывает, как включить файлы .S в проекты ndk, что на самом деле очень просто.

http://www.roman10.net/effective-color-conversion-yuv-rgb-in-android-in-assembly/

Вернуться к вашему вопросу - конвертация в ч / б. Просто возьмите канал Y и сформируйте тройки RGB как [Y, Y, Y], и это даст вам черно-белое изображение. Или, может быть, просто сделать из него изображение L8 (например, Y-> L).

PS. Существует большая путаница в отношении диапазона / масштабирования значений YUV при преобразовании в RGB. Я обнаружил, что данные камеры поступают полным ходом (0-255, а не 16-235 или 16-240), и что ограничение результата до 0-255 после умножения матрицы дает визуально приятный результат, а масштабирование до искажений 0-255 цвета (само собой разумеется, это все еще верно, если вы масштабируете до некоторого другого диапазона, такого как 16-240). Эти наблюдения противоречат некоторым тонкостям процедуры полного преобразования, описанной в ссылках выше, но я нашел, что это сработало.

0 голосов
/ 28 октября 2014

Может быть, эти ответы бесполезны для автора темы, но другим людям может быть интересно, как они хотят использовать необработанные данные камеры для своих собственных целей. Это ffmpeg. Это может быть скомпилировано для Android. например, есть проект, который может дать способ, как это сделать. https://github.com/guardianproject/android-ffmpeg-java https://www.ffmpeg.org/ Камера Android может кормить ffmpeg этой командой ffmpeg -f rawvideo -pixel_format nv21 -video_size 320x240 -кадр 15

0 голосов
/ 31 марта 2012

Переходите на темную сторону - у нас есть печенье:

http://sourceforge.net/projects/javaocr/

... а также работает OCR на Android. Фактических версий не существует, так что смотрите в репозитории исходных текстов. Не стесняйтесь присоединиться к списку разработчиков и задавать вопросы там (и, конечно, внести свой вклад в проект)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...