mirror of
https://gitcode.com/gh_mirrors/es/esp32-opencv.git
synced 2025-08-14 10:40:47 +08:00
260 lines
9.2 KiB
Java
260 lines
9.2 KiB
Java
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);
|
|
}
|
|
});
|
|
}
|
|
}
|