Convert Android camera2 api YUV_420_888 to RGB

后端 未结 7 893
暗喜
暗喜 2020-12-14 02:56

I am writing an app that takes the camera feed, converts it to rgb, in order to do some processing.

It works fine on the old camera implementation which uses NV21 Y

7条回答
  •  青春惊慌失措
    2020-12-14 03:30

    Camera2 YUV_420_888 to RGB Mat(opencv) in Java

    @Override
        public void onImageAvailable(ImageReader reader){
            Image image = null;
    
            try {
                image = reader.acquireLatestImage();
                if (image != null) {
    
                    byte[] nv21;
                    ByteBuffer yBuffer = mImage.getPlanes()[0].getBuffer();
                    ByteBuffer uBuffer = mImage.getPlanes()[1].getBuffer();
                    ByteBuffer vBuffer = mImage.getPlanes()[2].getBuffer();
    
                    int ySize = yBuffer.remaining();
                    int uSize = uBuffer.remaining();
                    int vSize = vBuffer.remaining();
    
                    nv21 = new byte[ySize + uSize + vSize];
    
                    //U and V are swapped
                    yBuffer.get(nv21, 0, ySize);
                    vBuffer.get(nv21, ySize, vSize);
                    uBuffer.get(nv21, ySize + vSize, uSize);
    
                    Mat mRGB = getYUV2Mat(nv21);
    
    
    
                }
            } catch (Exception e) {
                Log.w(TAG, e.getMessage());
            }finally{
                image.close();// don't forget to close
            }
        }
    
    
    
        public Mat getYUV2Mat(byte[] data) {
        Mat mYuv = new Mat(image.getHeight() + image.getHeight() / 2, image.getWidth(), CV_8UC1);
        mYuv.put(0, 0, data);
        Mat mRGB = new Mat();
        cvtColor(mYuv, mRGB, Imgproc.COLOR_YUV2RGB_NV21, 3);
        return mRGB;
    }
    

提交回复
热议问题