为什么使用JavaFX显示1920x1080视频的速度非常慢

时间:2017-07-03 17:14:11

标签: javafx video-processing

我正在尝试使用JavaFX逐帧播放分辨率为1920x1080的视频,因为我想在每个帧上应用一些修改,但是当我启动程序时,我看到视频播放速度非常慢。

原因是什么?我该如何改进呢?

我是怎么做到的:

@Override
public void run() {
    synchronized (this) {
        while (runnable) {
            if (webSource.grab()) {
                try {
                    webSource.retrieve(frame);
                    numberOfFrames++;
                    Mat resize_blur_Img = frame.clone();

                    Imgproc.GaussianBlur(resize_blur_Img, resize_blur_Img, new Size(9, 9), 2, 2);


                    Mat fgMask = new Mat();
                    mog2.apply(resize_blur_Img, fgMask, 0.01);

                    Mat output = new Mat();
                    Mat closeElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(7, 7),
                            new Point(3, 3));
                    Imgproc.morphologyEx(fgMask, output, Imgproc.MORPH_CLOSE, closeElement);
                    Imgproc.morphologyEx(output, output, Imgproc.MORPH_CLOSE, closeElement);

                    Imgproc.threshold(output, output, 127, 255, Imgproc.THRESH_BINARY);
                    contourImg = new Mat();
                    contourImg = output.clone();
                    findContours(contourImg);

                    Imgcodecs.imencode(".bmp", frame, mem);
                    image = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
                    BufferedImage bufferedImage = (BufferedImage) image;
                    imgView.setImage(SwingFXUtils.toFXImage(bufferedImage, null));

                    Imgcodecs.imencode(".bmp", output, mem2);
                    image2 = ImageIO.read(new ByteArrayInputStream(mem2.toArray()));
                    BufferedImage bufferedImage2 = (BufferedImage) image2;
                    imgViewLeft3.setImage(SwingFXUtils.toFXImage(bufferedImage2, null));

                    if (runnable == false) {
                        System.out.println("Going to wait() -> DaemonThread");
                        this.wait();
                    }
                } catch (Exception ex) {
                    System.out.println("Error");
                }
            } else {
                runnable = false;
            }
        }
    }
}

0 个答案:

没有答案