安卓Yuv420sp到ARGB的OpenCV转换

4
我正在尝试从手机的previewcallback发送原始图像到PC进行图像处理。我使用OpenCV库进行图像处理。目前,我只是在previewcallback中编写了一个函数来将字节数组保存到文件中,然后将文件复制到PC上。我编写了一个简单的程序来首先读取文件并将其保存到内存中,然后直接将数据复制到IplImage.imageData中。但是我总是得到一张垃圾图片。
我使用在网上找到的这个函数来进行YUV420SP到ARGB之间的转换。感谢你的帮助。
void decodeYUV420SP(int* rgb, char* yuv420sp, int width, int height) {
    int frameSize = width * height;

    for (int j = 0, yp = 0; j < height; j++) {
        int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
        for (int i = 0; i < width; i++, yp++) {
            int y = (0xff & ((int) yuv420sp[yp])) - 16;
            if (y < 0) y = 0;
            if ((i & 1) == 0) {
                v = (0xff & yuv420sp[uvp++]) - 128;
                u = (0xff & yuv420sp[uvp++]) - 128;
            }

            int y1192 = 1192 * y;
            int r = (y1192 + 1634 * v);
            int g = (y1192 - 833 * v - 400 * u);
            int b = (y1192 + 2066 * u);

            if (r < 0) r = 0; else if (r > 262143) r = 262143;
            if (g < 0) g = 0; else if (g > 262143) g = 262143;
            if (b < 0) b = 0; else if (b > 262143) b = 262143;

            rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
        }
    }
}

1
请引用您的来源,不要只是复制粘贴别人的代码。它看起来像是从这里来的:KetaiCamera.java - weston
4个回答

2
您可以使用OpenCV4Android转换器:
Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGBA);

2

YUV420图像的形状很奇怪,Y(亮度)部分的宽度和高度是整个图像的一半,但接下来是Cr和Cb部分,宽度为一半,高度为四分之一。
通常它们不会直接显示,所以没有人关心这种奇怪的打包方式。

结果是一张彩色图像每像素只有1.5字节,而不是RGB。


谢谢你的回复,马丁。 我只是想确保我得到了正确的结构。所以假设我有一张640480的图像,在YUV420字节缓冲区中,前320240个字节将对应于Y部分。然后是320*120个Cr和Cb字节,因此数据看起来像这样, YYYYYYYYYYY.......CrCbCrCb...? 另外,你能否指出一些好的来源,告诉我如何将其重构回原始大小的RGB图像,因为在YUV420格式中我们失去了很多信息? - user433430
您可以使用任何方法来将数据重新缩放到全分辨率(双线性/双三次等)。对于自然场景,由于您的眼睛感知颜色的方式,您不会失去太多。- 抱歉回复晚了,刚看到。 - Martin Beckett
谢谢!我在谷歌上搜索了几个小时,才找到了编写自己的转换器的方法。这是我唯一需要知道的事情! - Marcus Johansson

0
你成功完成了吗?如果没有,请看一下android-opencv项目——他们有一个将Android YUV转换为BGR的方法。

0

根据我的理解,如果一个图像大小为640x480。在YUV420字节缓冲区中,前640x480字节将对应于Y部分。之后是320x480字节的Cb和Cr交替排列,因此先是640x480字节的Y,然后是下采样为2x2网格的CbCr的320x480字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接