将YUV图像转换为RGB会产生绿色图像

时间:2015-10-03 20:54:45

标签: android opencv camera2

作为使用Image API进行捕获的结果,我获得了YUV_420_888格式的Camera2。我需要将图像转换为RGB格式,但生成的图像的颜色是错误的。

enter image description here

这是使用OpenCV执行转换的功能:

@TargetApi(Build.VERSION_CODES.KITKAT)
    public static Bitmap createBitmapFromYUV420(Image image) {
        Image.Plane[] planes = image.getPlanes();

        byte[] imageData = new byte[image.getWidth() * image.getHeight() * ImageFormat.getBitsPerPixel(ImageFormat.YUV_420_888) / 8];

        ByteBuffer buffer = planes[0].getBuffer();
        int lastIndex = buffer.remaining();
        buffer.get(imageData, 0, lastIndex);
        int pixelStride = planes[1].getPixelStride();

        for (int i = 1; i < planes.length; i++) {
            buffer = planes[i].getBuffer();
            byte[] planeData = new byte[buffer.remaining()];
            buffer.get(planeData);

            for (int j = 0; j < planeData.length; j += pixelStride) {
                imageData[lastIndex++] = planeData[j];
            }
        }

        Mat yuvMat = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CvType.CV_8UC1);
        yuvMat.put(0, 0, imageData);

        Mat rgbMat = new Mat();
        Imgproc.cvtColor(yuvMat, rgbMat, Imgproc.COLOR_YUV420p2RGBA);

        Bitmap bitmap = Bitmap.createBitmap(rgbMat.cols(), rgbMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(rgbMat, bitmap);

        return bitmap;
    }

我认为3个平面的字节附加到字节数组中的方式是正确的,所以错误可能在其他地方?

解决

显然,Android API 21中存在一个错误,导致U和V数组除了几个字节外都满0,从而产生绿色图像。 API 22已解决此问题。

0 个答案:

没有答案