4-канальный IplImage javacv для растрового изображения Android

Я пытаюсь записать видео, проверяя каждый кадр предварительного просмотра камеры на растровое изображение с качеством ARGB_8888. Поскольку для этого требовалось 4 канала, я также создал IplImage с каналом 4. Теперь на выходе есть две основные проблемы:

1) Растровое изображение, созданное из IplImage, имеет оттенки серого. даже если я конвертировал его из BGR2RGBA. 2) 4-канальный IplImage дал мне растровое изображение (разделенное на 4 части) с таким же экраном.

Позвольте мне разместить мой код здесь.

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {

        if (yuvIplimage != null && recording) {
            videoTimestamp = 1000 * (System.currentTimeMillis() - startTime);


            // Where imagewidth = 640 and imageheight  = 480 (As per camera preview size)
            // Create the yuvIplimage 

            IplImage yuvimage = IplImage.create(imageWidth, imageHeight * 3 / 2, IPL_DEPTH_8U, 2);
            yuvimage.getByteBuffer().put(data);


            IplImage rgbimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 3);
            opencv_imgproc.cvCvtColor(yuvimage, rgbimage, opencv_imgproc.CV_YUV2BGR_NV21);

            Bitmap bitmap = Bitmap.createBitmap(imageWidth, imageHeight,Bitmap.Config.RGB_565);
            bitmap.copyPixelsFromBuffer(rgbimage.getByteBuffer());

            //Save file to SDCARD------------

            File file = new File(Environment.getExternalStorageDirectory(),
                    "rgbbitmap.png");
            FileOutputStream fOut;
            try {
                fOut = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
                fOut.flush();
                fOut.close();
                // mybitmap.recycle();

            } catch (Exception e) { // TODO

            }       


            try {

                // Get the correct time
                recorder.setTimestamp(videoTimestamp);

                // Record the image into FFmpegFrameRecorder
                recorder.record(yuvimage);

            } catch (FFmpegFrameRecorder.Exception e) {
                Log.v(LOG_TAG, e.getMessage());
                e.printStackTrace();
            }
        }
    }

Кроме того, найдите приведенное ниже растровое изображение, поскольку я получаю результат с 4 частями одного и того же кадра.

введите здесь описание изображения

Что не так с моим кодом или чего мне не хватает? Дайте мне знать ваши лучшие предложения.

Спасибо,


person Jai    schedule 18.04.2014    source источник
comment
Данные предварительного просмотра камеры обычно имеют формат YUV, поэтому нам нужно преобразовать их в RGB, например, как я показал в ответе здесь: stackoverflow.com/a/12870556/523744   -  person Samuel Audet    schedule 20.04.2014
comment
@SamuelAudet: Привет, Сэмюэл, спасибо за твой ответ. Но это не работает. Для вашего решения я должен взять растровый объект с конфигурацией RGB_565, потому что мы создали IPLImage с каналом 3. N он дает выходное изображение, как я обновил.   -  person Jai    schedule 20.04.2014
comment
@SamuelAudet: Пожалуйста, проверьте мой обновленный код и изображение.   -  person Jai    schedule 20.04.2014
comment
@SamuelAudet: я должен принудительно использовать растровое изображение для RGB_565, я не могу использовать ARGB_8888. Но я думаю, что мы можем получить качество растрового изображения, используя только ARGB_8888.   -  person Jai    schedule 20.04.2014
comment
cvCvtColor() также поддерживает такие конверсии, как CV_BGR2BGR565, попробуйте их.   -  person Samuel Audet    schedule 21.04.2014
comment
@SamuelAudet: да, но в основном я хочу преобразовать его в ARGB, чтобы мы могли управлять его качеством. Если мы возьмем растровое изображение RGB_565, я смогу все решить. но основная проблема заключается в том, чтобы преобразовать этот iplimage в ARGB, чтобы я мог создать растровое изображение с ARGB_8888.   -  person Jai    schedule 21.04.2014