实时处理Android相机帧

27

我正在尝试创建一个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个回答

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
将YUV图像转换为带有中间JPEG的位图是否会发生这种情况?几乎不是可行的实时解决方案。 - Rekin
我强烈建议不要这样做。在Android上使用OpenCV会增加项目的复杂性,还需要大约10MB大小的本地库。Android确实拥有完成OP所需的所有设施。OpenCV是一个很棒的库,但对于这种情况来说过于臃肿了。 - protectedmember

3

我现在注意到这篇非常古老的文章。

'11年发布的API功能要少得多。今天,人们可以使用SurfaceTexture(请参见示例)在一些操作之后预览相机流。


-2

目前 Android 工具/ API 有限,要实现实时图像处理不是一件容易的事情。通常在 NDK 层级别上处理图片效果更好。如果只是想显示黑白效果,仍然可以使用java完成。该字节数组包含帧数据以 YUV 格式存储,其中 Y-Plane 首先出现。因此,如果您只获取 Y-Plane (首个宽度 x 高度字节),那么这已经给您提供了黑白效果。

我通过大量工作和试验实现了这一点。您可以在谷歌应用商店查看该应用: https://play.google.com/store/apps/details?id=com.nm.camerafx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接