/* * Copyright (c) 2011-2015, 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.demonstrations.feature.disparity; import boofcv.gui.StandardAlgConfigPanel; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; /** * Controls GUI and settings for disparity calculation * * @author Peter Abeles */ public class DisparityDisplayPanel extends StandardAlgConfigPanel implements ChangeListener, ItemListener { // how much the input should be scaled down by JSpinner inputScaleSpinner; // selects which image to view JComboBox viewSelector; // toggles if invalid pixels are black or not JCheckBox invalidToggle; JSpinner minDisparitySpinner; JSpinner maxDisparitySpinner; JCheckBox subpixelToggle; JSpinner radiusSpinner; JSpinner errorSpinner; JSpinner reverseSpinner; JSpinner textureSpinner; // which image to show int selectedView; boolean colorInvalid = false; boolean useSubpixel = true; // minimum disparity to calculate int minDisparity = 0; // maximum disparity to calculate int maxDisparity = 50; // maximum allowed per pixel error int pixelError = 30; // reverse association tolerance int reverseTol = 6; // how large the region radius is int regionRadius = 3; // How diverse the texture needs to be double texture = 0.1; // scale factor for input images double inputScale = 0.5; // listener for changes in states Listener listener; public DisparityDisplayPanel() { inputScaleSpinner = new JSpinner(new SpinnerNumberModel(inputScale,0.25, 1, 0.1)); inputScaleSpinner.addChangeListener(this); inputScaleSpinner.setMaximumSize(inputScaleSpinner.getPreferredSize()); viewSelector = new JComboBox(); viewSelector.addItem("Disparity"); viewSelector.addItem("Left"); viewSelector.addItem("Right"); viewSelector.addItem("View 3D"); viewSelector.addItemListener(this); viewSelector.setMaximumSize(viewSelector.getPreferredSize()); invalidToggle = new JCheckBox("Color Invalid"); invalidToggle.setSelected(colorInvalid); invalidToggle.addItemListener(this); invalidToggle.setMaximumSize(invalidToggle.getPreferredSize()); minDisparitySpinner = new JSpinner(new SpinnerNumberModel(minDisparity,0, 255, 5)); minDisparitySpinner.addChangeListener(this); minDisparitySpinner.setMaximumSize(minDisparitySpinner.getPreferredSize()); maxDisparitySpinner = new JSpinner(new SpinnerNumberModel(maxDisparity,1, 255, 5)); maxDisparitySpinner.addChangeListener(this); maxDisparitySpinner.setMaximumSize(maxDisparitySpinner.getPreferredSize()); subpixelToggle = new JCheckBox("Subpixel"); subpixelToggle.setSelected(useSubpixel); subpixelToggle.addItemListener(this); subpixelToggle.setMaximumSize(invalidToggle.getPreferredSize()); radiusSpinner = new JSpinner(new SpinnerNumberModel(regionRadius,1, 30, 1)); radiusSpinner.addChangeListener(this); radiusSpinner.setMaximumSize(radiusSpinner.getPreferredSize()); errorSpinner = new JSpinner(new SpinnerNumberModel(pixelError,-1, 80, 5)); errorSpinner.addChangeListener(this); errorSpinner.setMaximumSize(errorSpinner.getPreferredSize()); reverseSpinner = new JSpinner(new SpinnerNumberModel(reverseTol,-1, 50, 1)); reverseSpinner.addChangeListener(this); reverseSpinner.setMaximumSize(reverseSpinner.getPreferredSize()); textureSpinner = new JSpinner(new SpinnerNumberModel(texture,0.0, 1, 0.05)); textureSpinner.addChangeListener(this); textureSpinner.setPreferredSize(new Dimension(60,reverseSpinner.getPreferredSize().height)); textureSpinner.setMaximumSize(textureSpinner.getPreferredSize()); addLabeled(viewSelector, "View ", this); addAlignLeft(invalidToggle,this); addSeparator(100); addLabeled(minDisparitySpinner, "Min Disparity", this); addLabeled(maxDisparitySpinner, "Max Disparity", this); addAlignLeft(subpixelToggle,this); addLabeled(radiusSpinner, "Region Radius", this); addLabeled(errorSpinner, "Max Error", this); addLabeled(textureSpinner, "Texture", this); addLabeled(reverseSpinner, "Reverse", this); addSeparator(100); addLabeled(inputScaleSpinner, "Image Scale", this); addVerticalGlue(this); } @Override public void stateChanged(ChangeEvent e) { if( listener == null ) return; if( e.getSource() == inputScaleSpinner) { inputScale = ((Number) inputScaleSpinner.getValue()).doubleValue(); listener.changeInputScale(); return; } else if( e.getSource() == reverseSpinner) { reverseTol = ((Number) reverseSpinner.getValue()).intValue(); } else if( e.getSource() == minDisparitySpinner) { minDisparity = ((Number) minDisparitySpinner.getValue()).intValue(); } else if( e.getSource() == maxDisparitySpinner) { maxDisparity = ((Number) maxDisparitySpinner.getValue()).intValue(); } else if( e.getSource() == errorSpinner) { pixelError = ((Number) errorSpinner.getValue()).intValue(); } else if( e.getSource() == radiusSpinner) { regionRadius = ((Number) radiusSpinner.getValue()).intValue(); } else if( e.getSource() == textureSpinner) { texture = ((Number) textureSpinner.getValue()).doubleValue(); } if( minDisparity >= maxDisparity ) { minDisparity = maxDisparity-1; minDisparitySpinner.setValue(minDisparity); } else { listener.disparitySettingChange(); } } @Override public void itemStateChanged(ItemEvent e) { if( listener == null ) return; if( e.getSource() == viewSelector ) { selectedView = viewSelector.getSelectedIndex(); listener.disparityGuiChange(); } else if( e.getSource() == invalidToggle) { colorInvalid = invalidToggle.isSelected(); listener.disparityRender(); } else if( e.getSource() == subpixelToggle ) { useSubpixel = subpixelToggle.isSelected(); listener.disparitySettingChange(); } } public void setActiveGui( boolean error , boolean reverse ) { setEnabled(12,error); setEnabled(13,reverse); setEnabled(14,error); setEnabled(15,reverse); } public void setListener(Listener listener ) { this.listener = listener; } public int getReverseTol() { return reverseTol; } public int getMaxDisparity() { return maxDisparity; } public int getPixelError() { return pixelError; } public int getSelectedView() { return selectedView; } public int getRegionRadius() { return regionRadius; } public double getTexture() { return texture; } public static interface Listener { public void disparitySettingChange(); public void disparityGuiChange(); public void disparityRender(); public void changeInputScale(); } }