Android onPreviewFrame YUV灰度倾斜
我正试图从一个表面视图中获取照片,在那里我有摄像头视图运行 我已经在PreviewFrame上实现了,正如调试所示,它被正确调用 我现在面临的问题是,由于我在方法中收到的字节[]数据,它在YUV空间颜色NV21中,我试图将其转换为灰度以生成位图,然后将其存储到文件中 我遵循的转换过程是: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
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
}
}