Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onPreviewFrame YUV灰度倾斜_Android_Image_Computer Vision_Yuv - Fatal编程技术网

Android onPreviewFrame YUV灰度倾斜

Android onPreviewFrame YUV灰度倾斜,android,image,computer-vision,yuv,Android,Image,Computer Vision,Yuv,我正试图从一个表面视图中获取照片,在那里我有摄像头视图运行 我已经在PreviewFrame上实现了,正如调试所示,它被正确调用 我现在面临的问题是,由于我在方法中收到的字节[]数据,它在YUV空间颜色NV21中,我试图将其转换为灰度以生成位图,然后将其存储到文件中 我遵循的转换过程是: public Bitmap convertYuvGrayScaleRGB(byte[] yuv, int width, int height) { int[] pixels = new int[wi

我正试图从一个表面视图中获取照片,在那里我有摄像头视图运行

我已经在PreviewFrame上实现了,正如调试所示,它被正确调用

我现在面临的问题是,由于我在方法中收到的字节[]数据,它在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);

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


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

在代码中的某个点,图像的宽度和高度被交换, 或者,您尝试转换的原始图像具有填充,在这种情况下,除了宽度和高度之外,您还需要跨步。
希望这有帮助

您正在转换的图像的宽度可能不均匀。那样的话 它被填充在内存中

让我看看这些文件

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

从文档中:

公共静态最终int YV12

以API 9级Android YUV格式添加

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

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

此格式假定

偶数宽度偶数高度16像素的水平跨距倍数 垂直步幅等于高度y_size=步幅*高度 c_步幅=直线步幅/2,16 c_尺寸=c_步幅*高度/2尺寸= y_尺寸+c_尺寸*2 cr_偏移=y_尺寸cb_偏移=y_尺寸+c_尺寸


我只是觉得S3有点问题。我的问题是我在预览时使用了错误的尺寸。我假设摄像机是16:9,实际上是4:3

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

我做了以下操作:

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
    }
}
这么简单,但它的工作真的很好,很快

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