123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- import java.awt.BorderLayout;
- import java.awt.Container;
- import java.awt.Image;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.util.List;
- import javax.swing.BoxLayout;
- import javax.swing.ImageIcon;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JSlider;
- import javax.swing.SwingWorker;
- import javax.swing.event.ChangeEvent;
- import javax.swing.event.ChangeListener;
- import org.opencv.core.Core;
- import org.opencv.core.Mat;
- import org.opencv.core.Scalar;
- import org.opencv.highgui.HighGui;
- import org.opencv.imgproc.Imgproc;
- import org.opencv.videoio.VideoCapture;
- public class ThresholdInRange {
- private static int MAX_VALUE = 255;
- private static int MAX_VALUE_H = 360/2;
- private static final String WINDOW_NAME = "Thresholding Operations using inRange demo";
- private static final String LOW_H_NAME = "Low H";
- private static final String LOW_S_NAME = "Low S";
- private static final String LOW_V_NAME = "Low V";
- private static final String HIGH_H_NAME = "High H";
- private static final String HIGH_S_NAME = "High S";
- private static final String HIGH_V_NAME = "High V";
- private JSlider sliderLowH;
- private JSlider sliderHighH;
- private JSlider sliderLowS;
- private JSlider sliderHighS;
- private JSlider sliderLowV;
- private JSlider sliderHighV;
- private VideoCapture cap;
- private Mat matFrame = new Mat();
- private JFrame frame;
- private JLabel imgCaptureLabel;
- private JLabel imgDetectionLabel;
- private CaptureTask captureTask;
- public ThresholdInRange(String[] args) {
- int cameraDevice = 0;
- if (args.length > 0) {
- cameraDevice = Integer.parseInt(args[0]);
- }
- //! [cap]
- cap = new VideoCapture(cameraDevice);
- //! [cap]
- if (!cap.isOpened()) {
- System.err.println("Cannot open camera: " + cameraDevice);
- System.exit(0);
- }
- if (!cap.read(matFrame)) {
- System.err.println("Cannot read camera stream.");
- System.exit(0);
- }
- //! [window]
- // Create and set up the window.
- frame = new JFrame(WINDOW_NAME);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent windowEvent) {
- captureTask.cancel(true);
- }
- });
- // Set up the content pane.
- Image img = HighGui.toBufferedImage(matFrame);
- addComponentsToPane(frame.getContentPane(), img);
- // Use the content pane's default BorderLayout. No need for
- // setLayout(new BorderLayout());
- // Display the window.
- frame.pack();
- frame.setVisible(true);
- //! [window]
- captureTask = new CaptureTask();
- captureTask.execute();
- }
- //! [while]
- private class CaptureTask extends SwingWorker<Void, Mat> {
- @Override
- protected Void doInBackground() {
- Mat matFrame = new Mat();
- while (!isCancelled()) {
- if (!cap.read(matFrame)) {
- break;
- }
- publish(matFrame.clone());
- }
- return null;
- }
- @Override
- protected void process(List<Mat> frames) {
- Mat frame = frames.get(frames.size() - 1);
- Mat frameHSV = new Mat();
- Imgproc.cvtColor(frame, frameHSV, Imgproc.COLOR_BGR2HSV);
- Mat thresh = new Mat();
- Core.inRange(frameHSV, new Scalar(sliderLowH.getValue(), sliderLowS.getValue(), sliderLowV.getValue()),
- new Scalar(sliderHighH.getValue(), sliderHighS.getValue(), sliderHighV.getValue()), thresh);
- update(frame, thresh);
- }
- }
- //! [while]
- private void addComponentsToPane(Container pane, Image img) {
- if (!(pane.getLayout() instanceof BorderLayout)) {
- pane.add(new JLabel("Container doesn't use BorderLayout!"));
- return;
- }
- JPanel sliderPanel = new JPanel();
- sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS));
- //! [trackbar]
- sliderPanel.add(new JLabel(LOW_H_NAME));
- sliderLowH = new JSlider(0, MAX_VALUE_H, 0);
- sliderLowH.setMajorTickSpacing(50);
- sliderLowH.setMinorTickSpacing(10);
- sliderLowH.setPaintTicks(true);
- sliderLowH.setPaintLabels(true);
- sliderPanel.add(sliderLowH);
- sliderPanel.add(new JLabel(HIGH_H_NAME));
- sliderHighH = new JSlider(0, MAX_VALUE_H, MAX_VALUE_H);
- sliderHighH.setMajorTickSpacing(50);
- sliderHighH.setMinorTickSpacing(10);
- sliderHighH.setPaintTicks(true);
- sliderHighH.setPaintLabels(true);
- sliderPanel.add(sliderHighH);
- sliderPanel.add(new JLabel(LOW_S_NAME));
- sliderLowS = new JSlider(0, MAX_VALUE, 0);
- sliderLowS.setMajorTickSpacing(50);
- sliderLowS.setMinorTickSpacing(10);
- sliderLowS.setPaintTicks(true);
- sliderLowS.setPaintLabels(true);
- sliderPanel.add(sliderLowS);
- sliderPanel.add(new JLabel(HIGH_S_NAME));
- sliderHighS = new JSlider(0, MAX_VALUE, MAX_VALUE);
- sliderHighS.setMajorTickSpacing(50);
- sliderHighS.setMinorTickSpacing(10);
- sliderHighS.setPaintTicks(true);
- sliderHighS.setPaintLabels(true);
- sliderPanel.add(sliderHighS);
- sliderPanel.add(new JLabel(LOW_V_NAME));
- sliderLowV = new JSlider(0, MAX_VALUE, 0);
- sliderLowV.setMajorTickSpacing(50);
- sliderLowV.setMinorTickSpacing(10);
- sliderLowV.setPaintTicks(true);
- sliderLowV.setPaintLabels(true);
- sliderPanel.add(sliderLowV);
- sliderPanel.add(new JLabel(HIGH_V_NAME));
- sliderHighV = new JSlider(0, MAX_VALUE, MAX_VALUE);
- sliderHighV.setMajorTickSpacing(50);
- sliderHighV.setMinorTickSpacing(10);
- sliderHighV.setPaintTicks(true);
- sliderHighV.setPaintLabels(true);
- sliderPanel.add(sliderHighV);
- //! [trackbar]
- //! [low]
- sliderLowH.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- JSlider source = (JSlider) e.getSource();
- int valH = Math.min(sliderHighH.getValue()-1, source.getValue());
- sliderLowH.setValue(valH);
- }
- });
- //! [low]
- //! [high]
- sliderHighH.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- JSlider source = (JSlider) e.getSource();
- int valH = Math.max(source.getValue(), sliderLowH.getValue()+1);
- sliderHighH.setValue(valH);
- }
- });
- //! [high]
- sliderLowS.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- JSlider source = (JSlider) e.getSource();
- int valS = Math.min(sliderHighS.getValue()-1, source.getValue());
- sliderLowS.setValue(valS);
- }
- });
- sliderHighS.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- JSlider source = (JSlider) e.getSource();
- int valS = Math.max(source.getValue(), sliderLowS.getValue()+1);
- sliderHighS.setValue(valS);
- }
- });
- sliderLowV.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- JSlider source = (JSlider) e.getSource();
- int valV = Math.min(sliderHighV.getValue()-1, source.getValue());
- sliderLowV.setValue(valV);
- }
- });
- sliderHighV.addChangeListener(new ChangeListener() {
- @Override
- public void stateChanged(ChangeEvent e) {
- JSlider source = (JSlider) e.getSource();
- int valV = Math.max(source.getValue(), sliderLowV.getValue()+1);
- sliderHighV.setValue(valV);
- }
- });
- pane.add(sliderPanel, BorderLayout.PAGE_START);
- JPanel framePanel = new JPanel();
- imgCaptureLabel = new JLabel(new ImageIcon(img));
- framePanel.add(imgCaptureLabel);
- imgDetectionLabel = new JLabel(new ImageIcon(img));
- framePanel.add(imgDetectionLabel);
- pane.add(framePanel, BorderLayout.CENTER);
- }
- private void update(Mat imgCapture, Mat imgThresh) {
- //! [show]
- imgCaptureLabel.setIcon(new ImageIcon(HighGui.toBufferedImage(imgCapture)));
- imgDetectionLabel.setIcon(new ImageIcon(HighGui.toBufferedImage(imgThresh)));
- frame.repaint();
- //! [show]
- }
- public static void main(String[] args) {
- // Load the native OpenCV library
- System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
- // Schedule a job for the event dispatch thread:
- // creating and showing this application's GUI.
- javax.swing.SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- new ThresholdInRange(args);
- }
- });
- }
- }
|