Некорректное преобразование кадров из формата YUV_420_888 в NV21 в программе чтения изображений

Я настроил свой код, чтобы получить поток YUV_420_888 кадров с камеры моего устройства, используя объект imageReader и остальную часть известного camera2 API. Теперь мне нужно преобразовать эти кадры в формат NV21 пикселей и вызвать нативную функцию, которая ожидает, что кадр в этом формате будет выполнять определенные вычисления. Это код, который я использую внутри обратного вызова средства чтения изображений, чтобы переупорядочить байты кадра:

        ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader mReader) {
                Image image = null;
                image = mReader.acquireLatestImage();
                if (image == null) {
                    return;
                }                           

                byte[] bytes = convertYUV420ToNV21(image);

                nativeVideoFrame(bytes);
                image.close();   
            }
        };

private byte[] convertYUV420ToNV21(Image imgYUV420) {

    byte[] rez;

    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer();
    ByteBuffer buffer1 = imgYUV420.getPlanes()[1].getBuffer();
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer();

    int buffer0_size = buffer0.remaining();
    int buffer1_size = buffer1.remaining();
    int buffer2_size = buffer2.remaining();

    byte[] buffer0_byte = new byte[buffer0_size];
    byte[] buffer1_byte = new byte[buffer1_size];
    byte[] buffer2_byte = new byte[buffer2_size];
    buffer0.get(buffer0_byte, 0, buffer0_size);
    buffer1.get(buffer1_byte, 0, buffer1_size);
    buffer2.get(buffer2_byte, 0, buffer2_size);


    ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
    try {
        outputStream.write( buffer0_byte );
        outputStream.write( buffer1_byte );
        outputStream.write( buffer2_byte );
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    rez = outputStream.toByteArray( );   

    return rez;
}

Но я не знаю почему, получившийся кадр "перевернут" в горизонтальном направлении. Другими словами, когда я перемещаю камеру вправо, кадр после описанной процедуры упаковки перемещается влево, как если бы датчик был помещен в противоестественное положение.

Я надеюсь, вы понимаете, что я имею в виду

Спасибо,

JM


person user3417052    schedule 18.08.2016    source источник
comment
Синий и красный цвета меняются местами после convertYUV420ToNV21 и compressToJpeg.   -  person Volodymyr Kulyk    schedule 19.10.2016
comment
@VladimirKulyk при записи в выходной поток измените порядок на 0/2/1, чтобы отменить замену синего и красного   -  person AngeloS    schedule 23.04.2017


Ответы (1)


Это нормально, когда камера создает зеркальное изображение. Если вы не хотите, чтобы он был зеркальным - вам нужно выполнить горизонтальное зеркалирование, меняя местами пиксели в каждой строке.

person Anton Malyshev    schedule 18.08.2016
comment
Вы спасаете мой день. Это была подсказка, которую я искал - person user3417052; 19.08.2016