/*
* 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();
}
}