Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
wir arbeiten in einem Projekt mit JavaFX als grafische Oberfläche.
Ich nutze DSJ zum Einholen von Webcam-Bildern. Diese werden mir auf einem JPanel geliefert.
Jetzt würde ich dieses JPanel gerne in JavaFX einbinden, finde aber keine Möglichkeit.
Soetwas funktioniert leider nicht:
Java:
DSCapture graph = new DSCapture(DSFiltergraph.DD7, dsi[0][0], false, DSFilterInfo.doNotRender(), this);
BorderPane pane = new BorderPane();
pane.setCenter(graph.asComponent());
asComponent() liefert Folgendes:
returns either the canvas DSFiltergraph extends or a JPanel it renders into
Hintergrund: Entwickler sind meist keine guten UI-Designer. Deshalb ist es gut UI-Design und Entwicklung zu trennen. JavaFX 2.0 ist mit dem Versprechen angetreten dies zu vereinfachen. Aber wo sind die Tools?
Gerrit Grunwald, Anton Epple >> Folien der Source Talk Tage 2012 Die meisten Folien sind jetzt online:
Wobei ich selbst die normale JavaFX 2.2 API bevorzuge. Aber ich habe auch bei Swing keine GUI-Builder benutzt, außer um mal schnell was auszuprobieren...
Ansonsten kann man, wie du geschrieben hast JavaFX in Swing einbetten. Umgekehrt Swing in JavaFX einbetten geht nicht. Ist auch nicht gewollt, da Oracle möchte, dass die Leute auf JavaFX umsteigen.
Um überhaupt Webcam-Bilder in JavaFX einlesen zu können, haben wir uns von DSJ distanziert und es mit anderen Mitteln versucht. Folgende Lösung ist dabei herausgekommen:
1. OpenCV 2.42 extrahieren. Ich habe es unter "C:\Program Files\OpenCV"extrahiert
2. Zur Systemumgebungsvariable
C:\Program Files\OpenCV\build\common\tbb\intel64\vc10;C:\Program Files\OpenCV\build\x64\vc10\bin
hinzufügen. Das entscheidende ist tbb.dll in build\common\tbb\intel64\vc10
3. Microsoft Visual C++ 2010 Redistributable Package (x64) installieren: Download: Microsoft Visual C++ 2010 Redistributable Package (x64) - Microsoft Download Center - Download Details
4. Eclipse neu starten (vorsichtshalber, falls er bis dahin noch nicht die neuen Umgebungsvariablen eingelesen hat)
5. Neues Java-Project anlegen und dort einen lib-Folder
6. In lib kommen hinein:
javacpp.jar
javacv-windows-x86_64.jar
javacv.jar
7. Die JARs aus lib und die jfxrt.jar (findest Du in C:\Program Files\Java\jre7/lib) zum Build Path hinzufügen.
8. Package org.example Anlegen.
9. Die Klasse WebcamTest dort anlegen mit folgendem Quelltext:
Java:
package org.example;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class WebcamTest extends Application {
private OpenCVFrameGrabber grabber;
private Timer timer;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
final ImageView view = new ImageView();
final PerspectiveTransform transform = new PerspectiveTransform();
transform.setUlx(10.0f);
transform.setUly(10.0f);
transform.setUrx(450.0f);
transform.setUry(90.0f);
transform.setLlx(10.0f);
transform.setLly(480.0f);
transform.setLrx(450.0f);
transform.setLry(400.0f);
final DropShadow shadow = new DropShadow();
shadow.setInput(transform);
shadow.setOffsetX(3.0);
shadow.setOffsetY(6.0);
shadow.setColor(Color.GRAY);
shadow.setRadius(15.0);
view.setEffect(shadow);
final Group root = new Group();
root.getChildren().add(view);
final Scene scene = new Scene(root);
stage.setScene(scene);
stage.setWidth(800);
stage.setHeight(600);
stage.show();
grabber = new OpenCVFrameGrabber(0);
grabber.start();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
final IplImage image = grabber.grab();
BufferedImage awtImage = image.getBufferedImage();
Image jfxImage = javafx.scene.image.Image
.impl_fromExternalImage(awtImage);
view.setImage(jfxImage);
} catch (com.googlecode.javacv.FrameGrabber.Exception e) {
}
}
}, 0, 1000 / 25);
}
@Override
public void stop() throws Exception {
super.stop();
timer.cancel();
grabber.stop();
}
}
Ich danke meinen Vorredner für die Informationen und Tipps. Falls ihr noch andere Ansätze habt, wäre ich sehr erfreut sie zu erfahren.
Liebe Grüße, Jerome.
P.S.: Die hier Angegebe Lösung ist für x64-Plattformen.
P.P.S.: Habe gerade keine Möglichkeit gefunden, dem Thema einen Untertitel hinzuzufügen, aber sinnvoll wäre etwas zu ergänzen wie: "Webcam-Capture in JavaFX".