2014-12-17 6 views
0

while에서 이미지 뷰를 다시 그릴 수 없습니다. 한 번에 하나의 이미지로 작업하지 않고. 이미지 재 드로잉을 위해 다른 스레드를 사용하려고하면 작업이 될 수도 있지만, 어떻게 만들지는 모른다. ItachiUchiha이 컨트롤러는 일부 스레딩 문제가 지적했듯이 아무도 내가 그것을 채굴 할 수 방법 ^)JavaFX ImageView가 단계를 다시 그려 넣습니다.

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 
    }  

} 
+0

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm 귀하의'while' 루프는 자바 FX 애플리케이션 스레드가 화면에 아무것도 페인트 말도없이 무한대로 실행됩니다. 응용 프로그램 스레드에서 스레드를 무한대로 실행하면 안됩니다. – ItachiUchiha

+0

내 스레드가 다른 클래스에 있어야합니까? 컨트롤러에 없습니까? 컨트롤러에서 할 수있는 요소로 작업하십시오. 어떻게 장면에서 이미지를 설정할 수 있습니까? –

답변

0

나에게 예를 제공 할 수 있습니다. 대부분의 다른 GUI 툴킷과 마찬가지로 JavaFX는 단일 스레드 GUI 툴킷이므로 GUI 스레드를 차단할 수있는 모든 시간 소모적 인 작업이 다른 곳에서 수행되어야합니다. 오타이셜 노하우가 그려집니다.

코드를 올바르게 읽으면 WebCamLive()은 매초마다 웹캠의 스냅 샷을 찍습니까? 스냅 샷은 오히려 빠르게 촬영하는 경우 다음과 같이, 당신은 타임 라인에이 작업을 수행 할 수

  1. 을 : 스냅 샷은 약간의 시간이 소요 Javafx Not on fx application thread when using timer
  2. 경우 지금 당신은 자바 FX와 함께이 작업을 수행하는 방법에 대한 두 가지 옵션이 있습니다 캡처하려면 ScheduledService을 작성하는 것이 좋습니다.

자바 FX의 스레딩에 대한 자세한 내용은 여기 자습서를 참조하십시오

+0

확인. 이해할 수 없다 : javafx 다시 그리기 불가능한 작업입니까? 아니면 장면을 만들 수 있습니까? 자체 스레드가있을 수 있으며 이미지 비디오를 다시 그려 볼 수 있습니까? –

+0

물론 "다시 그리기"할 수 있지만 UI 스레드를 차단할 수는 없습니다. 내 대답은 두 가지 가능한 해결책을 설명했다 .. – eckig