bgslibrary.Main.java Source code

Java tutorial

Introduction

Here is the source code for bgslibrary.Main.java

Source

/*
This file is part of BGSLibrary.
    
BGSLibrary is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
BGSLibrary is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
 */
package bgslibrary;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;

public final class Main {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    private static BgsLib bgslib;

    private JFrame window;
    private JButton startButton, stopButton;
    private ImagePanel image;
    private JComboBox comboBox;
    private String selectedAlgorithm;

    public Main() {
        buildGUI();
    }

    private void buildGUI() {
        window = new JFrame("Camera Panel");

        startButton = new JButton("Start");
        stopButton = new JButton("Stop");

        window.add(startButton, BorderLayout.WEST);
        window.add(stopButton, BorderLayout.EAST);

        //image = new ImagePanel(new ImageIcon("images/320x240.gif").getImage());
        image = new ImagePanel(new ImageIcon("images/640x480.png").getImage());
        window.add(image, BorderLayout.CENTER);

        String[] options = { "* Select a background subtraction algorithm" };
        options = Utils.generalConcatAll(options, bgslib.getListAlgorithms());

        comboBox = new JComboBox(options);
        comboBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (begin == true) {
                    JOptionPane.showMessageDialog(null, "Stop capture first.", "Warning",
                            JOptionPane.WARNING_MESSAGE);
                    comboBox.setSelectedIndex(0);
                    selectedAlgorithm = null;
                    return;
                }

                String item = comboBox.getSelectedItem().toString();

                if (item.startsWith("*"))
                    selectedAlgorithm = null;
                else
                    selectedAlgorithm = item;

                //System.out.println("Selected algorithm: " + selectedAlgorithm);
            }
        });
        window.add(comboBox, BorderLayout.SOUTH);

        window.setSize(default_width + 130, default_height + 28);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);

        startButton.addActionListener((ActionEvent e) -> {
            start();
        });

        stopButton.addActionListener((ActionEvent e) -> {
            stop();
        });
    }

    private Boolean begin = false;
    private VideoCapture video = null;
    private CaptureThread thread = null;

    private void start() {
        if (begin == false) {
            video = new VideoCapture(0);

            if (video.isOpened()) {
                if (selectedAlgorithm != null)
                    BgsLib.constructObject(selectedAlgorithm);

                thread = new CaptureThread();
                thread.start();
                begin = true;
            }
        }
    }

    private MatOfByte matOfByte = new MatOfByte();
    private BufferedImage bufImage = null;
    private InputStream in;
    private final int default_width = 640;
    private final int default_height = 480;
    private Mat frameaux = new Mat();
    private Mat frame = new Mat(default_height, default_width, CvType.CV_8UC3);
    private Mat fgmask = new Mat();

    class CaptureThread extends Thread {
        @Override
        public void run() {
            if (video.isOpened()) {
                while (begin == true) {
                    video.retrieve(frameaux);
                    Imgproc.resize(frameaux, frame, frame.size());

                    if (selectedAlgorithm != null) {
                        BgsLib.computeForegroundMask(frame.getNativeObjAddr(), fgmask.getNativeObjAddr());
                        bufImage = Utils.toBufferedImage(fgmask);
                    } else
                        bufImage = Utils.toBufferedImage(frame);

                    image.updateImage(bufImage);

                    try {
                        Thread.sleep(5);
                    } catch (Exception ex) {
                    }
                }
            }
        }
    }

    private void stop() {
        begin = false;
        try {
            Thread.sleep(500);
        } catch (Exception ex) {
        }

        if (video != null) {
            video.release();
            video = null;
        }

        BgsLib.destroyObject();
    }

    public static void main(String[] args) {
        new Main();
    }
}