Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/samples/java/tutorial_code/ImgProc/threshold_inRange/ThresholdInRange.java
16354 views
1
import java.awt.BorderLayout;
2
import java.awt.Container;
3
import java.awt.Image;
4
import java.awt.event.WindowAdapter;
5
import java.awt.event.WindowEvent;
6
import java.util.List;
7
8
import javax.swing.BoxLayout;
9
import javax.swing.ImageIcon;
10
import javax.swing.JFrame;
11
import javax.swing.JLabel;
12
import javax.swing.JPanel;
13
import javax.swing.JSlider;
14
import javax.swing.SwingWorker;
15
import javax.swing.event.ChangeEvent;
16
import javax.swing.event.ChangeListener;
17
18
import org.opencv.core.Core;
19
import org.opencv.core.Mat;
20
import org.opencv.core.Scalar;
21
import org.opencv.highgui.HighGui;
22
import org.opencv.imgproc.Imgproc;
23
import org.opencv.videoio.VideoCapture;
24
25
public class ThresholdInRange {
26
private static int MAX_VALUE = 255;
27
private static int MAX_VALUE_H = 360/2;
28
private static final String WINDOW_NAME = "Thresholding Operations using inRange demo";
29
private static final String LOW_H_NAME = "Low H";
30
private static final String LOW_S_NAME = "Low S";
31
private static final String LOW_V_NAME = "Low V";
32
private static final String HIGH_H_NAME = "High H";
33
private static final String HIGH_S_NAME = "High S";
34
private static final String HIGH_V_NAME = "High V";
35
private JSlider sliderLowH;
36
private JSlider sliderHighH;
37
private JSlider sliderLowS;
38
private JSlider sliderHighS;
39
private JSlider sliderLowV;
40
private JSlider sliderHighV;
41
private VideoCapture cap;
42
private Mat matFrame = new Mat();
43
private JFrame frame;
44
private JLabel imgCaptureLabel;
45
private JLabel imgDetectionLabel;
46
private CaptureTask captureTask;
47
48
public ThresholdInRange(String[] args) {
49
int cameraDevice = 0;
50
if (args.length > 0) {
51
cameraDevice = Integer.parseInt(args[0]);
52
}
53
//! [cap]
54
cap = new VideoCapture(cameraDevice);
55
//! [cap]
56
if (!cap.isOpened()) {
57
System.err.println("Cannot open camera: " + cameraDevice);
58
System.exit(0);
59
}
60
if (!cap.read(matFrame)) {
61
System.err.println("Cannot read camera stream.");
62
System.exit(0);
63
}
64
65
//! [window]
66
// Create and set up the window.
67
frame = new JFrame(WINDOW_NAME);
68
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
69
frame.addWindowListener(new WindowAdapter() {
70
@Override
71
public void windowClosing(WindowEvent windowEvent) {
72
captureTask.cancel(true);
73
}
74
});
75
// Set up the content pane.
76
Image img = HighGui.toBufferedImage(matFrame);
77
addComponentsToPane(frame.getContentPane(), img);
78
// Use the content pane's default BorderLayout. No need for
79
// setLayout(new BorderLayout());
80
// Display the window.
81
frame.pack();
82
frame.setVisible(true);
83
//! [window]
84
85
captureTask = new CaptureTask();
86
captureTask.execute();
87
}
88
89
//! [while]
90
private class CaptureTask extends SwingWorker<Void, Mat> {
91
@Override
92
protected Void doInBackground() {
93
Mat matFrame = new Mat();
94
95
while (!isCancelled()) {
96
if (!cap.read(matFrame)) {
97
break;
98
}
99
publish(matFrame.clone());
100
}
101
return null;
102
}
103
104
@Override
105
protected void process(List<Mat> frames) {
106
Mat frame = frames.get(frames.size() - 1);
107
Mat frameHSV = new Mat();
108
Imgproc.cvtColor(frame, frameHSV, Imgproc.COLOR_BGR2HSV);
109
Mat thresh = new Mat();
110
Core.inRange(frameHSV, new Scalar(sliderLowH.getValue(), sliderLowS.getValue(), sliderLowV.getValue()),
111
new Scalar(sliderHighH.getValue(), sliderHighS.getValue(), sliderHighV.getValue()), thresh);
112
update(frame, thresh);
113
}
114
}
115
//! [while]
116
117
private void addComponentsToPane(Container pane, Image img) {
118
if (!(pane.getLayout() instanceof BorderLayout)) {
119
pane.add(new JLabel("Container doesn't use BorderLayout!"));
120
return;
121
}
122
123
JPanel sliderPanel = new JPanel();
124
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS));
125
126
//! [trackbar]
127
sliderPanel.add(new JLabel(LOW_H_NAME));
128
sliderLowH = new JSlider(0, MAX_VALUE_H, 0);
129
sliderLowH.setMajorTickSpacing(50);
130
sliderLowH.setMinorTickSpacing(10);
131
sliderLowH.setPaintTicks(true);
132
sliderLowH.setPaintLabels(true);
133
sliderPanel.add(sliderLowH);
134
135
sliderPanel.add(new JLabel(HIGH_H_NAME));
136
sliderHighH = new JSlider(0, MAX_VALUE_H, MAX_VALUE_H);
137
sliderHighH.setMajorTickSpacing(50);
138
sliderHighH.setMinorTickSpacing(10);
139
sliderHighH.setPaintTicks(true);
140
sliderHighH.setPaintLabels(true);
141
sliderPanel.add(sliderHighH);
142
143
sliderPanel.add(new JLabel(LOW_S_NAME));
144
sliderLowS = new JSlider(0, MAX_VALUE, 0);
145
sliderLowS.setMajorTickSpacing(50);
146
sliderLowS.setMinorTickSpacing(10);
147
sliderLowS.setPaintTicks(true);
148
sliderLowS.setPaintLabels(true);
149
sliderPanel.add(sliderLowS);
150
151
sliderPanel.add(new JLabel(HIGH_S_NAME));
152
sliderHighS = new JSlider(0, MAX_VALUE, MAX_VALUE);
153
sliderHighS.setMajorTickSpacing(50);
154
sliderHighS.setMinorTickSpacing(10);
155
sliderHighS.setPaintTicks(true);
156
sliderHighS.setPaintLabels(true);
157
sliderPanel.add(sliderHighS);
158
159
sliderPanel.add(new JLabel(LOW_V_NAME));
160
sliderLowV = new JSlider(0, MAX_VALUE, 0);
161
sliderLowV.setMajorTickSpacing(50);
162
sliderLowV.setMinorTickSpacing(10);
163
sliderLowV.setPaintTicks(true);
164
sliderLowV.setPaintLabels(true);
165
sliderPanel.add(sliderLowV);
166
167
sliderPanel.add(new JLabel(HIGH_V_NAME));
168
sliderHighV = new JSlider(0, MAX_VALUE, MAX_VALUE);
169
sliderHighV.setMajorTickSpacing(50);
170
sliderHighV.setMinorTickSpacing(10);
171
sliderHighV.setPaintTicks(true);
172
sliderHighV.setPaintLabels(true);
173
sliderPanel.add(sliderHighV);
174
//! [trackbar]
175
176
//! [low]
177
sliderLowH.addChangeListener(new ChangeListener() {
178
@Override
179
public void stateChanged(ChangeEvent e) {
180
JSlider source = (JSlider) e.getSource();
181
int valH = Math.min(sliderHighH.getValue()-1, source.getValue());
182
sliderLowH.setValue(valH);
183
}
184
});
185
//! [low]
186
//! [high]
187
sliderHighH.addChangeListener(new ChangeListener() {
188
@Override
189
public void stateChanged(ChangeEvent e) {
190
JSlider source = (JSlider) e.getSource();
191
int valH = Math.max(source.getValue(), sliderLowH.getValue()+1);
192
sliderHighH.setValue(valH);
193
}
194
});
195
//! [high]
196
sliderLowS.addChangeListener(new ChangeListener() {
197
@Override
198
public void stateChanged(ChangeEvent e) {
199
JSlider source = (JSlider) e.getSource();
200
int valS = Math.min(sliderHighS.getValue()-1, source.getValue());
201
sliderLowS.setValue(valS);
202
}
203
});
204
sliderHighS.addChangeListener(new ChangeListener() {
205
@Override
206
public void stateChanged(ChangeEvent e) {
207
JSlider source = (JSlider) e.getSource();
208
int valS = Math.max(source.getValue(), sliderLowS.getValue()+1);
209
sliderHighS.setValue(valS);
210
}
211
});
212
sliderLowV.addChangeListener(new ChangeListener() {
213
@Override
214
public void stateChanged(ChangeEvent e) {
215
JSlider source = (JSlider) e.getSource();
216
int valV = Math.min(sliderHighV.getValue()-1, source.getValue());
217
sliderLowV.setValue(valV);
218
}
219
});
220
sliderHighV.addChangeListener(new ChangeListener() {
221
@Override
222
public void stateChanged(ChangeEvent e) {
223
JSlider source = (JSlider) e.getSource();
224
int valV = Math.max(source.getValue(), sliderLowV.getValue()+1);
225
sliderHighV.setValue(valV);
226
}
227
});
228
229
pane.add(sliderPanel, BorderLayout.PAGE_START);
230
JPanel framePanel = new JPanel();
231
imgCaptureLabel = new JLabel(new ImageIcon(img));
232
framePanel.add(imgCaptureLabel);
233
imgDetectionLabel = new JLabel(new ImageIcon(img));
234
framePanel.add(imgDetectionLabel);
235
pane.add(framePanel, BorderLayout.CENTER);
236
}
237
238
private void update(Mat imgCapture, Mat imgThresh) {
239
//! [show]
240
imgCaptureLabel.setIcon(new ImageIcon(HighGui.toBufferedImage(imgCapture)));
241
imgDetectionLabel.setIcon(new ImageIcon(HighGui.toBufferedImage(imgThresh)));
242
frame.repaint();
243
//! [show]
244
}
245
246
public static void main(String[] args) {
247
// Load the native OpenCV library
248
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
249
250
// Schedule a job for the event dispatch thread:
251
// creating and showing this application's GUI.
252
javax.swing.SwingUtilities.invokeLater(new Runnable() {
253
@Override
254
public void run() {
255
new ThresholdInRange(args);
256
}
257
});
258
}
259
}
260
261