JavaFX ImageView重绘阶段

JavaFX ImageView重绘阶段,javafx,imageview,repaint,Javafx,Imageview,Repaint,我无法在一段时间内重新绘制imageview。如果没有while,则只能处理单个图像。也许这将是工作,如果我试图使用不同的线程图像重画,但我不知道如何使它。任何人都可以给我举个例子,说明我如何使它可行^ package videostepone; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.ByteArrayInputStream; import java.n

我无法在一段时间内重新绘制imageview。如果没有while,则只能处理单个图像。也许这将是工作,如果我试图使用不同的线程图像重画,但我不知道如何使它。任何人都可以给我举个例子,说明我如何使它可行^

package videostepone;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;

/**
 *
 * @author Анютка
 */
public class FXMLDocumentController implements Initializable {

    @FXML
    private Label label;

    @FXML
    private ImageView imageCam1;

    @FXML
    private void handleButtonAction(ActionEvent event) throws InterruptedException {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        //System.loadLibrary("opencv_java2410");

        System.out.println("You clicked me!");
        label.setText("Hello World!");

        WebCamLive();
    }

    // Делает снимок с веб-камеры
    private void WebCamShot() throws InterruptedException
    {
        VideoCapture camera = new VideoCapture(0);
        Thread.sleep(1000);
        camera.open(0); //Useless
        if(!camera.isOpened()){
            System.out.println("Camera Error");
        }
        else{
            System.out.println("Camera OK?");
        }

        Mat frame = new Mat();
        camera.read(frame);

        System.out.println("Captured Frame Width " + frame.width());
        Highgui.imwrite("camera.jpg", frame);

        System.out.println("OK");
    }

    // Видео с веб-камеры
    private void WebCamLive() throws InterruptedException
    {
        int i = 0;
        VideoCapture camera = new VideoCapture(0);
        Thread.sleep(1000);
        camera.open(0); //Useless
        if(!camera.isOpened()){
            System.out.println("Camera Error");
        }
        else{
            System.out.println("Camera OK?");
        }

        Mat frame = new Mat();

        CascadeClassifier faceDetect = new CascadeClassifier("./res/haarcascade_frontalface_default.xml");


        while (true)
        {
            camera.read(frame);
            if (!frame.empty())
            {
                setImageOn(matToImage(frame));

//                label.setText("1");
//                Thread.sleep(6000);
//                label.setText("-");
                System.out.println(i++);
            }
        }
    }

    @FXML
    private void setImageOn(Image img)
    {
        imageCam1.setImage(img);
    }

    private Image matToImage(Mat m){
        MatOfByte memory = new MatOfByte();
        try {
            Highgui.imencode(".jpg", m, memory);
            return (new Image(new ByteArrayInputStream(memory.toArray())));
        } catch (Exception e) {
            System.out.println(e);
        }
        return (new Image(new ByteArrayInputStream(memory.toArray())));
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}

正如ItachiUchiha指出的,您的控制器存在一些线程问题。 与大多数其他GUI工具包一样,JavaFX是一个单线程GUI工具包,因此所有可能阻塞GUI线程的耗时任务都应该在其他地方执行。三分之二的东西都会被粉刷

如果我正确阅读了您的代码,WebCamLive会每秒拍摄一次网络摄像头的快照吗? 现在,关于如何使用JavaFX执行此操作,您有两个选项:

如果快照拍摄得相当快,则可以使用时间线来完成此操作,如下所示: 如果快照需要一些时间才能捕获,我建议编写一个快照。
有关JavaFX线程的更多信息,请参阅此处的教程:

while循环无限运行,而不让JavaFX应用程序线程在屏幕上绘制任何内容。应用程序线程上不应该有无限运行的线程。我的线程必须在其他类中?不在控制器中?使用控制器中的元素,如何在场景中设置图像?好的。我不明白:在javafx中重画是不可能的任务?或者我可以制造场面?这可能有自己的线程,并显示我重画图像视频?当然你可以重画,但你可以或更好地不应该阻止UI线程。我在回答中概述了两种可能的解决办法。。