我正在尝试创建一个可实时处理相机帧的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数组,那么如何指定宽度和高度?

最佳答案

您可以从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);
在表面上渲染这些PreviewFrames以及所涉及的最佳实践是一个新的维度。 =)

10-06 05:30