cctvanalization.FXMLDocumentController.java Source code

Java tutorial

Introduction

Here is the source code for cctvanalization.FXMLDocumentController.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cctvanalization;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.util.Duration;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;

/**
 *
 * @author iftekher
 */
public class FXMLDocumentController implements Initializable {

    private static boolean applicationShouldClose = false;

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    private static BufferedImage toBufferedImage(File file) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @FXML
    private ImageView cameraView;
    private VideoCapture videoCapture;
    private ScheduledExecutorService scheduledExecutorService;

    private List<Mat> grabbedFramesPrev;
    private List<Mat> grabbedFramesTemp;
    private List<Mat> grabbedFramesNext;

    private Mat currentFrame;
    private Mat previousFrame;

    private InputStream in;
    private AudioStream as;
    private AudioData data;
    private ContinuousAudioDataStream cas;

    private int alarmCont = 0;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        videoCapture = new VideoCapture();
        grabbedFramesPrev = new ArrayList<>();
        grabbedFramesNext = new ArrayList<>();
        grabbedFramesTemp = new ArrayList<>();
        currentFrame = new Mat();
        previousFrame = new Mat();

        Timeline timeline = new Timeline();
        KeyFrame keyFrame = new KeyFrame(Duration.millis(10), event -> {
            if (grabbedFramesPrev.size() > 1) {
                System.out.println("Frames found");
                currentFrame = grabbedFramesPrev.get(grabbedFramesPrev.size() - 1);
                previousFrame = grabbedFramesPrev.get(grabbedFramesPrev.size() - 2);

                //            Mat subtraction = new Mat();
                //            System.out.println("Mat created");

                for (int r = 0; r < currentFrame.height(); r++) {
                    for (int c = 0; c < currentFrame.width(); c++) {
                        double currentValue[] = currentFrame.get(r, c);
                        double previousValue[] = previousFrame.get(r, c);
                        double newValue = currentValue[0] - previousValue[0];
                        if (newValue < 0) {
                            newValue = 0;
                        }
                        //    System.out.printf("%f   ", newValue);
                        //         subtraction.put(r, c, newValue);

                        if (newValue > 10) {
                            int changes = 0;
                            for (int i = r - 10; i <= r; i++) {
                                for (int j = c - 10; j <= c; j++) {
                                    if (i >= 0 && j >= 0) {
                                        double currCheckValue[] = currentFrame.get(i, j);
                                        double prevCheckValue[] = previousFrame.get(i, j);
                                        double checkValue = currCheckValue[0] - prevCheckValue[0];
                                        if (checkValue < 0) {
                                            checkValue = 0;
                                        }
                                        if (checkValue > 10) {
                                            changes = changes + 1;
                                        }
                                    }
                                }
                            }
                            if (changes > 40) {
                                System.out.println("ChangeFound");
                                if (alarmCont == 0) {
                                    alarmCont = 1;
                                }
                                if (alarmCont == 1) {
                                    ringAlarm();
                                    saveFrame(currentFrame, "changedFrame", "png");
                                    alarmCont = 2;
                                }
                                break;
                            }
                        }
                    }
                    //   System.out.printf("\n");
                }
            }
        });
        timeline.getKeyFrames().add(keyFrame);
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.play();
    }

    @FXML
    private void handleStartCameraAction(ActionEvent event) {
        videoCapture.open(0);
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(() -> cameraView.setImage(grabFrame()), 0, 10,
                TimeUnit.MILLISECONDS);
    }

    private Image grabFrame() {
        if (applicationShouldClose) {
            if (videoCapture.isOpened()) {
                videoCapture.release();
            }
            scheduledExecutorService.shutdown();
        }

        Image imageToShow = null;
        Mat frame = new Mat();
        //     Mat prevFrame = new Mat(grabbedImagesPrev.get(grabbedImagesPrev.size() - 1));
        int frameNum = 0;
        if (videoCapture.isOpened()) {
            try {
                videoCapture.read(frame);

                if (!frame.empty()) {
                    Imgproc.cvtColor(frame, frame, Imgproc.COLOR_BGR2GRAY);

                    MatOfByte buffer = new MatOfByte();
                    Imgcodecs.imencode(".png", frame, buffer);
                    imageToShow = new Image(new ByteArrayInputStream(buffer.toArray()));

                    grabbedFramesTemp.removeAll(grabbedFramesTemp);
                    if (grabbedFramesPrev.size() < 10) {
                        grabbedFramesPrev.add(frame);
                    } else {
                        for (int i = 1; i < grabbedFramesPrev.size(); i++) {
                            grabbedFramesTemp.add(grabbedFramesPrev.get(i));
                        }
                        grabbedFramesPrev.removeAll(grabbedFramesPrev);
                        for (int i = 0; i < grabbedFramesTemp.size(); i++) {
                            grabbedFramesPrev.add(grabbedFramesTemp.get(i));
                        }
                        grabbedFramesPrev.add(frame);
                    }
                }

            } catch (Exception e) {
                System.err.println(e);
            }
        }

        return imageToShow;
    }

    @FXML
    private void handleStopCameraAction(ActionEvent event) {
        if (videoCapture.isOpened()) {
            videoCapture.release();
        }
        scheduledExecutorService.shutdown();
    }

    public static void exit() {
        applicationShouldClose = true;
    }

    //            System.out.println("Mat Value Put");
    //            String change = detectChange(subtraction);
    //            if (change.equals("Yes")){
    //                System.out.println("Change found");
    //            }
    //            int changes = 0;
    //            System.out.println("Changes: " + changes);
    //            
    //            for(int r = 0; r < subtraction.height(); r++){
    //                for(int c = 0; c < subtraction.width(); c++){
    //                    System.out.println("Started change detecting");
    //
    //                    double value[] = subtraction.get(r, c);
    //                    System.out.println(value[0]);
    //                    if(value[0] > 0){
    ////                        System.out.println("Initial Change Detected");
    ////                        for(int i = r-5; i < r + 5; i++){
    ////                            for(int j = c-5; c < c+5; c++){
    ////                                double checkValue[] = subtraction.get(i, j);
    ////                                if(checkValue[0] > 2){
    ////                                    changes = changes + 1;
    ////                                }
    ////                            }
    ////                        }
    //                        changes = changes + 1;
    //                    }
    //                }
    //            }
    //            
    //            if(changes > 5){
    //                System.out.println("Change Detected");
    //                
    //                MatOfByte buffer = new MatOfByte();
    //                Imgcodecs.imencode(".png", subtraction, buffer);
    //                BufferedImage imageToSave = new BufferedImage(subtraction.width(), subtraction.height(), BufferedImage.TYPE_INT_ARGB);
    //                try {
    //                    FileChooser fileChooser = new FileChooser();
    //                    File file = fileChooser.showSaveDialog(null);
    //                    String format = file.getName().substring(file.getName().indexOf(".") + 1);
    //                    ImageIO.write(imageToSave, format, file);
    //                 //   statusLabel.setText("Saving to " + file.getName() + " format: " + format);
    //                } catch (IOException ex) {
    //                    Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
    //                }
    //            }
    //  }
    //    }

    public void ringAlarm() {
        try {
            in = new FileInputStream("alarm/CoastGuard.wav");
            as = new AudioStream(in);
            data = as.getData();
            cas = new ContinuousAudioDataStream(data);
            AudioPlayer.player.start(cas);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(CctvAnalization.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(CctvAnalization.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @FXML
    private void handleStopAlarmAction(ActionEvent event) {
        alarmCont = 0;
        AudioPlayer.player.start(cas);
    }

    public void saveFootage() {

    }

    public void sendEmail() {

    }

    private static void saveFrame(Mat currentFrame, String fileName, String ext) {
        File file = new File(fileName + "." + ext);
        BufferedImage image = new BufferedImage(currentFrame.width(), currentFrame.height(),
                BufferedImage.TYPE_BYTE_GRAY);
        try {
            ImageIO.write(image, ext, file); // ignore returned boolean
        } catch (IOException e) {
            System.out.println("Write error for " + file.getPath() + ": " + e.getMessage());
        }
    }
}