2012-03-31 2 views
1

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

Любые ссылки на эту тему очень ценятся.

+0

вам нужно использовать 'onPictureTaken' или вы могли бы использовать для предварительного просмотра обратного вызова,' onPreviewFrame' ли? –

+0

Ну, мне не нужно обрабатывать изображения во время предварительного просмотра, только после того, как изображение будет снято. В чем разница в параметрах? – Vitaly

+1

'onPictureTaken' передает изображение в формате JPG,' onPreviewFrame' передает необработанные данные YUV. –

ответ

1

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

вы ресивер ли необработанные данные изображений через onPictureTaken или onPreviewFrame он может прийти закодированные в sereral различных форматов (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/

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

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

0

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

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

... а также работают OCR на андроиде. Отсутствует выпуск фактических геостатов, поэтому посмотрите в исходный репозиторий. Не стесняйтесь присоединяться к списку разработчиков и задавать вопросы там (и в курсе внести свой вклад в проект)

+0

Спасибо. Спасибо, но я постараюсь написать свой собственный OCR-материал, однако я уверен, что использую ваш код как нечто вдохновляющее. У меня есть очень конкретная задача и никаких ограничений в режиме реального времени, поэтому у меня есть время поиграть с собственным кодом. Меня больше интересует, как декодировать эти необработанные форматы, которые я получаю с камеры. – Vitaly

+0

Не за что :) Демонстрации также охватывают необработанный формат (от предварительного просмотра, но это в основном то же самое). И вы можете поделиться своими идеями OCR в том же проекте. JavaOCR использует инвариантные моменты и кластерный анализ для OCR –

0

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

Смежные вопросы