实时处理Android相机帧

时间:2011-04-12 10:52:28

标签: android image-processing camera

我正在尝试创建一个能够实时处理相机帧的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[]值是亮度(灰度)值。一旦我提取了它们,我如何将它们作为图像显示在屏幕上?它也不是2D数组,所以如何指定宽度和高度?

3 个答案:

答案 0 :(得分:10)

您可以从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 :(得分:1)

这篇非常古老的帖子现在引起了我的注意。

&#11; 11中提供的API更加有限。今天可以使用SurfaceTexture(参见example)在(某些)操作之后预览相机流。

答案 2 :(得分:-2)

使用当前的Android工具/ API,这不是一项容易实现的任务。通常,实时图像处理最好在NDK级别完成。要显示黑色和白色,您仍然可以在java中执行此操作。包含帧数据的字节数组是YUV格式,其中Y平面首先出现。所以,如果你只得到Y平面(第一个宽度x高度字节),它就已经为你提供了黑色和白色。

我通过广泛的工作和试验确实实现了这一目标。您可以在google上查看该应用: https://play.google.com/store/apps/details?id=com.nm.camerafx