Использование необработанного массива byte[] камеры для дополненной реальности

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

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

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

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

2 ответа

Решение

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

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.

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

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

Другие вопросы по тегам