Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javafx中检测运动_Java_Javafx_Motion Detection - Fatal编程技术网

在javafx中检测运动

在javafx中检测运动,java,javafx,motion-detection,Java,Javafx,Motion Detection,我需要帮助检测JavaFX中的运动。仅在检测到运动时开始录制,在一段时间内未检测到运动时停止录制。 一切正常,但运动检测部分工作不好 我使用了sarxos库: 有什么建议吗? 这是javafx控制器类 public class MonitorController implements Initializable { private static double v; @FXML private VBox monitor; @FXML JFXButton b

我需要帮助检测JavaFX中的运动。仅在检测到运动时开始录制,在一段时间内未检测到运动时停止录制。 一切正常,但运动检测部分工作不好

我使用了sarxos库:

有什么建议吗?

这是javafx控制器类

public class MonitorController implements Initializable {

    private static double v;
    @FXML
    private VBox monitor;
    @FXML
    JFXButton btnStartCamera, btnStopCamera;
    @FXML
    JFXComboBox<WebCamInfo> cbCameraOptions;
    @FXML
    BorderPane bpWebCamPaneHolder;
    @FXML
    FlowPane fpBottomPane;
    @FXML
    ImageView imgWebCamCapturedImage;
    int i = 0;
    @FXML
    private JFXSlider jfxSlider;
    private BufferedImage grabbedImage, grabbedImage2;
    private boolean stopCamera = false, stopCamera2 = false;
    private Webcam selWebCam = null;
    private ObjectProperty<Image> imageProperty = new SimpleObjectProperty<Image>();
    private IMediaWriter writer, writer2;
    private String cameraListPromptText = "Choose Camera";
    private File file = null, file2 = null;
    private SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy hh-mm-ss aa");

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        fpBottomPane.setDisable(true);
        ObservableList<WebCamInfo> options = FXCollections.observableArrayList();
        int webCamCounter = 0;
        for (Webcam webcam : Webcam.getWebcams()) {
            WebCamInfo webCamInfo = new WebCamInfo();
            webCamInfo.setWebCamIndex(webCamCounter);
            webCamInfo.setWebCamName(webcam.getName());
            options.add(webCamInfo);
            webCamCounter++;
        }
        cbCameraOptions.setItems(options);
        cbCameraOptions.setPromptText(cameraListPromptText);
        cbCameraOptions.getSelectionModel().selectedItemProperty().addListener((arg01, arg11, arg2) -> {
            if (arg2 != null) {
                System.out.println("WebCam Index: " + arg2.getWebCamIndex() + ": WebCam Name:" + arg2.getWebCamName());
                initializeWebCam(arg2.getWebCamIndex());
            }
        });
    }

    protected void setImageViewSize() {

        double height = bpWebCamPaneHolder.getHeight();
        double width = bpWebCamPaneHolder.getWidth();
        imgWebCamCapturedImage.setFitHeight(height);
        imgWebCamCapturedImage.setFitWidth(width);
        imgWebCamCapturedImage.setSmooth(true);
        imgWebCamCapturedImage.setPreserveRatio(false);
    }

    private void initializeWebCam(final int webCamIndex) {

        Task<Void> webCamIntilizer = new Task<Void>() {

            @Override
            protected Void call() throws Exception {
                if (selWebCam == null) {
                    selWebCam = Webcam.getWebcams().get(webCamIndex);
                    selWebCam.open();
                } else {
                    closeCamera();
                    selWebCam = Webcam.getWebcams().get(webCamIndex);
                    selWebCam.open();
                }
                startWebCamStream();
                return null;
            }

        };

        new Thread(webCamIntilizer).start();
        fpBottomPane.setDisable(false);
        btnStartCamera.setDisable(true);
    }

    //main method that will record the videos
    private synchronized void startWebCamStream() {
        stopCamera = false;
        stopCamera2 = false;
        Date date = new Date();
        File folder = new File("VideoRecordings");

        //without motion detection video
        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                file = new File(folder,"NormalVideo("+dateFormat.format(date.getTime())+").mp4");
                writer = ToolFactory.makeWriter(file.getName());
                Dimension size = WebcamResolution.QVGA.getSize();
                writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, size.width, size.height);
                long start = System.currentTimeMillis();
                try {
                    while (!stopCamera) {
                        if ((grabbedImage = selWebCam.getImage()) != null) {
                            Platform.runLater(() -> {
                                final Image mainiamge = SwingFXUtils.toFXImage(grabbedImage, null);
                                imageProperty.set(mainiamge);
                            });
                            BufferedImage image = ConverterFactory.convertToType(grabbedImage, BufferedImage.TYPE_3BYTE_BGR);
                            IConverter converter = ConverterFactory.createConverter(image, IPixelFormat.Type.YUV420P);
                            IVideoPicture frame = converter.toPicture(image, ((System.currentTimeMillis() - start) * 1000));
                            frame.setKeyFrame(true);
                            frame.setQuality(0);
                            writer.encodeVideo(0,frame);
                        }
//                        grabbedImage.flush();
                    }
                } catch (Exception e) {
                } finally {
                }
                return null;
            }
        };
        //display video and pictures
        imgWebCamCapturedImage.imageProperty().bind(imageProperty);

        //with motion detection video
        Task<Void> task1 = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                WebcamMotionDetector detector = new WebcamMotionDetector(selWebCam);
                detector.setInterval(100); 

                jfxSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
                    v = (double) newValue;
                    detector.setPixelThreshold((int) v);
                    });
                detector.start();

                file2 = new File(folder,"motionDetected("+dateFormat.format(date.getTime())+").mp4");
                writer2 = ToolFactory.makeWriter(file2.getName());
                Dimension size = WebcamResolution.QVGA.getSize();
                writer2.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, size.width, size.height);


                long start = System.currentTimeMillis();
                while (!stopCamera2) {
                    if ((grabbedImage2 = selWebCam.getImage()) != null) {
                        if(detector.isMotion()){
                            while (detector.isMotion()) {
                                BufferedImage image = ConverterFactory.convertToType(grabbedImage2, BufferedImage.TYPE_3BYTE_BGR);
                                IConverter converter = ConverterFactory.createConverter(image, IPixelFormat.Type.YUV420P);
                                IVideoPicture frame = converter.toPicture(image, ((System.currentTimeMillis() - start) * 1000));
                                frame.setKeyFrame(true);
                                frame.setQuality(0);
                                writer2.encodeVideo(0, frame);
                            }
                            grabbedImage2.flush();
//                            writer2.close();
                        }
                    }
                }
                return null;
            }
        };


        Thread th = new Thread(task);
        Thread th2 = new Thread(task1);
        th.setDaemon(true);
        th.start();
        th2.setDaemon(true);
        th2.start();

    }

    private void closeCamera() {
        if (selWebCam != null) {
            selWebCam.close();
        }
    }

    @FXML
    private void stopCamera(ActionEvent event) {
        stopCameraAndRecording();
        btnStopCamera.setDisable(true);
        btnStartCamera.setDisable(false);
    }

    @FXML
    private void startCamera(ActionEvent event) {
        if(selWebCam.close()){
        }else{
            startWebCamStream();
            btnStopCamera.setDisable(false);
            btnStartCamera.setDisable(true);
        }
    }

    class WebCamInfo {
        private String webCamName;
        private int webCamIndex;

        public String getWebCamName() {
            return webCamName;
        }

        public void setWebCamName(String webCamName) {
            this.webCamName = webCamName;
        }

        public int getWebCamIndex() {
            return webCamIndex;
        }

        public void setWebCamIndex(int webCamIndex) {
            this.webCamIndex = webCamIndex;
        }

        @Override
        public String toString() {
            return webCamName;
        }

    }

    private void stopCameraAndRecording(){
        stopCamera = true;
        stopCamera2 = true;
        if (writer2!=null && writer2.isOpen()) {
            writer2.close();
        }
        if (writer!=null && writer.isOpen()) {
            writer.close();
        }
        closeCamera();
        Webcam.shutdown();
    }

}
公共类MonitorController实现可初始化{
专用静态双v;
@FXML
专用VBox监视器;
@FXML
JFX按钮btnStartCamera,btnStopCamera;
@FXML
JFXComboBox cbCameraOptions;
@FXML
网络摄像机支架;
@FXML
流窗格和底部窗格;
@FXML
ImageView ImgWebCamCaptureDiImage;
int i=0;
@FXML
专用JFXSlider JFXSlider;
私有缓冲区图像抓取图像,抓取图像2;
私有布尔stopCamera=false,stopCamera2=false;
私人网络摄像头selWebCam=null;
private ObjectProperty imageProperty=新的SimpleObject属性();
私人作家,作家2;
私有字符串cameralistpromptext=“选择相机”;
私有文件File=null,file2=null;
私有SimpleDataFormat dateFormat=新SimpleDataFormat(“dd-MMM-yyy-hh-mm-ss-aa”);
@凌驾
公共void初始化(URL arg0,ResourceBundle arg1){
fpBottomPane.setDisable(true);
ObservableList options=FXCollections.observableArrayList();
int网络摄像机计数器=0;
用于(网络摄像头网络摄像头:Webcam.getwebcam()){
WebCamInfo WebCamInfo=新的WebCamInfo();
webCamInfo.setWebCamIndex(网络摄像机计数器);
setWebCamName(webcam.getName());
选项。添加(网络视频);
webCamCounter++;
}
cbCameraOptions.setItems(选项);
CbcCameraOptions.setPrompText(CameralistPrompText);
cbCameraOptions.getSelectionModel().SelectEditeProperty().addListener((arg01、arg11、arg2)->{
如果(arg2!=null){
System.out.println(“网络摄像头索引:+arg2.getWebCamIndex()+”:网络摄像头名称:+arg2.getWebCamName());
初始化WebCam(arg2.getWebCamIndex());
}
});
}
受保护的void setImageViewSize(){
double height=bpWebCamPaneHolder.getHeight();
double width=bpWebCamPaneHolder.getWidth();
imgWebCamCapturedImage.setFitHeight(高度);
imgWebCamCapturedImage.setFitWidth(宽度);
imgWebCamCapturedImage.setSmooth(真);
imgWebCamCapturedImage.setPreserveRatio(假);
}
私有无效初始化WebCam(最终int网络摄像机){
任务WebCaminilizer=新任务(){
@凌驾
受保护的Void调用()引发异常{
如果(selWebCam==null){
selWebCam=Webcam.getWebcams().get(webCamIndex);
selvebcam.open();
}否则{
关闭摄像头();
selWebCam=Webcam.getWebcams().get(webCamIndex);
selvebcam.open();
}
startWebCamStream();
返回null;
}
};
新线程(WebCaminizer.start();
fpBottomPane.setDisable(false);
btnStartCamera.setDisable(true);
}
//录制视频的主要方法
私有同步的void startWebCamStream(){
stopCamera=假;
stopCamera2=假;
日期=新日期();
文件夹=新文件(“录像”);
//无运动检测视频
任务=新任务(){
@凌驾
受保护的Void调用()引发异常{
file=新文件(文件夹“NormalVideo”(+dateFormat.format(date.getTime())+”.mp4));
writer=ToolFactory.makeWriter(file.getName());
维度大小=WebcamResolution.QVGA.getSize();
writer.addVideoStream(0,0,ICodec.ID.CODEC_ID_H264,size.width,size.height);
长启动=System.currentTimeMillis();
试一试{
而(!相机){
if((grabbedImage=selWebCam.getImage())!=null){
Platform.runLater(()->{
最终图像mainiamge=SwingFXUtils.toFXImage(grabbedImage,null);
imageProperty.set(mainiamge);
});
BuffereImage=ConverterFactory.convertToType(grabbedImage,BuffereImage.TYPE_3BYTE_BGR);
IConverter converter=ConverterFactory.createConverter(image,IPixelFormat.Type.YUV420P);
IVideoPicture frame=converter.toPicture(图像,((System.currentTimeMillis()-start)*1000));
frame.setKeyFrame(true);
帧质量(0);
编写器。编码视频(0,帧);
}
//grabbedImage.flush();
}
}捕获(例外e){
}最后{
}
返回null;
}
};
//显示视频和图片
imgWebCamCapturedImage.imageProperty().bind(imageProperty);
//与运动检测视频
任务task1=新任务(){
@凌驾
受保护的Void调用()引发异常{
网络摄像机检测器=新的网络摄像机检测器(selWebCam);
检测器设置间隔(100);
jfxSlider.valueProperty().addListener((可观察、旧值、新值)->{
v=(双)新值;
检测器。设置像素阈值((int)v);
});
检测器。启动();
file2=新文件(文件夹“motionDetected”(+dateFormat.format(date.getTime())+”).mp4);
writer2=ToolFactory.makeWriter(文件