diff --git a/devices/CurrentCamera.properties b/devices/CurrentCamera.properties index 565b776..e2a6603 100644 --- a/devices/CurrentCamera.properties +++ b/devices/CurrentCamera.properties @@ -1,4 +1,4 @@ -#Thu Sep 01 10:30:27 CEST 2016 +#Mon Sep 05 11:20:34 CEST 2016 colormap=Temperature colormapAutomatic=true colormapMax=2475.851 @@ -6,8 +6,8 @@ colormapMin=2189.861 flipHorizontally=false flipVertically=false grayscale=false -imageHeight=784 -imageWidth=874 +imageHeight=840 +imageWidth=627 invert=false rescaleFactor=1.0 rescaleOffset=0.0 @@ -18,9 +18,9 @@ roiY=0 rotation=0.0 rotationCrop=true scale=1.0 -spatialCalOffsetX=-263.97 -spatialCalOffsetY=-302.54 -spatialCalScaleX=0.013157894736842105 -spatialCalScaleY=0.04 +spatialCalOffsetX=-100.0 +spatialCalOffsetY=-100.0 +spatialCalScaleX=NaN +spatialCalScaleY=NaN spatialCalUnits=mm transpose=false diff --git a/plugins/Cameras.java b/plugins/Cameras.java index ee9d650..b0396e1 100644 --- a/plugins/Cameras.java +++ b/plugins/Cameras.java @@ -2,6 +2,7 @@ * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. */ +import ch.psi.pshell.core.Controller; import java.io.File; import java.io.IOException; import java.nio.file.Paths; @@ -24,7 +25,19 @@ import ch.psi.pshell.epics.ChannelInteger; import ch.psi.pshell.epics.ChannelIntegerArray; import ch.psi.pshell.ui.App; import ch.psi.pshell.imaging.Data; +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.Renderer.Profile; +import ch.psi.pshell.imaging.RendererListener; +import ch.psi.pshell.imaging.Utils; +import ch.psi.pshell.scripting.InterpreterResult; +import ch.psi.pshell.scripting.ScriptManager; +import ch.psi.utils.Arr; +import ch.psi.utils.Convert; import ch.psi.utils.swing.Editor.EditorDialog; +import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; @@ -36,6 +49,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; +import javax.script.ScriptException; import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE; /** @@ -48,7 +62,7 @@ public class Cameras extends Panel { renderer.setPersistenceFile(Paths.get(getController().getSetup().getContextPath(), "Renderer_Cameras.bin")); setPersistedComponents(new Component[]{checkCamtool}); comboCameras.setEnabled(false); - } + } final String configFolder = "/afs/psi.ch/intranet/SF/Applications/config/camtool"; File[] cameraConfigFiles = new File[0]; @@ -165,6 +179,8 @@ public class Cameras extends Panel { return (Integer) state.get("run"); } } + + Overlay[] fitOv; void setCamera(String cameraName) throws IOException, InterruptedException { System.out.println("Setting camera: " + cameraName); @@ -215,13 +231,15 @@ public class Cameras extends Panel { camera.initialize(); if (camera instanceof Camtool){ double[] origin = ((Camtool)camera).origin.read(); - camera.getConfig().spatialCalOffsetX = origin[0]; - camera.getConfig().spatialCalOffsetY = origin[1]; + if (origin.length>=2){ + camera.getConfig().spatialCalOffsetX = origin[0]; + camera.getConfig().spatialCalOffsetY = origin[1]; + } } camera.getConfig().save(); - camera.setPolling(-500); - //camera.setMonitored(true); + camera.setPolling(-1000); + camera.setMonitored(false); renderer.setDevice(camera); renderer.setShowReticle(true); renderer.setAutoScroll(true); @@ -229,13 +247,19 @@ public class Cameras extends Panel { camera.addListener(new ImageListener() { @Override public void onImage(Object o, BufferedImage bi, Data data) { - if (renderer.getReticle() != null) { - if (bi == null) { - return; - } - renderer.getReticle().setSize(new Dimension(bi.getWidth(), bi.getHeight())); + if (bi == null) { + renderer.removeOverlays(fitOv); + fitOv = null; + } else { + if (renderer.getReticle() != null) { + renderer.getReticle().setSize(new Dimension(bi.getWidth(), bi.getHeight())); + } + Overlay[] profile = renderer.getProfileOverlays(); + profile = ((profile != null) && (profile.length==4)) ? getFitOverlays(bi) : null; + renderer.updateOverlays(profile, fitOv); + fitOv = profile; } - camera.removeListener(this); + //camera.removeListener(this); } @Override @@ -253,6 +277,53 @@ public class Cameras extends Panel { textState.setText((camera == null) ? "" : camera.getState().toString()); buttonConfig.setEnabled(camera != null); } + + Pen fitPen = new Pen(new Color(0, 192, 0)); + Overlay[] getFitOverlays(BufferedImage img){ + Overlays.Polyline hpoly = null; + Overlays.Polyline vpoly = null; + int factor = 2; + Profile profile = renderer.getProfile(); + if ((profile != Profile.None) && (img != null)) { + img = Utils.grayscale(img); + if (profile.hasVertical()) { + int[] sum = Utils.integrateVertically(img); + int[] x = Arr.indexesInt(img.getWidth()); + int[] y = new int[img.getWidth()]; + try { + ScriptManager sm = Controller.getInstance().getScriptManager(); + sm.setVar("y", Convert.toDouble(sum)); + sm.setVar("x", Convert.toDouble(x)); + InterpreterResult r = sm.eval("r = fit(y, x)"); + if (r.exception != null){ + r.exception .printStackTrace(); + return null; + } else { + Object ret = sm.getVar("r"); + System.out.println(ret); + } + } catch (Exception ex) { + } + + for (int i = 0; i < img.getWidth(); i++) { + y[i] = (int) (img.getHeight() - 1 - (((double) sum[i]) / 255 / factor)/2); + } + vpoly = new Overlays.Polyline(fitPen, Arr.indexesInt(img.getWidth()), y); + } + if (profile.hasHorizontal()) { + int[] integration = Utils.integrateHorizontally(img); + int[] x = new int[img.getHeight()]; + int[] y = Arr.indexesInt(img.getHeight()); + + for (int i = 0; i < img.getHeight(); i++) { + x[i] = (int) (((double) integration[i]) / 255 / factor)/2; + } + hpoly = new Overlays.Polyline(fitPen, x, y); + } + return new Overlay[]{hpoly, vpoly}; + } + return null; + } ///////// public class Camtool extends ArraySource { diff --git a/script/local.py b/script/local.py index a8d0545..73f83ea 100755 --- a/script/local.py +++ b/script/local.py @@ -45,6 +45,8 @@ def fit(ydata, xdata = None): """ if xdata is None: xdata = frange(0, len(ydata), 1) + #ydata = to_list(ydata) + #xdata = to_list(xdata) max_y= max(ydata) index_max = ydata.index(max_y) max_x= xdata[index_max]