Обработка кадров камеры Android в режиме реального времени - PullRequest
26 голосов
/ 12 апреля 2011

Я пытаюсь создать приложение для Android, которое будет обрабатывать кадры камеры в режиме реального времени. Для начала я просто хочу показать версию в оттенках серого, которую видит камера. Мне удалось извлечь соответствующие значения из байтового массива в методе onPreviewFrame. Ниже приведен фрагмент моего кода:

byte[] pic;
int pic_size;
Bitmap picframe;
public void onPreviewFrame(byte[] frame, Camera c)
{
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width;
    pic = new byte[pic_size];
    for(int i = 0; i < pic_size; i++)
    {
        pic[i] = frame[i];
    }
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size);
}

Первые [width*height] значения массива кадров byte[] являются значениями яркости (оттенки серого). После того, как я их извлек, как я могу отобразить их на экране в виде изображения? Это не двумерный массив, так как я могу указать ширину и высоту?

Ответы [ 3 ]

10 голосов
/ 31 января 2012

Подробное руководство можно получить из OpenCV4Android SDK .Посмотрите на их доступные примеры, в частности Tutorial 1 Basic. 0 Android Camera

Но, как это было в моем случае, для интенсивной обработки изображений, это будет медленнее, чем приемлемо для приложения обработки изображений в реальном времени.Хорошая замена для преобразования их байтового массива onPreviewFrame в YUVImage:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

Создайте прямоугольник такого же размера, как изображение.

Создайте ByteArrayOutputStreamи передайте это, прямоугольник и значение сжатия для compressToJpeg ():

ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

Визуализация этих превью-фреймов на поверхности и использование лучших практик - это новое измерение.=) * * Один тысяча двадцать-шесть

1 голос
/ 17 декабря 2016

Этот очень старый пост привлек мое внимание.

API, доступный в 11 году, был гораздо более ограниченным. Сегодня можно использовать SurfaceTexture (см. пример ) для предварительного просмотра потока камеры после (некоторых) манипуляций.

0 голосов
/ 05 сентября 2014

Это непростая задача, если доступны текущие инструменты / API Android. В общем, обработка изображений в реальном времени лучше выполняется на уровне NDK. Чтобы просто показать черно-белое, вы все равно можете сделать это в Java. Массив байтов, содержащий данные кадра, имеет формат YUV, где Y-плоскость стоит первой. Итак, если вы получите только Y-плоскость (первая ширина x высота в байтах), она уже даст вам черно-белое изображение.

Я достиг этого благодаря обширной работе и испытаниям. Вы можете просмотреть приложение в Google: https://play.google.com/store/apps/details?id=com.nm.camerafx

...