Исходные объекты BufferedImage и преобразованные объекты BufferedImage не дают одинакового результата - PullRequest
0 голосов
/ 25 апреля 2018

Я пишу тестовый процесс, который будет действовать как дубликат оригинальных процессоров

Мой класс примет видеофайл в качестве входных данных, а затем сгенерирует информацию, относящуюся к кадрам

Java2DFrameConverter bufferedImgConverter = new Java2DFrameConverter();
String filePath = "Palivala.mp4";
File tsFile = new File(filePath);
FFmpegFrameGrabber ffmpegFrameGrabber = new FFmpegFrameGrabber(tsFile);
OpenCVFrameConverter matConverter = new OpenCVFrameConverter.ToMat();
ffmpegFrameGrabber.start();
try {
        while ((frame = ffmpegFrameGrabber.grabFrame(false, true, true, false)) != null) {
            BufferedImage bufferedImage = bufferedImgConverter.convert(frame);
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            try {
                ImageIO.write(bufferedImage, "jpeg", buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte frameAsBytes[] = buffer.toByteArray();
            start = System.currentTimeMillis();
            BufferedImage bufferedImage2 = ImageIO.read(new ByteArrayInputStream(frameAsBytes));
            Mat mat = matConverter.convertToMat(bufferedImgConverter.convert(bufferedImage)); //problem is here, I explained problem at the bottom
            if (mat.empty())
                continue;
            if (prevMat != null) {
                // here I am generating required data and sending to the method which I want to test
            }
            prevMat = mat.clone();
            numProcessedFrames++;

        }
    } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
        System.out.println("Exception while grabbing frames for segment " + e);
    }
ffmpegFrameGrabber.stop();

Если я использую начальныйBufferedImage объект (bufferedImage) работает должным образом, но когда я использую преобразованный BufferedImage объект (bufferedImage2), он не работает должным образом, т. Е. Фактически мой процесс находит информацию о замороженных кадрах, если видео заморожено на 20 секунд

  • Это дает окончательный вывод как 20 секунд (если я использую bufferedImage объект)

  • Это дает окончательный вывод как 14 секунд (если я использую bufferedImage2 object)

Я генерирую standard-deviation, используя mat объект, который получает от

Mat mat = matConverter.convertToMat(bufferedImgConverter.convert(bufferedImage)); //it works fine

Mat mat = matConverter.convertToMat(bufferedImgConverter.convert(bufferedImage2)); its the problem

Я получаю информацию в замороженном кадре, используя standard-deviationи мой standard-deviation-threshold равен 90

  • standard-deviation постоянно ниже 90 Если я использую bufferedImage объект

  • standard-deviation постоянно ниже 90 до 6 секунд, затем для 1 кадра я получаю значение standard-deviation как [118.0, 118.0, 119.0], затем next кадр снова ниже 90 Если я использую bufferedImage2 объект

...