【问题标题】:onPreviewFrame YUV grayscale skewedonPreviewFrame YUV 灰度倾斜
【发布时间】:2013-05-24 14:47:14
【问题描述】:

我正在尝试从运行相机视图的表面视图中获取图片,

我已经实现了 onPreviewFrame,它被正确调用,正如调试显示的那样。

我现在面临的问题,因为我在方法中收到的字节[]数据,它是YUV空间颜色(NV21),我试图将其转换为灰度以生成位图然后存储它放入文件中。

我正在关注的转换过程是:

 public Bitmap convertYuvGrayScaleRGB(byte[] yuv, int width, int height) {

    int[] pixels = new int[width * height];

    for (int i = 0; i < height*width; i++) {
        int grey = yuv[i] & 0xff;
        pixels[i] = 0xFF000000 | (grey * 0x00010101);
    }

    return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888);

  }

将其存储到文件的导入过程是:

Bitmap bitmap = convertYuvGrayScaleRGB(data,widht,heigth);

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 50, bytes);

        File f = new File(Environment.getExternalStorageDirectory()
                                    + File.separator + "test.jpg");

    Log.d("Camera", "File: " + f.getAbsolutePath());
    try {
        f.createNewFile();
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());
        fo.close();
        bitmap.recycle();
        bitmap = null;
         } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

尽管如此,我得到的结果如下:

【问题讨论】:

    标签: android image computer-vision yuv


    【解决方案1】:

    我在您的代码中找不到任何明显的错误,但我之前已经遇到过这种倾斜的图像。当这件事发生在我身上时,原因是:

    • 在代码中的某个位置,图像的宽度和高度被交换了,
    • 或者您尝试转换的原始图像有填充,在这种情况下,除了宽度和高度之外,您还需要 stride

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您正在转换的图像的宽度可能不均匀。在这种情况下 它在内存中填充。

      让我看看文档...

      这似乎比这更复杂。如果你想让你的代码像现在这样工作,你必须有宽度 16 的倍数。

      来自文档:

      public static final int YV12

      在 API 级别 9 Android YUV 格式中添加。

      这种格式暴露给软件解码器和应用程序。

      YV12 是 4:2:0 YCrCb 平面格式,由 WxH Y 平面组成 其次是 (W/2) x (H/2) Cr 和 Cb 平面。

      这种格式假设

      偶数宽度 偶数高度 16 像素的水平步幅倍数 垂直步幅等于高度 y_size = stride * height c_stride = ALIGN(stride/2, 16) c_size = c_stride * height/2 size = y_size + c_size * 2 cr_offset = y_size cb_offset = y_size + c_size

      【讨论】:

        【解决方案3】:

        我刚刚在 S3 上遇到了这个问题。我的问题是我为预览使用了错误的尺寸。我以为相机是 16:9,而实际上是 4:3。

        使用 Camera.getParameters().getPreviewSize() 查看输出的内容。

        【讨论】:

          【解决方案4】:

          我做了这个:

          int frameSize = width * height;
          for (int i = 0; i < height; i++) {
              for (int j = 0; j < width; j++) {
                  ret[frameSize + (i >> 1) * width + (j & ~1) + 1] = 127; //U
                  ret[frameSize + (i >> 1) * width + (j & ~1) + 0] = 127; //V
              }
          }
          

          如此简单,但它的效果非常好而且速度非常快;)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-23
            • 2016-02-03
            • 1970-01-01
            • 2019-12-15
            • 1970-01-01
            • 2012-03-08
            • 2020-02-22
            相关资源
            最近更新 更多