boofcv.io.webcamcapture.OpenWebcamDialog Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of boofcv-WebcamCapture Show documentation
Show all versions of boofcv-WebcamCapture Show documentation
BoofCV is an open source Java library for real-time computer vision and robotics applications.
The newest version!
/*
* Copyright (c) 2021, Peter Abeles. All Rights Reserved.
*
* This file is part of BoofCV (http://boofcv.org).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package boofcv.io.webcamcapture;
import boofcv.gui.BoofSwingUtil;
import boofcv.gui.StandardAlgConfigPanel;
import com.github.sarxos.webcam.Webcam;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
/**
* Opens a dialog and lets the user configure the camera and select which one
*
* @author Peter Abeles
*/
public class OpenWebcamDialog extends StandardAlgConfigPanel {
JDialog dialog;
JComboBox comboCameras;
@Nullable Webcam selectedCamera;
JFormattedTextField fieldWidth, fieldHeight;
int width, height;
DefaultComboBoxModel modelSizes = new DefaultComboBoxModel();
JComboBox comboSizes = new JComboBox(modelSizes);
JCheckBox cSave = new JCheckBox("Save");
JButton bCancel = new JButton("Cancel");
JButton bOK = new JButton("OK");
volatile boolean concluded = false;
ActionListener cameraListener;
ActionListener sizeListener;
public OpenWebcamDialog( JDialog dialog ) {
this.dialog = dialog;
setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
final List cameras = Webcam.getWebcams();
List names = new ArrayList<>();
for (Webcam w : cameras) {
names.add(w.getName());
}
bOK.addActionListener(e -> actionOK());
bCancel.addActionListener(e -> actionCancel());
cSave.setSelected(true);
fieldWidth = BoofSwingUtil.createTextField(0, 0, 20000);
fieldHeight = BoofSwingUtil.createTextField(0, 0, 20000);
fieldWidth.setPreferredSize(new Dimension(150, 30));
fieldHeight.setPreferredSize(new Dimension(150, 30));
fieldWidth.setMaximumSize(fieldWidth.getPreferredSize());
fieldHeight.setMaximumSize(fieldHeight.getPreferredSize());
fieldWidth.addPropertyChangeListener(evt -> width = (Integer)fieldWidth.getValue());
fieldHeight.addPropertyChangeListener(evt -> height = (Integer)fieldHeight.getValue());
comboSizes.setPreferredSize(new Dimension(200, 30));
comboSizes.setMaximumSize(comboSizes.getPreferredSize());
comboCameras = new JComboBox(names.toArray());
comboCameras.setPreferredSize(new Dimension(200, 30));
comboCameras.setMaximumSize(comboCameras.getPreferredSize());
cameraListener = e -> {
Webcam w = cameras.get(comboCameras.getSelectedIndex());
selectedCamera = w;
Dimension s = w.getViewSize();
setCameraSize(s.width, s.height);
comboSizes.removeActionListener(sizeListener);
modelSizes.removeAllElements();
for (Dimension d : w.getViewSizes()) {
modelSizes.addElement(d.width + " x " + d.height);
}
comboSizes.addActionListener(sizeListener);
};
comboCameras.addActionListener(cameraListener);
sizeListener = e -> {
Webcam w = cameras.get(comboCameras.getSelectedIndex());
selectedCamera = w;
String text = (String)comboSizes.getSelectedItem();
if (text == null)
return;
String words[] = text.split(" x ");
int width = Integer.parseInt(words[0]);
int height = Integer.parseInt(words[1]);
setCameraSize(width, height);
};
comboSizes.addActionListener(sizeListener);
final JPanel sizePanel = new JPanel();
sizePanel.setLayout(new BoxLayout(sizePanel, BoxLayout.X_AXIS));
sizePanel.add(fieldWidth);
sizePanel.add(Box.createHorizontalStrut(10));
sizePanel.add(fieldHeight);
sizePanel.setMaximumSize(sizePanel.getPreferredSize());
final JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
buttonPanel.add(bCancel);
buttonPanel.add(Box.createHorizontalGlue());
buttonPanel.add(bOK);
// buttonPanel.setMaximumSize(buttonPanel.getPreferredSize());
dialog.getRootPane().setDefaultButton(bOK);
final JPanel checkPanel = new JPanel();
checkPanel.setLayout(new BoxLayout(checkPanel, BoxLayout.X_AXIS));
checkPanel.add(cSave);
checkPanel.add(Box.createHorizontalGlue());
// checkPanel.setMaximumSize(checkPanel.getPreferredSize());
addLabeled(comboCameras, "Webcam");
addLabeled(sizePanel, "Size");
addAlignRight(comboSizes, this);
add(checkPanel);
add(buttonPanel);
comboCameras.setSelectedIndex(0);
loadPreferences();
}
public boolean loadPreferences() {
Preferences prefs = Preferences.userRoot().node(getClass().getSimpleName());
String cameraName = prefs.get("camera", "");
final int width = prefs.getInt("width", -1);
final int height = prefs.getInt("height", -1);
if (cameraName.length() <= 0)
return false;
List cameras = Webcam.getWebcams();
int match = -1;
for (int i = 0; i < cameras.size(); i++) {
Webcam w = cameras.get(i);
if (w.getName().equals(cameraName)) {
match = i;
break;
}
}
if (match == -1)
return false;
comboCameras.removeActionListener(cameraListener);
comboCameras.setSelectedIndex(match);
if (width > 0 && height > 0) {
setCameraSize(width, height);
}
comboCameras.addActionListener(cameraListener);
return true;
}
public void savePreferences() {
if (selectedCamera == null)
return;
Preferences prefs = Preferences.userRoot().node(getClass().getSimpleName());
prefs.put("camera", selectedCamera.getName());
prefs.putInt("width", width);
prefs.putInt("height", height);
try {
prefs.flush();
} catch (BackingStoreException ignore) {
}
}
private void setCameraSize( final int width, final int height ) {
// BoofSwingUtil.checkGuiThread();
this.width = width;
this.height = height;
fieldWidth.setValue(width);
fieldHeight.setValue(height);
// BoofSwingUtil.invokeNowOrLater(new Runnable() {
//// SwingUtilities.invokeLater( new Runnable() {
// @Override
// public void run() {
// fieldWidth.setValue(width);
// fieldHeight.setValue(height);
// }
// });
}
public static @Nullable Selection showDialog( @Nullable Window owner ) {
if (Webcam.getWebcams().size() == 0) {
JOptionPane.showMessageDialog(owner, "No webcams found!");
return null;
}
JDialog dialog = new JDialog(owner, "Select Webcam", Dialog.ModalityType.APPLICATION_MODAL);
final OpenWebcamDialog panel = new OpenWebcamDialog(dialog);
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing( WindowEvent e ) {
panel.actionCancel();
}
});
dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
dialog.getContentPane().setLayout(new BorderLayout());
dialog.getContentPane().add(panel, BorderLayout.CENTER);
dialog.setSize(new Dimension(400, 200));
// dialog.pack();
if (owner != null)
dialog.setLocationRelativeTo(owner);
dialog.setVisible(true);
// should block at this point
dialog.dispose();
if (panel.selectedCamera != null) {
Selection s = new Selection();
s.camera = panel.selectedCamera;
s.width = panel.getSelectedWidth();
s.height = panel.getSelectedHeight();
return s;
} else {
return null;
}
}
public void actionOK() {
if (cSave.isSelected()) {
savePreferences();
}
dialog.setVisible(false);
concluded = true;
}
public void actionCancel() {
selectedCamera = null;
dialog.setVisible(false);
concluded = true;
}
public int getSelectedWidth() {
return width;
}
public int getSelectedHeight() {
return height;
}
@SuppressWarnings({"NullAway.Init"})
public static class Selection {
public Webcam camera;
public int width, height;
}
public static void main( String[] args ) {
Selection s = OpenWebcamDialog.showDialog(null);
if (s != null)
System.out.println("Selected camera. " + s.width + " " + s.height);
else
System.out.println("Didn't select camera");
System.exit(0);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy