实时处理Android相机帧

发布于 2024-10-31 21:58:28 字数 651 浏览 3 评论 0原文

我正在尝试创建一个能够实时处理相机帧的 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);
}

byte[] 帧数组的第一个 [width*height] 值是亮度(灰度)值。提取它们后,如何将它们作为图像显示在屏幕上?它也不是二维数组,那么我如何指定宽度和高度?

I'm trying to create an Android application that will process camera frames in real time. To start off with, I just want to display a grayscale version of what the camera sees. I've managed to extract the appropriate values from the byte array in the onPreviewFrame method. Below is just a snippet of my code:

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);
}

The first [width*height] values of the byte[] frame array are the luminance (greyscale) values. Once I've extracted them, how do I display them on the screen as an image? Its not a 2D array as well, so how would I specify the width and height?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

╰沐子 2024-11-07 21:58:28

您可以从 OpenCV4Android SDK 获取广泛的指导。查看他们提供的示例,特别是教程 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 = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

在表面上渲染这些预览帧以及所涉及的最佳实践是一个新的维度。 =)

You can get extensive guidance from the OpenCV4Android SDK. Look into their available examples, specifically Tutorial 1 Basic. 0 Android Camera

But, as it was in my case, for intensive image processing, this will get slower than acceptable for a real-time image processing application.
A good replacement for their onPreviewFrame 's byte array conversion to YUVImage:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

Create a rectangle the same size as the image.

Create a ByteArrayOutputStream and pass this, the rectangle and the compression value to compressToJpeg():

ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

Rendering these previewFrames on a surface and the best practices involved is a new dimension. =)

物价感观 2024-11-07 21:58:28

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

'11 中可用的 API 更加有限。今天,我们可以使用 SurfaceTexture(请参阅示例)在(一些)操作后预览相机流。

This very old post has caught my attention now.

The API available in '11 was much more limited. Today one can use SurfaceTexture (see example) to preview camera stream after (some) manipulations.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文