YUV_nv21 android Предварительный просмотр Кадр в opencv_core.Mat RGB-изображение, затем инвертируйте RGB-мат в YUV_nv21 Кадр для записи

Я довольно долго искал ответ на этот вопрос, и, поверьте мне, я очень удивлен, что ничего еще не нашел. Поэтому, рискуя получить огромный контроль от моего имени в поисках ответа, я обращаюсь к тем, у кого есть знания, время и доброта, чтобы хотя бы подтолкнуть меня в правильном направлении.

Признаюсь, что я новичок в opencv и компьютерном зрении в целом, но я смог протестировать свою концепцию на платформе windows / python и хотел бы попробовать ее в среде Android.

Используя пример RecordActivity.java в качестве основы, я хотел бы в следующем коде

Шаг 1

Преобразуйте кадр предварительного просмотра камеры телефона yuv_nv21 для Android (yuvImage) в RGB-изображение opencv_core.Mat (rgbImageMat), а затем

Шаг 2

RGB-изображение opencv_core.Mat (rgbImageMat) преобразует его обратно в кадр предварительного просмотра андроида yuv_nv21 (tmpyuvImage), который записывается в оригинальном кадре yuvImage.

Для первого шага я использую следующее преобразование

opencv_imgproc.cvtColor(yuvImageMat,rgbImageMat,COLOR_YUV420sp2RGB)

Логически для обратного шага я использую

opencv_imgproc.cvtColor(rgbImageMat,yuvImageMat,COLOR_RGB2YUV_***)

Я пробовал различные доступные альтернативы COLOR_RGB2YUV _ ***, но по какой-то причине обратное преобразование не происходит. Что я делаю неправильно???? Кто-нибудь знает, каким должен быть этот Цветовой код????

Благодарю вас!!

Исходный код следует

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

        Log.i(LOG_TAG,"onPreviewFrame");
        if (audioRecord == null || audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
            startTime = System.currentTimeMillis();
            return;
        }
        if (RECORD_LENGTH > 0) {
            int i = imagesIndex++ % images.length;
            yuvImage = images[i];
            timestamps[i] = 1000 * (System.currentTimeMillis() - startTime);
        }

        /* get video data */
        if (yuvImage != null && recording) {
            ((ByteBuffer)yuvImage.image[0].position(0)).put(data);
            /**********************************************************************************/
    //Convert YUV Frame to RGB Mat
            Log.i(LOG_TAG,"getPreviewFormat() : "+camera.getParameters().getPreviewFormat()); //=NV21
        //Set up the Frame <=> Mat conversion
            OpenCVFrameConverter.ToMat coverter = new OpenCVFrameConverter.ToMat();
            opencv_core.Mat yuvImageMat = new opencv_core.Mat();
        //yuvImage Frame to Mat
            Frame tmpyuvImage = new Frame();
            tmpyuvImage=yuvImage.clone();
            yuvImageMat = coverter.convert(tmpyuvImage);//yuvImage Frame to Mat
        //yuvImageMat to RGB Mat
            opencv_core.Mat rgbImage = new opencv_core.Mat();
            opencv_imgproc.cvtColor(yuvImageMat,rgbImage,CV_YUV420sp2RGB);//CV_YUV420sp2RGB,COLOR_YUV2RGB_NV21=COLOR_YUV420sp2RGB,COLOR_YUV2RGB_NV21,COLOR_YCrCb2RGB
    //Do the reverse conversion
            Log.i(LOG_TAG,"#### Begin  reverse conversion ####");
            opencv_imgproc.cvtColor(rgbImage,yuvImageMat,COLOR_BGR2YUV_YV12);//What is the inverse COLOR code to the CV_YUV420sp2RGB one 

        //yuvImageMat to  Frame
            tmpyuvImage = coverter.convert(yuvImageMat);//Mat to yuvImage

            /**********************************************************************************/
            if (RECORD_LENGTH <= 0)
                try {
                        Log.v(LOG_TAG,"Writing Frame");
                        long t = 1000 * (System.currentTimeMillis() - startTime);
                        if (t > recorder.getTimestamp()) {
                            recorder.setTimestamp(t);
                        }
                        if(addFilter) {
                            filter.push(yuvImage);
                            Frame frame2;
                            while ((frame2 = filter.pull()) != null) {
                                recorder.record(frame2);
                            }
                        } else {
                            Log.i(LOG_TAG,"yuvImage.imageChannels before rec :"+Integer.toString(yuvImage.imageChannels));                               
                            //recorder.record(yuvImage);//Argument has to be of type Frame
                            recorder.record(tmpyuvImage);
                        }
                    } catch (FFmpegFrameRecorder.Exception | FrameFilter.Exception e) {
                Log.v(LOG_TAG,e.getMessage());
                e.printStackTrace();
            }
        }
    }

0 ответов

Другие вопросы по тегам