diff --git a/devices/CurrentCamera.properties b/devices/CurrentCamera.properties index 3d19660..c94ade2 100644 --- a/devices/CurrentCamera.properties +++ b/devices/CurrentCamera.properties @@ -1,16 +1,16 @@ -#Wed Mar 22 11:36:21 CET 2017 +#Thu Mar 23 16:56:40 CET 2017 colormap=Flame -colormapAutomatic=false -colormapMax=1400.0 +colormapAutomatic=true +colormapMax=0.0 colormapMin=0.0 flipHorizontally=false flipVertically=false grayscale=false -imageHeight=2160 -imageWidth=2560 +imageHeight=0 +imageWidth=0 invert=false -regionStartX=1 -regionStartY=1 +regionStartX=129 +regionStartY=7 rescaleFactor=1.0 rescaleOffset=0.0 roiHeight=-1 @@ -21,9 +21,9 @@ rotation=0.0 rotationCrop=false scale=1.0 serverURL=localhost\:10000 -spatialCalOffsetX=-1211.1781867616605 -spatialCalOffsetY=-478.29179363692987 -spatialCalScaleX=-8.235817260147883 -spatialCalScaleY=-8.510638450091575 +spatialCalOffsetX=-1093.4812581603794 +spatialCalOffsetY=-1098.5114274849898 +spatialCalScaleX=-7.617446798629459 +spatialCalScaleY=-7.774538463917676 spatialCalUnits=mm transpose=false diff --git a/plugins/ScreenPanel.java b/plugins/ScreenPanel.java index 51b09f5..fb64a0d 100644 --- a/plugins/ScreenPanel.java +++ b/plugins/ScreenPanel.java @@ -57,6 +57,8 @@ import java.awt.Font; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.net.ServerSocket; @@ -72,6 +74,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JDialog; import javax.swing.JMenuItem; +import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; @@ -206,6 +209,15 @@ public class ScreenPanel extends Panel { renderer.setProfileNormalized(true); renderer.setShowProfileLimits(false); + + JMenuItem menuCalibrate = new JMenuItem("Calibrate..."); + menuCalibrate.addActionListener((ActionEvent e) -> { + try { + calibrate(); + } catch (Exception ex) { + showException(ex); + } + }); JMenuItem menuSaveStack = new JMenuItem("Save Stack"); menuSaveStack.addActionListener((ActionEvent e) -> { @@ -263,16 +275,18 @@ public class ScreenPanel extends Panel { } }); + renderer.getPopupMenu().add(menuCalibrate); renderer.getPopupMenu().add(menuSaveStack); renderer.getPopupMenu().addSeparator(); renderer.getPopupMenu().add(menuSetROI); renderer.getPopupMenu().add(menuResetROI); renderer.getPopupMenu().addPopupMenuListener(new PopupMenuListener() { - @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { menuResetROI.setEnabled(camera instanceof Camtool); menuSetROI.setEnabled(camera instanceof Camtool); + menuCalibrate.setVisible(camera instanceof Camtool); + menuCalibrate.setEnabled(calibrationOverlays==null); } @Override @@ -608,6 +622,11 @@ public class ScreenPanel extends Panel { spinnerThreshold.setEnabled(false); checkThreshold.setEnabled(false); + + if (calibrationDialolg!=null){ + calibrationDialolg.dispose(); + calibrationDialolg = null; + } if (camera != null) { //camera.removeAllListeners(); @@ -712,12 +731,14 @@ public class ScreenPanel extends Panel { ((Camtool) camera).startReceiver(); } else { + /* if (camera.getConfig() instanceof PsiCamera.PsiCameraConfig){ if (camera.getConfig().isCalibrated()){ camera.getConfig().spatialCalOffsetX += ((PsiCamera.PsiCameraConfig)camera.getConfig()).regionStartX; camera.getConfig().spatialCalOffsetY += ((PsiCamera.PsiCameraConfig)camera.getConfig()).regionStartY; } - } + } + */ if (polling <= 0) { camera.setMonitored(true); } else { @@ -1104,7 +1125,7 @@ public class ScreenPanel extends Panel { return null; } try { - double[] sum = (double[]) Convert.toDouble(data.integrateVertically(true)); + double[] sum = data.integrateVertically(true); double[] saux = new double[sum.length]; int[] p = new int[sum.length]; //xCom = getCom(sum); @@ -1138,7 +1159,7 @@ public class ScreenPanel extends Panel { } try { - double[] sum = (double[]) Convert.toDouble(data.integrateHorizontally(true)); + double[] sum = data.integrateHorizontally(true); double[] saux = new double[sum.length]; int[] p = new int[sum.length]; //yCom = getCom(sum); @@ -1535,9 +1556,73 @@ public class ScreenPanel extends Panel { getContext().getDataManager().setAttribute(path, "y_sigma", ys.getStdev()); getContext().getDataManager().closeOutput(); SwingUtils.showMessage(getTopLevel(), "Success", "Generated data file:\n" + getContext().getExecutionPars().getPath(), 5000); - } - + + JDialog calibrationDialolg; + Overlay[] calibrationOverlays; + void calibrate() throws IOException{ + if ( (camera instanceof Camtool) && (calibrationOverlays==null)) { + ((Camtool) camera).resetRoi(); + renderer.setMode(RendererMode.Fit); + Pen pen = new Pen(new Color(128, 0, 128), 1, Pen.LineStyle.solid); + Overlays.Crosshairs top = new Overlays.Crosshairs(pen, new Dimension(-1, 1)); + Overlays.Crosshairs bottom = new Overlays.Crosshairs(pen, new Dimension(-1, 1)); + Overlays.Crosshairs left = new Overlays.Crosshairs(pen, new Dimension(1, -1)); + Overlays.Crosshairs right = new Overlays.Crosshairs(pen, new Dimension(1, -1)); + calibrationOverlays = new Overlay[]{top, bottom, left, right}; + for (Overlay ov : calibrationOverlays){ + ov.setMovable(true); + } + renderer.addOverlays(calibrationOverlays); + SwingUtils.invokeDelayed(() -> { + Dimension size = renderer.getImageSize(); + top.update(new Point(0, size.height/8)); + bottom.update(new Point(0, 7*size.height/8)); + left.update(new Point(size.width/8, 0)); + right.update(new Point(7*size.width/8, 0)); + }, 500); + JOptionPane calibrationMessage = new JOptionPane("Move the lines to the reference marks \n" + + "and press 'OK' to update the calibration.", + JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null,null, null); + calibrationDialolg = calibrationMessage.createDialog(getTopLevel(), "Calibration"); + calibrationDialolg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + calibrationDialolg.setModal(false); + calibrationDialolg.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + if (calibrationOverlays!=null){ + try { + renderer.removeOverlays(calibrationOverlays); + calibrationOverlays = null; + calibrationDialolg = null; + if (calibrationMessage.getValue().equals(0)){ //If pressed OK + int x1 = Math.min(left.getPosition().x, right.getPosition().x); + int x2 = Math.max(left.getPosition().x, right.getPosition().x); + int y1 = Math.min(top.getPosition().y, bottom.getPosition().y); + int y2 = Math.max(top.getPosition().y, bottom.getPosition().y); + if ((x1!=-1) && (x2!=-1) && (y1!=-1) && (y2!=-1)){ + System.out.println("Updating camera calibration: " + x1 + ", "+ + x2 + ", " + + y1 + ", " + + y2); + HashMap c = new HashMap(); + c.put("reference_marker", Arrays.asList(new Integer[]{x1, y1, x2, y2})); + ((Camtool) camera).setCalibration(cameraName, c); + } + } + } catch (IOException ex) { + Logger.getLogger(ScreenPanel.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + @Override + public void windowDeactivated(java.awt.event.WindowEvent e) { + if (!calibrationDialolg.isShowing()){ //windowClosed is not called if window closed with ok/cancel + windowClosed(e); + } + } + }); + calibrationDialolg.setVisible(true); + } + } + //////// @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents