我计划在现场使用openCV从我的网络摄像头获取实时信息。我将JavaFX用于GUI目的。
GUI: 我有父窗口作为AnchorPane。我在其中添加了Vbox和Hbox。其中Vbox包含画布(加载实时订阅源的地方).Hbox包含2个按钮 我把父母当作AnchorPane。因此,当我运行代码时,我在整个窗口中获得了视频源,并删除了该按钮。所以我想要的是视频源应该显示在vBox中。
运行程序时,按钮会被删除。
视频Feed是否只采用vBOX场景?
要明确说明我希望在视频供稿期间显示这些按钮。
在下面的代码中,我给了AnchorPane(fx:id-anchorpane)和vBOX(fx:id-vb)ID。我尝试从vb(代码中的注释)获取场景,但我想我错过了一些东西。
代码段:
@FXML
private Canvas canvas;
@FXML
private Button button_start;
private static final int SCENE_W = 640;
private static final int SCENE_H = 480;
VideoCapture videoCapture;
GraphicsContext g2d;
@FXML
Stage stage;
@FXML
private AnchorPane anchorpane;
@FXML
private VBox vb;
@FXML
private Group group;
Scene scene;
AnimationTimer timer;
@FXML
private void handleButtonAction(ActionEvent event) {
initOpenCv();
System.out.println("test3");
canvas = new Canvas(SCENE_W, SCENE_H);
g2d = canvas.getGraphicsContext2D();
g2d.setStroke(Color.GREEN);
group = new Group(canvas);
scene = new Scene(group, SCENE_W, SCENE_H);
stage = (Stage) anchorpane.getScene().getWindow();
//stage = (Stage) vb.getScene().getWindow();
stage.setScene(scene);
stage.setResizable(false);
stage.show();
}
timer = new AnimationTimer() {
Mat mat = new Mat();
@Override
public void handle(long now) {
videoCapture.read(mat);
Image image = mat2Image(mat);
g2d.drawImage(image, 0, 0);
}
};
timer.start();
}
在代码中initopenCv()函数加载本机库并具有OpenCV的videoCapture函数。
private void initOpenCv() {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
videoCapture = new VideoCapture();
videoCapture.open(0);
System.out.println("Camera open: " + videoCapture.isOpened());
}