727 lines
38 KiB
Java
727 lines
38 KiB
Java
|
|
|
|
import ch.psi.utils.swing.StandardDialog;
|
|
import ch.psi.utils.swing.SwingUtils;
|
|
import ch.psi.pshell.bs.CameraServer;
|
|
import ch.psi.pshell.imaging.Overlay;
|
|
import ch.psi.pshell.imaging.Overlays;
|
|
import ch.psi.pshell.imaging.Pen;
|
|
import ch.psi.pshell.imaging.Renderer;
|
|
import ch.psi.pshell.imaging.RendererListener;
|
|
import ch.psi.pshell.imaging.RendererMode;
|
|
import ch.psi.pshell.ui.App;
|
|
import ch.psi.utils.Convert;
|
|
import java.awt.Color;
|
|
import java.awt.Dimension;
|
|
import java.awt.Frame;
|
|
import java.awt.Point;
|
|
import java.awt.Rectangle;
|
|
import java.io.IOException;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.util.Arrays;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import javax.swing.JDialog;
|
|
|
|
|
|
/*
|
|
*/
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public class CameraCalibrationDialog extends StandardDialog {
|
|
|
|
CameraServer server;
|
|
Renderer renderer;
|
|
String cameraName;
|
|
Overlay[] calibrationOverlays;
|
|
Pen pen = new Pen(new Color(128, 0, 128), 1, Pen.LineStyle.solid);
|
|
Overlays.Crosshairs ovTop = new Overlays.Crosshairs(pen, new Dimension(-1, 1));
|
|
Overlays.Crosshairs ovBottom = new Overlays.Crosshairs(pen, new Dimension(-1, 1));
|
|
Overlays.Crosshairs ovLeft = new Overlays.Crosshairs(pen, new Dimension(1, -1));
|
|
Overlays.Crosshairs ovRight = new Overlays.Crosshairs(pen, new Dimension(1, -1));
|
|
|
|
/**
|
|
*
|
|
* {
|
|
* name=SINEG01-DSCR350,
|
|
* prefix=SINEG01-DSCR350,
|
|
* mirror_x=true,
|
|
* mirror_y=true,
|
|
* rotate=0,
|
|
* calibration={
|
|
* horizontal_camera_angle=0,
|
|
* vertical_camera_angle=0
|
|
* reference_marker_width=16000.0,
|
|
* reference_marker_height=16000.0,
|
|
* reference_marker=[120, 245, 1251, 1504],
|
|
* },
|
|
* }
|
|
*/
|
|
public CameraCalibrationDialog(Frame parent, String cameraName, Renderer renderer) throws IOException {
|
|
super(parent, cameraName, false);
|
|
|
|
initComponents();
|
|
|
|
if (App.hasArgument("cam_srv_url")) {
|
|
this.server = new CameraServer("Camera Server", App.getArgumentValue("cam_srv_url"));
|
|
} else {
|
|
this.server = new CameraServer("Camera Server");
|
|
}
|
|
|
|
|
|
this.cameraName = cameraName;
|
|
this.renderer = renderer;
|
|
|
|
Map<String, Object> config = server.getConfig(cameraName);
|
|
Map<String, Object> calibration = (Map<String, Object>) config.get("camera_calibration");
|
|
List<Integer> refMarker = null;
|
|
System.out.println("Current config: " + config);
|
|
checkMirrorX.setSelected((config.get("mirror_x") ==null) ? Boolean.FALSE: (Boolean)config.get("mirror_x"));
|
|
checkMirrorY.setSelected((config.get("mirror_y") ==null) ? Boolean.FALSE: (Boolean)config.get("mirror_y"));
|
|
comboRotation.setSelectedIndex((config.get("rotate") == null) ? 0 :(Integer) (config.get("rotate")));
|
|
ckCalibrationEnabled.setSelected(calibration!=null);
|
|
if (calibration!=null){
|
|
spinnerRefWidth.setValue(((Number)calibration.get("reference_marker_width")).doubleValue());
|
|
spinnerRefHeight.setValue(((Number)calibration.get("reference_marker_height")).doubleValue());
|
|
spinnerAngleHor.setValue(((Number)calibration.get("angle_horizontal")).doubleValue());
|
|
spinnerAngleVer.setValue(((Number)calibration.get("angle_vertical")).doubleValue());
|
|
refMarker = ((List)calibration.get("reference_marker"));
|
|
if (refMarker.size()==4){
|
|
spinnerLeft.setValue(refMarker.get(0));
|
|
spinnerTop.setValue(refMarker.get(1));
|
|
spinnerRight.setValue(refMarker.get(2));
|
|
spinnerBottom.setValue(refMarker.get(3));
|
|
}
|
|
}
|
|
updateResults();
|
|
|
|
|
|
renderer.setMode(RendererMode.Fit);
|
|
calibrationOverlays = new Overlay[]{ovTop, ovBottom, ovLeft, ovRight};
|
|
for (Overlay ov : calibrationOverlays){
|
|
ov.setMovable(true);
|
|
}
|
|
renderer.addOverlays(calibrationOverlays);
|
|
|
|
try{
|
|
Rectangle r = new Rectangle();
|
|
ovLeft.update(new Point(Math.max(refMarker.get(0), 0), 0));
|
|
ovTop.update(new Point(0, Math.max(refMarker.get(1), 0)));
|
|
ovRight.update(new Point(Math.max(refMarker.get(2), 0), 0));
|
|
ovBottom.update(new Point(0, Math.max(refMarker.get(3),0)));
|
|
} catch (Exception ex){
|
|
SwingUtils.invokeDelayed(() -> {
|
|
Dimension size = renderer.getImageSize();
|
|
ovTop.update(new Point(0, size.height/8));
|
|
ovBottom.update(new Point(0, 7*size.height/8));
|
|
ovLeft.update(new Point(size.width/8, 0));
|
|
ovRight.update(new Point(7*size.width/8, 0));
|
|
}, 500);
|
|
}
|
|
renderer.addListener(new RendererListener(){
|
|
@Override
|
|
public void onMoveFinished(Renderer renderer, Overlay overlay) {
|
|
if (overlay==ovTop){
|
|
spinnerTop.setValue(ovTop.getPosition().y);
|
|
} else if (overlay==ovBottom){
|
|
spinnerBottom.setValue(ovBottom.getPosition().y);
|
|
} else if (overlay==ovLeft){
|
|
spinnerLeft.setValue(ovLeft.getPosition().x);
|
|
} else if (overlay==ovRight){
|
|
spinnerRight.setValue(ovRight.getPosition().x);
|
|
}
|
|
}
|
|
});
|
|
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
|
pack();
|
|
}
|
|
|
|
@Override
|
|
protected void onClosed() {
|
|
renderer.removeOverlays(calibrationOverlays);
|
|
calibrationOverlays = null;
|
|
server.close();
|
|
}
|
|
|
|
|
|
void updateResults(){
|
|
try{
|
|
int left = (Integer)spinnerLeft.getValue();
|
|
int right = (Integer)spinnerRight.getValue();
|
|
int top = (Integer)spinnerTop.getValue();
|
|
int bottom = (Integer)spinnerBottom.getValue();
|
|
double width = (Double)spinnerRefWidth.getValue();
|
|
double height = (Double)spinnerRefHeight.getValue();
|
|
double angleHor = (Double)spinnerAngleHor.getValue();
|
|
double angleVer = (Double)spinnerAngleVer.getValue();
|
|
double pixelHor = width * Math.cos(Math.toRadians(angleHor)) /Math.abs(right-left);
|
|
double pixelVer = height * Math.cos(Math.toRadians(angleVer)) /Math.abs(bottom-top);
|
|
textOriginX.setText(String.valueOf((left+right)/2));
|
|
textOriginY.setText(String.valueOf((top+bottom)/2));
|
|
textPixelSizeX.setText(String.valueOf(Convert.roundDouble(pixelHor, 2)));
|
|
textPixelSizeY.setText(String.valueOf(Convert.roundDouble(pixelVer, 2)));
|
|
ovLeft.update(new Point(Math.max(left, 0), 0));
|
|
ovTop.update(new Point(0, Math.max(top, 0)));
|
|
ovRight.update(new Point(Math.max(right, 0), 0));
|
|
ovBottom.update(new Point(0, Math.max(bottom,0)));
|
|
renderer.refresh();
|
|
|
|
} catch (Exception ex){
|
|
SwingUtils.showException(this, ex);
|
|
}
|
|
}
|
|
|
|
|
|
public static void main(String args[]) throws Exception {
|
|
//String cameraName = "SINEG01-DSCR190";
|
|
String cameraName = "SATSY02-DSCR220" ;
|
|
//java.awt.EventQueue.invokeLater(() -> {
|
|
Renderer renderer = new Renderer();
|
|
JDialog dlgRenderer = SwingUtils.showDialog(null, cameraName, new Dimension(600,400), renderer);
|
|
CameraCalibrationDialog dialog = new CameraCalibrationDialog(null, cameraName, renderer);
|
|
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
|
|
@Override
|
|
public void windowClosing(java.awt.event.WindowEvent e) {
|
|
dlgRenderer.setVisible(false);
|
|
System.exit(0);
|
|
}
|
|
});
|
|
SwingUtils.centerComponent(null, dialog);
|
|
dialog.setVisible(true);
|
|
// });
|
|
}
|
|
|
|
/**
|
|
* This method is called from within the constructor to initialize the form.
|
|
* WARNING: Do NOT modify this code. The content of this method is always
|
|
* regenerated by the Form Editor.
|
|
*/
|
|
@SuppressWarnings("unchecked")
|
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
private void initComponents() {
|
|
|
|
jLabel1 = new javax.swing.JLabel();
|
|
jPanel1 = new javax.swing.JPanel();
|
|
jLabel4 = new javax.swing.JLabel();
|
|
jLabel5 = new javax.swing.JLabel();
|
|
jLabel6 = new javax.swing.JLabel();
|
|
jLabel3 = new javax.swing.JLabel();
|
|
jLabel2 = new javax.swing.JLabel();
|
|
jLabel8 = new javax.swing.JLabel();
|
|
jLabel9 = new javax.swing.JLabel();
|
|
jLabel10 = new javax.swing.JLabel();
|
|
spinnerAngleHor = new javax.swing.JSpinner();
|
|
spinnerAngleVer = new javax.swing.JSpinner();
|
|
spinnerRefWidth = new javax.swing.JSpinner();
|
|
spinnerRefHeight = new javax.swing.JSpinner();
|
|
spinnerTop = new javax.swing.JSpinner();
|
|
spinnerBottom = new javax.swing.JSpinner();
|
|
spinnerLeft = new javax.swing.JSpinner();
|
|
spinnerRight = new javax.swing.JSpinner();
|
|
buttonFetch = new javax.swing.JButton();
|
|
ckCalibrationEnabled = new javax.swing.JCheckBox();
|
|
jPanel2 = new javax.swing.JPanel();
|
|
checkMirrorX = new javax.swing.JCheckBox();
|
|
checkMirrorY = new javax.swing.JCheckBox();
|
|
comboRotation = new javax.swing.JComboBox();
|
|
jLabel7 = new javax.swing.JLabel();
|
|
jPanel3 = new javax.swing.JPanel();
|
|
jLabel11 = new javax.swing.JLabel();
|
|
textOriginX = new javax.swing.JTextField();
|
|
jLabel12 = new javax.swing.JLabel();
|
|
textOriginY = new javax.swing.JTextField();
|
|
jLabel13 = new javax.swing.JLabel();
|
|
jLabel14 = new javax.swing.JLabel();
|
|
textPixelSizeX = new javax.swing.JTextField();
|
|
textPixelSizeY = new javax.swing.JTextField();
|
|
buttonOk = new javax.swing.JButton();
|
|
buttonCancel = new javax.swing.JButton();
|
|
buttonApply = new javax.swing.JButton();
|
|
|
|
jLabel1.setText("Calibrate the camera moving the line overlays to the reference marks.");
|
|
|
|
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Calibration"));
|
|
|
|
jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel4.setText("Reference marker height (um):");
|
|
|
|
jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel5.setText("Horizontal camera angle (deg):");
|
|
|
|
jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel6.setText("Vertical camera angle (deg):");
|
|
|
|
jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel3.setText("Reference marker width (um):");
|
|
|
|
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel2.setText("Top (px):");
|
|
|
|
jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel8.setText("Botton (px):");
|
|
|
|
jLabel9.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel9.setText("Left (px):");
|
|
|
|
jLabel10.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
|
|
jLabel10.setText("Right (px):");
|
|
|
|
spinnerAngleHor.setModel(new javax.swing.SpinnerNumberModel(0.0d, -360.0d, 360.0d, 1.0d));
|
|
spinnerAngleHor.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerAngleVer.setModel(new javax.swing.SpinnerNumberModel(0.0d, -360.0d, 360.0d, 1.0d));
|
|
spinnerAngleVer.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerRefWidth.setModel(new javax.swing.SpinnerNumberModel(30000.0d, 1.0d, 500000.0d, 1.0d));
|
|
spinnerRefWidth.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerRefHeight.setModel(new javax.swing.SpinnerNumberModel(30000.0d, 1.0d, 500000.0d, 1.0d));
|
|
spinnerRefHeight.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerTop.setModel(new javax.swing.SpinnerNumberModel(0, -10000, 10000, 1));
|
|
spinnerTop.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerBottom.setModel(new javax.swing.SpinnerNumberModel(0, -10000, 10000, 1));
|
|
spinnerBottom.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerLeft.setModel(new javax.swing.SpinnerNumberModel(0, -10000, 10000, 1));
|
|
spinnerLeft.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
spinnerRight.setModel(new javax.swing.SpinnerNumberModel(0, -10000, 10000, 1));
|
|
spinnerRight.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
calibrationSpinnerChanged(evt);
|
|
}
|
|
});
|
|
|
|
buttonFetch.setText("Fetch from Inventory");
|
|
buttonFetch.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonFetchActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
ckCalibrationEnabled.setText("Enabled");
|
|
|
|
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
|
jPanel1.setLayout(jPanel1Layout);
|
|
jPanel1Layout.setHorizontalGroup(
|
|
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
.addComponent(jLabel2)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerTop, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jLabel3)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerRefWidth, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
.addComponent(jLabel8)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerBottom, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jLabel4)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerRefHeight, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
.addComponent(jLabel10)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerRight, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jLabel6)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerAngleVer, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
.addComponent(jLabel9)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerLeft, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jLabel5)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(spinnerAngleHor, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
.addGap(9, 9, 9)
|
|
.addComponent(ckCalibrationEnabled)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(buttonFetch)))
|
|
.addContainerGap())
|
|
);
|
|
|
|
jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel10, jLabel2, jLabel8, jLabel9});
|
|
|
|
jPanel1Layout.setVerticalGroup(
|
|
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel3)
|
|
.addComponent(jLabel2)
|
|
.addComponent(spinnerRefWidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(spinnerTop, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel4)
|
|
.addComponent(jLabel8)
|
|
.addComponent(spinnerRefHeight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(spinnerBottom, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel5)
|
|
.addComponent(jLabel9)
|
|
.addComponent(spinnerAngleHor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(spinnerLeft, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel6)
|
|
.addComponent(jLabel10)
|
|
.addComponent(spinnerAngleVer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(spinnerRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 12, Short.MAX_VALUE)
|
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(buttonFetch)
|
|
.addComponent(ckCalibrationEnabled))
|
|
.addContainerGap())
|
|
);
|
|
|
|
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Transformations"));
|
|
|
|
checkMirrorX.setText("Mirror X");
|
|
|
|
checkMirrorY.setText("Mirror Y");
|
|
|
|
comboRotation.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0", "270", "180", "90" }));
|
|
|
|
jLabel7.setText("Rotation: ");
|
|
|
|
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
|
|
jPanel2.setLayout(jPanel2Layout);
|
|
jPanel2Layout.setHorizontalGroup(
|
|
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addComponent(checkMirrorX)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jLabel7)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(comboRotation, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addComponent(checkMirrorY)
|
|
.addGap(0, 0, Short.MAX_VALUE)))
|
|
.addContainerGap())
|
|
);
|
|
jPanel2Layout.setVerticalGroup(
|
|
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel2Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(comboRotation, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(jLabel7))
|
|
.addComponent(checkMirrorX))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(checkMirrorY)
|
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
);
|
|
|
|
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Results"));
|
|
|
|
jLabel11.setText("Origin X (px):");
|
|
|
|
textOriginX.setEditable(false);
|
|
textOriginX.setHorizontalAlignment(javax.swing.JTextField.CENTER);
|
|
|
|
jLabel12.setText("Origin Y (px):");
|
|
|
|
textOriginY.setEditable(false);
|
|
textOriginY.setHorizontalAlignment(javax.swing.JTextField.CENTER);
|
|
|
|
jLabel13.setText("Y pixel size (um/px):");
|
|
|
|
jLabel14.setText("X pixel size (um/px):");
|
|
|
|
textPixelSizeX.setEditable(false);
|
|
textPixelSizeX.setHorizontalAlignment(javax.swing.JTextField.CENTER);
|
|
|
|
textPixelSizeY.setEditable(false);
|
|
textPixelSizeY.setHorizontalAlignment(javax.swing.JTextField.CENTER);
|
|
|
|
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
|
|
jPanel3.setLayout(jPanel3Layout);
|
|
jPanel3Layout.setHorizontalGroup(
|
|
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addGap(21, 21, 21)
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addComponent(jLabel12)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(textOriginY, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addComponent(jLabel11)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(textOriginX, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addComponent(jLabel13)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(textPixelSizeY, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addComponent(jLabel14)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(textPixelSizeX, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
.addContainerGap())
|
|
);
|
|
|
|
jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel11, jLabel12});
|
|
|
|
jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel13, jLabel14});
|
|
|
|
jPanel3Layout.setVerticalGroup(
|
|
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel14)
|
|
.addComponent(textPixelSizeX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel13)
|
|
.addComponent(textPixelSizeY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel11)
|
|
.addComponent(textOriginX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(jLabel12)
|
|
.addComponent(textOriginY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
|
|
.addContainerGap())
|
|
);
|
|
|
|
buttonOk.setText("Ok");
|
|
buttonOk.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonOkActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
buttonCancel.setText("Cancel");
|
|
buttonCancel.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonCancelActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
buttonApply.setText("Apply");
|
|
buttonApply.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
buttonApplyActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
|
getContentPane().setLayout(layout);
|
|
layout.setHorizontalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGap(0, 0, Short.MAX_VALUE)
|
|
.addComponent(buttonCancel)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(buttonApply)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(buttonOk)
|
|
.addGap(0, 0, Short.MAX_VALUE)))
|
|
.addContainerGap())
|
|
);
|
|
|
|
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonApply, buttonCancel, buttonOk});
|
|
|
|
layout.setVerticalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addComponent(jLabel1)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(buttonOk)
|
|
.addComponent(buttonCancel)
|
|
.addComponent(buttonApply))
|
|
.addContainerGap())
|
|
);
|
|
}// </editor-fold>//GEN-END:initComponents
|
|
|
|
private void buttonOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOkActionPerformed
|
|
|
|
buttonApplyActionPerformed(evt);
|
|
accept();
|
|
}//GEN-LAST:event_buttonOkActionPerformed
|
|
|
|
private void buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed
|
|
cancel();
|
|
}//GEN-LAST:event_buttonCancelActionPerformed
|
|
|
|
private void buttonFetchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonFetchActionPerformed
|
|
try{
|
|
//List<Double> calib = Inventory.getCalibFromInventory(null, cameraName);
|
|
List<Double> calib = (List<Double>) Class.forName("Inventory").
|
|
getMethod("getCalibFromInventory",
|
|
new Class[]{String.class,String.class}).
|
|
invoke(null, new Object[]{(String)null, cameraName});
|
|
spinnerRefWidth.setValue(calib.get(0)*1000.0);
|
|
spinnerRefHeight.setValue(calib.get(1)*1000.0);
|
|
spinnerAngleHor.setValue(calib.get(2).doubleValue());
|
|
spinnerAngleVer.setValue(calib.get(3).doubleValue());
|
|
} catch (Exception ex){
|
|
if (ex instanceof InvocationTargetException){
|
|
ex = (Exception) ((InvocationTargetException)ex).getCause();
|
|
}
|
|
SwingUtils.showException(this, ex);
|
|
}
|
|
}//GEN-LAST:event_buttonFetchActionPerformed
|
|
|
|
private void calibrationSpinnerChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_calibrationSpinnerChanged
|
|
updateResults();
|
|
}//GEN-LAST:event_calibrationSpinnerChanged
|
|
|
|
private void buttonApplyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonApplyActionPerformed
|
|
try {
|
|
int left = (Integer)spinnerLeft.getValue(); //left.getPosition().x
|
|
int right = (Integer)spinnerRight.getValue(); //right.getPosition().x
|
|
int top = (Integer)spinnerTop.getValue(); //top.getPosition().y
|
|
int bottom = (Integer)spinnerBottom.getValue(); //bottom.getPosition().y
|
|
double width = (Double)spinnerRefWidth.getValue();
|
|
double height = (Double)spinnerRefHeight.getValue();
|
|
double angleHor = (Double)spinnerAngleHor.getValue();
|
|
double angleVer = (Double)spinnerAngleVer.getValue();
|
|
|
|
int x1 = Math.min(left, right);
|
|
int x2 = Math.max(left, right);
|
|
int y1 = Math.min(top, bottom);
|
|
int y2 = Math.max(top, bottom);
|
|
System.out.println("Updating " + cameraName + " configuration");
|
|
HashMap calibration = null;
|
|
if (ckCalibrationEnabled.isSelected()){
|
|
calibration = new HashMap();
|
|
calibration.put("reference_marker", Arrays.asList(new Integer[]{x1, y1, x2, y2}));
|
|
calibration.put("reference_marker_width", width);
|
|
calibration.put("reference_marker_height", height);
|
|
calibration.put("angle_horizontal", angleHor);
|
|
calibration.put("angle_vertical", angleVer);
|
|
}
|
|
|
|
Map<String, Object> config = server.getConfig(cameraName);
|
|
config.put("camera_calibration", calibration);
|
|
config.put("mirror_x", checkMirrorX.isSelected());
|
|
config.put("mirror_y", checkMirrorY.isSelected());
|
|
config.put("rotate", comboRotation.getSelectedIndex());
|
|
server.setConfig(cameraName, config);
|
|
|
|
System.out.println("New config: " + config);
|
|
boolean reticle = renderer.getShowReticle();
|
|
if (reticle){
|
|
renderer.setShowReticle(false);
|
|
}
|
|
SwingUtils.showMessage(this, "Success", "Updated " + cameraName + " configuration");
|
|
|
|
if (reticle){
|
|
renderer.setShowReticle(true);
|
|
}
|
|
} catch (Exception ex) {
|
|
SwingUtils.showException(this, ex);
|
|
}
|
|
}//GEN-LAST:event_buttonApplyActionPerformed
|
|
|
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
private javax.swing.JButton buttonApply;
|
|
private javax.swing.JButton buttonCancel;
|
|
private javax.swing.JButton buttonFetch;
|
|
private javax.swing.JButton buttonOk;
|
|
private javax.swing.JCheckBox checkMirrorX;
|
|
private javax.swing.JCheckBox checkMirrorY;
|
|
private javax.swing.JCheckBox ckCalibrationEnabled;
|
|
private javax.swing.JComboBox comboRotation;
|
|
private javax.swing.JLabel jLabel1;
|
|
private javax.swing.JLabel jLabel10;
|
|
private javax.swing.JLabel jLabel11;
|
|
private javax.swing.JLabel jLabel12;
|
|
private javax.swing.JLabel jLabel13;
|
|
private javax.swing.JLabel jLabel14;
|
|
private javax.swing.JLabel jLabel2;
|
|
private javax.swing.JLabel jLabel3;
|
|
private javax.swing.JLabel jLabel4;
|
|
private javax.swing.JLabel jLabel5;
|
|
private javax.swing.JLabel jLabel6;
|
|
private javax.swing.JLabel jLabel7;
|
|
private javax.swing.JLabel jLabel8;
|
|
private javax.swing.JLabel jLabel9;
|
|
private javax.swing.JPanel jPanel1;
|
|
private javax.swing.JPanel jPanel2;
|
|
private javax.swing.JPanel jPanel3;
|
|
private javax.swing.JSpinner spinnerAngleHor;
|
|
private javax.swing.JSpinner spinnerAngleVer;
|
|
private javax.swing.JSpinner spinnerBottom;
|
|
private javax.swing.JSpinner spinnerLeft;
|
|
private javax.swing.JSpinner spinnerRefHeight;
|
|
private javax.swing.JSpinner spinnerRefWidth;
|
|
private javax.swing.JSpinner spinnerRight;
|
|
private javax.swing.JSpinner spinnerTop;
|
|
private javax.swing.JTextField textOriginX;
|
|
private javax.swing.JTextField textOriginY;
|
|
private javax.swing.JTextField textPixelSizeX;
|
|
private javax.swing.JTextField textPixelSizeY;
|
|
// End of variables declaration//GEN-END:variables
|
|
}
|