/*
* Copyright (c) 2011-2016, 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.app.calib;
import boofcv.gui.StandardAlgConfigPanel;
import boofcv.gui.image.ImagePanel;
import boofcv.gui.image.ScaleOptions;
import boofcv.io.image.ConvertBufferedImage;
import boofcv.struct.image.GrayF32;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
/**
* @author Peter Abeles
*/
public class CalibrationInfoPanel extends StandardAlgConfigPanel
implements ActionListener
{
JProgressBar geometryProgress;
JProgressBar fillProgress;
JProgressBar focusMeter;
ImagePanel undistortedTemplate = new ImagePanel(80,80);
ImagePanel undistortedView = new ImagePanel(80,80);
BufferedImage imageView;
BufferedImage imageTemplate;
JButton forceSaveButton = new JButton("Debug Save");
JButton finishedButton = new JButton("Finished");
double focusMax = 1.0;
// when true that means the user has requested to save the results and compute intrinsic parameters
boolean saveRequested = false;
boolean forceSaveImage = false;
public CalibrationInfoPanel() {
geometryProgress = new JProgressBar(0, 100);
geometryProgress.setValue(0);
geometryProgress.setStringPainted(true);
fillProgress = new JProgressBar(0, 100);
fillProgress.setValue(0);
fillProgress.setStringPainted(true);
focusMeter = new JProgressBar(0, 100);
focusMeter.setValue(0);
focusMeter.setStringPainted(true);
// scale the images up
undistortedTemplate.setScaling(ScaleOptions.ALL);
undistortedView.setScaling(ScaleOptions.ALL);
JPanel imageRow = new JPanel();
imageRow.setLayout(new BoxLayout(imageRow, BoxLayout.X_AXIS));
imageRow.add(undistortedTemplate);
imageRow.add(Box.createRigidArea(new Dimension(10,10)));
imageRow.add(undistortedView);
imageRow.setMaximumSize(imageRow.getPreferredSize());
finishedButton.addActionListener(this);
finishedButton.setEnabled(false);
forceSaveButton.addActionListener(this);
addCenterLabel("Geometry", this);
addAlignCenter(geometryProgress, this);
addCenterLabel("Edge Fill",this);
addAlignCenter(fillProgress, this);
add(Box.createRigidArea(new Dimension(5, 5)));
addAlignCenter(imageRow, this);
addAlignCenter(focusMeter, this);
add(Box.createRigidArea(new Dimension(5, 50)));
add(finishedButton);
add(Box.createVerticalGlue());
add(forceSaveButton);
}
public void updateTemplate( GrayF32 image ) {
if( imageTemplate == null ) {
imageTemplate = new BufferedImage(image.width,image.height,BufferedImage.TYPE_INT_BGR);
}
ConvertBufferedImage.convertTo(image,imageTemplate);
undistortedTemplate.setBufferedImageSafe(imageTemplate);
}
public void updateView( GrayF32 image ) {
if( imageView == null ) {
imageView = new BufferedImage(image.width,image.height,BufferedImage.TYPE_INT_BGR);
}
ConvertBufferedImage.convertTo(image,imageView);
undistortedView.setBufferedImageSafe(imageView);
}
public void updateGeometry( final double process ) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
geometryProgress.setValue((int)(100*process));
}
});
}
public void updateEdgeFill(final double process) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
fillProgress.setValue((int)(100*process));
}
});
}
public void updateFocusScore( final double score ) {
this.focusMax = Math.max(focusMax,score);
final double value = score/focusMax;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
focusMeter.setValue((int)(100*value));
}
});
}
public boolean isFinished() {
return saveRequested;
}
public void enabledFinishedButton() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
finishedButton.setEnabled(true);
}
});
}
public void resetForceSave() {
forceSaveImage = false;
}
@Override
public void actionPerformed(ActionEvent e) {
if( e.getSource() == finishedButton) {
saveRequested = true;
} else if( e.getSource() == forceSaveButton ) {
forceSaveImage = true;
}
}
}