This commit is contained in:
gobbo_a
2016-09-05 13:21:37 +02:00
parent f92e46f6d7
commit 4787cb4173
3 changed files with 91 additions and 18 deletions
+82 -11
View File
@@ -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 {