Использование необработанного массива byte [] камеры для дополненной реальности - PullRequest
4 голосов
/ 04 июля 2011

Я занимаюсь разработкой приложения дополненной реальности, поэтому мне нужно сделать предварительный просмотр камеры, добавить визуальные эффекты и отобразить его на экране. Я хотел бы сделать это, используя onPreviewFrame метод PreviewCallback. Это дает мне переменную byte[], содержащую необработанные данные изображения (в кодировке YUV420) для работы.

Несмотря на то, что я искал решение в течение многих часов, я не могу найти способ преобразовать эту переменную byte[] в любой формат изображения, с которым я могу работать или даже рисовать на экране.

Предпочтительно, я бы преобразовал данные byte[] в некоторый формат RGB, который можно использовать как для вычислений, так и для рисования.

Есть ли правильный способ сделать это?

Ответы [ 2 ]

12 голосов
/ 04 июля 2011

Я столкнулся с той же проблемой несколько месяцев назад, когда мне нужно было сделать какое-то обнаружение краев на кадрах камеры.Это прекрасно работает для меня.Попробуйте.

public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) 
        {
            camera.setPreviewCallback(new PreviewCallback() {

                public void onPreviewFrame(byte[] data, Camera camera) {

                    Camera.Parameters parameters = camera.getParameters();

                    int width = parameters.getPreviewSize().width;
                    int height = parameters.getPreviewSize().height;

                    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
                    Rect rect = new Rect(0, 0, width, height); 
                    YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,width,height,null);
                    yuvimage.compressToJpeg(rect, 100, outstr);
                    Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
                }
}
}

Теперь вы можете использовать растровое изображение для всех ваших целей обработки.Получите интересующий пиксель, и вы сможете с комфортом делать на нем RGB или HSV.

7 голосов
/ 04 июля 2011

Имран Назар написал учебник из двух частей по дополненной реальности, который может оказаться вам полезным.Хотя он в конечном итоге использует NDK, первая часть 1002 * и большая часть второй части 1004 * подробно описывают то, что вам нужно, используя только Java.

Я считаю, Bitmap.createBitmap - это метод, который вам нужен.

...