使用原始相机byte []数组进行增强现实

时间:2011-07-04 15:44:48

标签: android image image-processing augmented-reality android-camera

我正在开发一个增强现实应用,所以我需要捕捉相机预览,添加视觉效果,并在屏幕上显示。我想使用onPreviewFrame的{​​{1}}方法执行此操作。这给了我一个PreviewCallback变量,其中包含要处理的原始图像数据(YUV420编码)。

即使我搜索了几个小时的解决方案,我找不到将这个byte[]变量转换为我可以使用的任何图像格式甚至在屏幕上绘制的方法。

最好,我会将byte[]数据转换为某种RGB格式,可用于计算和绘图。

有没有正确的方法呢?

2 个答案:

答案 0 :(得分:12)

几个月前,当我不得不做一些时,我偶然发现了同样的问题 相机边框上的边缘检测。这对我来说非常适合。 尝试一下。

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的东西。

答案 1 :(得分:7)

Imran Nazar撰写了关于增强现实的两部分教程,您可能会发现它很有用。虽然他最终使用了NDK,first part和大多数second part都只使用Java来详细说明。

我相信Bitmap.createBitmap是你需要的方法。