2015-09-21 1 views
0

Le titre semble un peu confus, mais je vais tout expliquer.JPanel.getGraphics équivalent en JavaFx à utiliser avec OpenCV

Je développe un projet où je montre l'image capturée par une webcam dans un JPanel, Java Swing. Maintenant, je dois intégrer cela avec JavaFx. J'ai un contrôleur où j'ai la méthode startRecording, qui initialise le cameraThread et indique à la classe Camera de démarrerRecording, à l'intérieur Camera class a une méthode DrawFrame (BufferedImage, panneau JPanel) où j'appelle la fonction drawImage d'OpenCV pour dessiner le panneau:

Controller:

public void startRecording(){ 
    cameraInstance.setCameraRGBPanel(windowsInstance.getCameraRGBPanel()); 
    cameraInstance.setCameraHSVPanel(windowsInstance.getCameraHSVPanel()); 
    cameraInstance.setCameraThresholdPanel(windowsInstance.getCameraThresholdPanel()); 
    cameraInstance.setRecord(true); 
    cameraThread = new Thread(cameraInstance); 
    cameraThread.start(); 
} 

caméra classe:

private void drawFrame(BufferedImage buff, JPanel pane){ 
    pane.getGraphics().drawImage(buff, 0, 0, null); 
} 

pour commencer, JavaFX n'a ​​pas JPanel et le volet (en option) n'a pas getGraphics, je l'ai essayé de utiliser un Sw ingNode, ajoutez le JPanel et faites tout comme d'habitude, mais l'image ne sera tout simplement pas affichée.

Le code suivant était un test, c'est pourquoi il semble être si "mauvais".

public void start(Stage stage) throws Exception { 

    stage.setTitle("Tela Teste"); 

    pCamera = new Pane(); 
    SwingNode swing = new SwingNode(); 
    pCamera.getChildren().add(swing); 
    createAndSetSeingContent(swing); 

    Group root = new Group(); 
    root.getChildren().add(pCamera); 
    stage.setScene(new Scene(root , 500, 500)); 
    stage.setResizable(true); 
    stage.show(); 
} 

private void createAndSetSeingContent(SwingNode swing) {     
    ControllerCamera control = new ControllerCamera(); 
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

    JPanel panel = new JPanel(); 
    JLabel label = new JLabel("Abc"); 
    //panel.add(label); 
    swing.setContent(panel); 

    Button teste = new Button("A"); 
    pCamera.getChildren().add(teste); 
    teste.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      control.startRecording(panel); 
      System.out.println("abc"); 
     } 
    }); 
} 

j'ai changé la méthode StartRecording à quelque chose comme:

public void startRecording(JPanel panel){ 
    cameraInstance.setCameraRGBPanel(panel); 
    cameraInstance.setRecord(true); 
    cameraThread = new Thread(cameraInstance); 
    cameraThread.start(); 
} 

Toujours rien apparaît dans le panneau, mais si j'ajouter une étiquette ou un bouton, il apparaît et fonctionne comme prévu à. Le "abc" est toujours affiché dans la console.

Je pense que c'est tout le code lié au problème. Autre chose que je veux dire, hier, c'était le premier jour où je traitais avec FX, disons que le projet est divisé, l'autre travaille aussi sur le problème, mais nous n'avons rien obtenu jusqu'ici, c'est pourquoi j'ai décidé de vous demander ici.

Édition 1: tout fonctionnait parfaitement avant toute cette situation (tout fonctionne avec Swing, mais pas en FX).

+0

Vous pouvez afficher une image dans JavaFX en utilisant ['ImageView'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/ImageView.html) et en appelant' setImage (...) '. Vous devrez soit générer 'javafx.scene.image.Image' directement, soit convertir un' java.awt.iamge.BufferedImage' à une image JavaFX en utilisant ['SwingFXUtils.toFXImage'] (http://docs.oracle.com/javase/8/javafx/api/javafx/embed/swing/SwingFXUtils.html#toFXImage-java.awt.image .BufferedImage-javafx.scene.image.WritableImage-) –

+0

Essayer maintenant. –

+0

cela a fonctionné. Je suis désolé c'était si simple, j'étais juste désespéré de résoudre un problème dans un environnement que je ne connais pas. S'il vous plaît, postez est comme une réponse afin que je puisse marquer comme la réponse finale. Je vous remercie! –

Répondre

1

La manière la plus simple d'afficher une image dans JavaFX est avec ImageView. Vous pouvez créer un seul ImageView et mettre à jour son image en appelant le setImage(...), en passant un javafx.scene.image.Image. Je ne sais pas l'API de caméra que vous travaillez avec: vous pourriez être en mesure de générer une image JavaFX directement, dans ce cas, votre méthode de banc d'étirage semble aussi simple que:

private void drawFrame(Image image, ImageView imageView) { 
    imageView.setImage(image); 
} 

Si vous ne pouvez générer BufferedImage s , vous pouvez faire

private void drawFrame(BufferedImage buff, ImageView imageView) { 
    imageView.setImage(SwingFXUtils.toFXImage(buff, null)); 
} 

dans les deux cas, vous pouvez simplement créer le ImageView, le mettre dans une sous-classe Pane de quelque sorte, mettre le Pane dans une scène et l'afficher dans la Stage:

public void start(Stage stage) throws Exception { 

    stage.setTitle("Tela Teste"); 

    pCamera = new Pane(); 
    ImageView imageView = new ImageView(); 
    pCamera.getChildren().add(imageView); 

    Group root = new Group(); 
    root.getChildren().add(pCamera); 
    stage.setScene(new Scene(root , 500, 500)); 
    stage.setResizable(true); 
    stage.show(); 
} 

Ensuite, transmettez simplement le imageView à votre méthode drawFrame si nécessaire.

+0

Merci! A beaucoup aidé. J'ai simplement dû passer de Mat (OpenCV) à BufferedImage (parce que j'en ai besoin dans d'autres méthodes) et dans celui-ci je le convertis en Image depuis FX. –