2

APIを使用したキャプチャの結果として、形式で を取得していImageます。画像を RGB 形式に変換する必要がありますが、結果の画像の色が正しくありません。YUV_420_888Camera2

ここに画像の説明を入力

これは、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 で修正されました。

4

0 に答える 0