Commit fafa9362 authored by Andrey Filippov's avatar Andrey Filippov

working on 14MP

parent 0246d531
...@@ -82,16 +82,21 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener { ...@@ -82,16 +82,21 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener {
* *
*/ */
private static final long serialVersionUID = 390855361964415147L; private static final long serialVersionUID = 390855361964415147L;
public static int [][] BAYER_INDICES = {
{0, 1, 2 ,3},
{1, 0, 3 ,2},
{2, 3, 0 ,1},
{3, 2, 1 ,0}};
Panel panel1; Panel panel1;
Panel confpanel; Panel confpanel;
Frame instance; Frame instance;
String arg; String arg;
static File dir;
ImagejJp4Tiff imagejJp4Tiff = new ImagejJp4Tiff(); ImagejJp4Tiff imagejJp4Tiff = new ImagejJp4Tiff();
static File dir;
public boolean fix_bayer = true; // shift image (replacing last row/column) if (corrected for flips) BAYER_MODE != 0
public String camera_url = "http://192.168.0.236:8081/"; public String camera_url = "http://192.168.0.236:8081/";
public String camera_img = "bimg"; public String camera_img = "bimg";
public String camera_img_new = "towp/wait/bimg"; // will always wait for the next image (repetitive acquisitions get new images) public String camera_img_new = "towp/wait/bimg"; // will always wait for the next image (repetitive acquisitions get new images)
...@@ -325,6 +330,7 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener { ...@@ -325,6 +330,7 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener {
gd.addStringField("Image (new): ", camera_img_new, 20); gd.addStringField("Image (new): ", camera_img_new, 20);
gd.addStringField("JP46 Parameters: ", camera_jp46settings, 50); gd.addStringField("JP46 Parameters: ", camera_jp46settings, 50);
gd.addCheckbox("Demux composite frame? ", demux); gd.addCheckbox("Demux composite frame? ", demux);
gd.addCheckbox("Fix bayer (shift to standard GR/BG)? ", fix_bayer);
gd.addCheckbox("Silent? ", IS_SILENT); gd.addCheckbox("Silent? ", IS_SILENT);
// gd.addCheckbox("JP4 (not JP46)? ", IS_JP4); // gd.addCheckbox("JP4 (not JP46)? ", IS_JP4);
...@@ -340,13 +346,14 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener { ...@@ -340,13 +346,14 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener {
gd.showDialog(); gd.showDialog();
if (gd.wasCanceled()) return false; if (gd.wasCanceled()) return false;
setTitle(gd.getNextString()); setTitle (gd.getNextString());
setURL (gd.getNextString()); setURL (gd.getNextString());
camera_img = gd.getNextString(); camera_img = gd.getNextString();
camera_img_new = gd.getNextString(); camera_img_new = gd.getNextString();
camera_jp46settings = gd.getNextString(); camera_jp46settings = gd.getNextString();
demux=gd.getNextBoolean(); demux= gd.getNextBoolean();
IS_SILENT=gd.getNextBoolean(); fix_bayer= gd.getNextBoolean();
IS_SILENT= gd.getNextBoolean();
return true; return true;
} }
public ImagePlus open(String directory, String fileName, String arg, boolean scale) { public ImagePlus open(String directory, String fileName, String arg, boolean scale) {
...@@ -523,6 +530,7 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener { ...@@ -523,6 +530,7 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener {
double[][] rgammas=new double[4][]; double[][] rgammas=new double[4][];
double min_gain; double min_gain;
long WOI_LEFT,WOI_WIDTH,WOI_TOP,WOI_HEIGHT,BAYER_MODE,DCM_HOR,DCM_VERT,BIN_HOR,BIN_VERT; long WOI_LEFT,WOI_WIDTH,WOI_TOP,WOI_HEIGHT,BAYER_MODE,DCM_HOR,DCM_VERT,BIN_HOR,BIN_VERT;
BAYER_MODE = 0;
long COLOR_MODE=0; long COLOR_MODE=0;
long FLIPH=0; long FLIPH=0;
long FLIPV=0; long FLIPV=0;
...@@ -794,35 +802,36 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener { ...@@ -794,35 +802,36 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener {
} }
} }
/* apply gammas here */ /* apply gammas here */
int[] bayer_indices= BAYER_INDICES[(int) BAYER_MODE];
if (MakerNote !=null) { if (MakerNote !=null) {
if (scale) { if (scale) {
for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) { for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) {
i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x ]= (float) (((rgammas[1][i])-blacks256[1])/gains[1]); macroblock[y ][x ]= (float) (((rgammas[bayer_indices[1]][i])-blacks256[bayer_indices[1]])/gains[bayer_indices[1]]);
i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x+1]= (float) (((rgammas[0][i])-blacks256[0])/gains[0]); macroblock[y ][x+1]= (float) (((rgammas[bayer_indices[0]][i])-blacks256[bayer_indices[0]])/gains[bayer_indices[0]]);
i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x ]= (float) (((rgammas[3][i])-blacks256[3])/gains[3]); macroblock[y+1][x ]= (float) (((rgammas[bayer_indices[3]][i])-blacks256[bayer_indices[3]])/gains[bayer_indices[3]]);
i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x+1]= (float) (((rgammas[2][i])-blacks256[2])/gains[2]); macroblock[y+1][x+1]= (float) (((rgammas[bayer_indices[2]][i])-blacks256[bayer_indices[2]])/gains[bayer_indices[2]]);
} }
} else { } else {
for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) { for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) {
i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x ]= (float) ((rgammas[1][i])-blacks256[1]); macroblock[y ][x ]= (float) ((rgammas[bayer_indices[1]][i])-blacks256[bayer_indices[1]]);
i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x+1]= (float) ((rgammas[0][i])-blacks256[0]); macroblock[y ][x+1]= (float) ((rgammas[bayer_indices[0]][i])-blacks256[bayer_indices[0]]);
i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x ]= (float) ((rgammas[3][i])-blacks256[3]); macroblock[y+1][x ]= (float) ((rgammas[bayer_indices[3]][i])-blacks256[bayer_indices[3]]);
i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x+1]= (float) ((rgammas[2][i])-blacks256[2]); macroblock[y+1][x+1]= (float) ((rgammas[bayer_indices[2]][i])-blacks256[bayer_indices[2]]);
} }
} }
} }
...@@ -835,16 +844,60 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener { ...@@ -835,16 +844,60 @@ public class JP46_Reader_camera0 extends PlugInFrame implements ActionListener {
} }
} }
} }
if (FLIPH!=0) ip_src.flipHorizontal(); /* To correct Bayer */
if (FLIPV!=0) ip_src.flipVertical(); /* To correct Bayer */ if (FLIPH!=0) {
ip_src.flipHorizontal(); /* To correct Bayer */
}
if (FLIPV!=0) {
ip_src.flipVertical(); /* To correct Bayer */
}
/* Is it needed here ? */ /* Is it needed here ? */
/* imp.draw(); /* imp.draw();
imp.show(); **/ imp.show(); **/
if (use_imp_src) copyProperties (imp, imp_src); if (use_imp_src) copyProperties (imp, imp_src);
if (fix_bayer) {
shiftToBayer(use_imp_src? imp_src: imp);
}
return use_imp_src; return use_imp_src;
} }
/**
* Shift image vertically and/or horizontally to make it with BAYER_MODE=0 (RG/GB)
* @param imp_src image, will be modified
* @return true if any changes were applied
*/
public boolean shiftToBayer( ImagePlus imp) {
int bayer_mode = Integer.parseInt((String) imp.getProperty("BAYER_MODE"));
int flip_vert = Integer.parseInt((String) imp.getProperty("FLIPV"));
int flip_hor = Integer.parseInt((String) imp.getProperty("FLIPH"));
bayer_mode ^= flip_hor + (flip_vert << 1);
if (bayer_mode == 0) return false;
int width = imp.getWidth();
int height = imp.getHeight();
float [] pixels = (float[]) imp.getProcessor().getPixels();
if ((bayer_mode & 1) != 0) { // horizontal shift
System.arraycopy(pixels, 1, pixels, 0, pixels.length-1); // shift left by 1 pixel (last column will be wrong)
for (int row = 0; row < height; row++) {
pixels[(row + 1) * width -1] = pixels[(row + 1) * width - 3]; // set the last column with the nearest of the same Bayer
}
}
if ((bayer_mode & 2) != 0) { // vertical shift
System.arraycopy(pixels, width, pixels, 0, pixels.length-width); // shift up by 1 row (last row will be wrong)
System.arraycopy(pixels, width * (height - 3), pixels, width * (height-1), width); // set the row column with the nearest of the same Bayer
}
bayer_mode = flip_hor + (flip_vert << 1);
imp.setProperty("BAYER_MODE",""+bayer_mode);
return true;
}
/* reverses gamma calculations in the camera /* reverses gamma calculations in the camera
returns double[] table , in the range 0.0..255.996 returns double[] table , in the range 0.0..255.996
*/ */
......
...@@ -542,7 +542,9 @@ public class LaserPointer{ ...@@ -542,7 +542,9 @@ public class LaserPointer{
int width int width
){ ){
ShowDoubleFloatArrays sdfra_instance= null; ShowDoubleFloatArrays sdfra_instance= null;
if (this.debugLevel>1) sdfra_instance= new ShowDoubleFloatArrays(); // just for debugging? // if (this.debugLevel>0) sdfra_instance= new ShowDoubleFloatArrays(); // just for debugging?
if (this.debugLevel > 4) sdfra_instance= new ShowDoubleFloatArrays(); // just for debugging?
boolean show_debug = sdfra_instance != null;
DoubleGaussianBlur gb=new DoubleGaussianBlur(); DoubleGaussianBlur gb=new DoubleGaussianBlur();
double initialScale=0.5; double initialScale=0.5;
int height=pixels.length/width; int height=pixels.length/width;
...@@ -580,18 +582,6 @@ public class LaserPointer{ ...@@ -580,18 +582,6 @@ public class LaserPointer{
} }
index+=width; index+=width;
} }
/*
if (i*dwidth+j>=dpixels.length){
System.out.println(
"dpixels.length="+dpixels.length+"\n"+
"width="+width+"\n"+
"height="+height+"\n"+
"dwidth="+dwidth+"\n"+
"dheight="+dheight+"\n"+
"i="+i+"\n"+
"j="+j+"\n");
}
*/
dpixels[i*dwidth+j]=d*k; dpixels[i*dwidth+j]=d*k;
} }
if (extraWidth>0){ // j==dWidth-1 if (extraWidth>0){ // j==dWidth-1
...@@ -631,10 +621,10 @@ public class LaserPointer{ ...@@ -631,10 +621,10 @@ public class LaserPointer{
} }
} }
} else dpixels=pixels.clone(); } else dpixels=pixels.clone();
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels, dwidth, dheight, "decimated"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels, dwidth, dheight, "decimated");
double [] dpixels_lp=dpixels.clone(); double [] dpixels_lp=dpixels.clone();
gb.blurDouble(dpixels_lp, dwidth, dheight, scale*this.localContrastSigma, scale*this.localContrastSigma, 0.01); gb.blurDouble(dpixels_lp, dwidth, dheight, scale*this.localContrastSigma, scale*this.localContrastSigma, 0.01);
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_lp"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_lp");
double sum=0.0; double sum=0.0;
for (int i=0;i<dpixels.length;i++){ for (int i=0;i<dpixels.length;i++){
dpixels[i]-=dpixels_lp[i]; dpixels[i]-=dpixels_lp[i];
...@@ -642,26 +632,26 @@ public class LaserPointer{ ...@@ -642,26 +632,26 @@ public class LaserPointer{
sum+=dpixels_lp[i]; sum+=dpixels_lp[i];
} }
double corr=(1.0-this.localToGlobalContrast)*Math.sqrt(sum/(dwidth*dheight)); double corr=(1.0-this.localToGlobalContrast)*Math.sqrt(sum/(dwidth*dheight));
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_var"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_var");
gb.blurDouble(dpixels_lp, dwidth, dheight, scale*this.localContrastSigma, scale*this.localContrastSigma, 0.01); gb.blurDouble(dpixels_lp, dwidth, dheight, scale*this.localContrastSigma, scale*this.localContrastSigma, 0.01);
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_var_blur"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_var_blur");
for (int i=0;i<dpixels.length;i++){ for (int i=0;i<dpixels.length;i++){
dpixels_lp[i]=this.localToGlobalContrast*Math.sqrt(dpixels_lp[i])+corr; dpixels_lp[i]=this.localToGlobalContrast*Math.sqrt(dpixels_lp[i])+corr;
dpixels[i]/=dpixels_lp[i]; dpixels[i]/=dpixels_lp[i];
} }
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_denom"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels_lp, dwidth, dheight, "dpixels_denom");
if (this.patternLowPassSigma>0) { if (this.patternLowPassSigma>0) {
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels, dwidth, dheight, "dpixels_normalized"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels, dwidth, dheight, "dpixels_normalized");
gb.blurDouble(dpixels, dwidth, dheight, scale*this.patternLowPassSigma, scale*this.patternLowPassSigma, 0.01); gb.blurDouble(dpixels, dwidth, dheight, scale*this.patternLowPassSigma, scale*this.patternLowPassSigma, 0.01);
} }
if (this.debugLevel>1) sdfra_instance.showArrays(dpixels, dwidth, dheight, "dpixels_norm_blur"); if (show_debug && (this.debugLevel>1)) sdfra_instance.showArrays(dpixels, dwidth, dheight, "dpixels_norm_blur");
int [] ipixels=new int [dpixels.length]; int [] ipixels=new int [dpixels.length];
for (int i=0;i<dpixels.length;i++){ for (int i=0;i<dpixels.length;i++){
if (dpixels[i]>this.patternThreshold) ipixels[i]=1; if (dpixels[i]>this.patternThreshold) ipixels[i]=1;
else if (dpixels[i]<-this.patternThreshold) ipixels[i]=-1; else if (dpixels[i]<-this.patternThreshold) ipixels[i]=-1;
else ipixels[i]=0; else ipixels[i]=0;
} }
if (this.debugLevel>1) sdfra_instance.showArrays(ipixels, dwidth, dheight, "ipixels_threshold"); if (show_debug && (this.debugLevel>1)) sdfra_instance.showArrays(ipixels, dwidth, dheight, "ipixels_threshold");
int maxDist = (int) Math.round(scale*this.maximalCellSize); int maxDist = (int) Math.round(scale*this.maximalCellSize);
if (maxDist<1) maxDist=1; if (maxDist<1) maxDist=1;
...@@ -672,28 +662,29 @@ public class LaserPointer{ ...@@ -672,28 +662,29 @@ public class LaserPointer{
dwidth, dwidth,
(pass & 1)==0, // false, // each black cell should have white in all 4 quadrants (pass & 1)==0, // false, // each black cell should have white in all 4 quadrants
maxDist, maxDist,
this.bordersOK this.bordersOK,
show_debug
); );
if (this.debugLevel>2) sdfra_instance.showArrays(ipixels, dwidth, dheight, "pass-"+pass); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(ipixels, dwidth, dheight, "pass-"+pass);
} }
//blur-threshold-grow //blur-threshold-grow
// convert to Double (white cells - 1.0, black and none - 0.0) // convert to Double (white cells - 1.0, black and none - 0.0)
for (int i=0;i<dpixels.length;i++) dpixels[i]= (ipixels[i]>0)?1.0:0.0; for (int i=0;i<dpixels.length;i++) dpixels[i]= (ipixels[i]>0)?1.0:0.0;
// blur result with sigma > cell period to find continuous pattern cell areas // blur result with sigma > cell period to find continuous pattern cell areas
gb.blurDouble(dpixels, dwidth, dheight, scale*this.localContrastSigma, scale*this.localContrastSigma, 0.01); gb.blurDouble(dpixels, dwidth, dheight, scale*this.localContrastSigma, scale*this.localContrastSigma, 0.01);
if (this.debugLevel>2) sdfra_instance.showArrays(dpixels, dwidth, dheight, "white_blurred"); if (show_debug && (this.debugLevel>2)) sdfra_instance.showArrays(dpixels, dwidth, dheight, "white_blurred");
// Threshold to boolean mask // Threshold to boolean mask
boolean [] dmask=new boolean[dpixels.length]; boolean [] dmask=new boolean[dpixels.length];
for (int i=0;i<dpixels.length;i++) dmask[i]= (dpixels[i]>=this.blurredMaskThreshold); for (int i=0;i<dpixels.length;i++) dmask[i]= (dpixels[i]>=this.blurredMaskThreshold);
if (this.debugLevel>1) sdfra_instance.showArrays(dmask, dwidth, dheight, "white_threshold"); if (show_debug && (this.debugLevel>1)) sdfra_instance.showArrays(dmask, dwidth, dheight, "white_threshold");
int iBlurMaskGrow= (int) Math.round(scale*this.localContrastSigma); // does in need separate coefficient? int iBlurMaskGrow= (int) Math.round(scale*this.localContrastSigma); // does in need separate coefficient?
growMask( dmask, //boolean [] pixels, growMask( dmask, //boolean [] pixels,
dwidth, // int width, dwidth, // int width,
iBlurMaskGrow); //int grow); iBlurMaskGrow); //int grow);
if (this.debugLevel>1) sdfra_instance.showArrays(dmask, dwidth, dheight, "white_threshold_grown"+iBlurMaskGrow); if (show_debug && (this.debugLevel>1)) sdfra_instance.showArrays(dmask, dwidth, dheight, "white_threshold_grown"+iBlurMaskGrow);
// Mask out white cells outside of the compact areas just found // Mask out white cells outside of the compact areas just found
for (int i=0;i<dpixels.length;i++) if (!dmask[i]) ipixels[i]=0; for (int i=0;i<dpixels.length;i++) if (!dmask[i]) ipixels[i]=0;
if (this.debugLevel>1) sdfra_instance.showArrays(ipixels, dwidth, dheight, "ipixels_masked"); if (show_debug && ((this.debugLevel>1))) sdfra_instance.showArrays(ipixels, dwidth, dheight, "ipixels_masked");
boolean [] mask=new boolean[pixels.length]; boolean [] mask=new boolean[pixels.length];
if (this.decimatePatternFilter>1){ if (this.decimatePatternFilter>1){
for (int i=0;i<pixels.length;i++){ for (int i=0;i<pixels.length;i++){
...@@ -764,11 +755,12 @@ public class LaserPointer{ ...@@ -764,11 +755,12 @@ public class LaserPointer{
int width, int width,
boolean fromBlack, boolean fromBlack,
int maxDist, int maxDist,
boolean bordersOK boolean bordersOK,
boolean show_debug
){ ){
int height=pixels.length/width; int height=pixels.length/width;
ShowDoubleFloatArrays sdfra_instance= null; ShowDoubleFloatArrays sdfra_instance= null;
if (this.debugLevel>1) sdfra_instance= new ShowDoubleFloatArrays(); // just for debugging? if (show_debug) sdfra_instance= new ShowDoubleFloatArrays(); // just for debugging?
int [] distLeft= new int [pixels.length]; int [] distLeft= new int [pixels.length];
int [] distRight=new int [pixels.length]; // also used for down int [] distRight=new int [pixels.length]; // also used for down
...@@ -789,14 +781,14 @@ public class LaserPointer{ ...@@ -789,14 +781,14 @@ public class LaserPointer{
distRight[index2--]=v2; distRight[index2--]=v2;
} }
} }
if (this.debugLevel>3){ if (show_debug && (this.debugLevel>3)){
sdfra_instance.showArrays(distLeft, width, height, "distLeft-"+fromBlack); sdfra_instance.showArrays(distLeft, width, height, "distLeft-"+fromBlack);
sdfra_instance.showArrays(distRight, width, height, "distRight-"+fromBlack); sdfra_instance.showArrays(distRight, width, height, "distRight-"+fromBlack);
} }
// combine two (max distance) // combine two (max distance)
for (int i=0;i<pixels.length;i++) if (distRight[i]>distLeft[i])distLeft[i]=distRight[i]; for (int i=0;i<pixels.length;i++) if (distRight[i]>distLeft[i])distLeft[i]=distRight[i];
if (this.debugLevel>3) sdfra_instance.showArrays(distLeft, width, height, "comboLeftRight-"+fromBlack); if (show_debug && (this.debugLevel>3)) sdfra_instance.showArrays(distLeft, width, height, "comboLeftRight-"+fromBlack);
// Down // Down
...@@ -807,7 +799,7 @@ public class LaserPointer{ ...@@ -807,7 +799,7 @@ public class LaserPointer{
v1=distRight[index1++]+1; v1=distRight[index1++]+1;
distRight[i]= (v1>distLeft[i])?distLeft[i]:v1; distRight[i]= (v1>distLeft[i])?distLeft[i]:v1;
} }
if (this.debugLevel>3) sdfra_instance.showArrays(distRight, width, height, "distDown-"+fromBlack); if (show_debug && (this.debugLevel>3)) sdfra_instance.showArrays(distRight, width, height, "distDown-"+fromBlack);
// Up // Up
for (int j=pixels.length-width;j<pixels.length;j++) distUp[j]= bordersOK?0:distLeft[j]; for (int j=pixels.length-width;j<pixels.length;j++) distUp[j]= bordersOK?0:distLeft[j];
index1=pixels.length-1; index1=pixels.length-1;
...@@ -816,10 +808,10 @@ public class LaserPointer{ ...@@ -816,10 +808,10 @@ public class LaserPointer{
v1=distUp[index1--]+1; v1=distUp[index1--]+1;
distUp[i]= (v1>distLeft[i])?distLeft[i]:v1; distUp[i]= (v1>distLeft[i])?distLeft[i]:v1;
} }
if (this.debugLevel>3) sdfra_instance.showArrays(distUp, width, height, "distUp-"+fromBlack); if (show_debug && (this.debugLevel>3)) sdfra_instance.showArrays(distUp, width, height, "distUp-"+fromBlack);
// combine two (max distance) // combine two (max distance)
for (int i=0;i<pixels.length;i++) if (distUp[i]>distRight[i])distRight[i]=distUp[i]; for (int i=0;i<pixels.length;i++) if (distUp[i]>distRight[i])distRight[i]=distUp[i];
if (this.debugLevel>3) sdfra_instance.showArrays(distRight, width, height, "combo-"+fromBlack); if (show_debug && (this.debugLevel>3)) sdfra_instance.showArrays(distRight, width, height, "combo-"+fromBlack);
// Now distRight contains the longest of 4 quadrants distance from "good" pixels - remove bad opposite side ones // Now distRight contains the longest of 4 quadrants distance from "good" pixels - remove bad opposite side ones
for (int i=0;i<pixels.length;i++) if ((distRight[i]>maxDist) && (pixels[i]!=sign)) pixels[i]=0; // if opposite signe (or 0) make 0 for (int i=0;i<pixels.length;i++) if ((distRight[i]>maxDist) && (pixels[i]!=sign)) pixels[i]=0; // if opposite signe (or 0) make 0
} }
...@@ -898,7 +890,7 @@ public class LaserPointer{ ...@@ -898,7 +890,7 @@ public class LaserPointer{
String title, String title,
int debugLevel // debug level (normal == 1) int debugLevel // debug level (normal == 1)
){ ){
int debugTiming=1; int debugTiming=1; // used >3
if (debugLevel>debugTiming) printTimingInit(); if (debugLevel>debugTiming) printTimingInit();
boolean skipFirst=scaleExposureForLasers>0.0; // do not use no-pointer image (may have different exposure time) boolean skipFirst=scaleExposureForLasers>0.0; // do not use no-pointer image (may have different exposure time)
/// if (scaleExposureForLasers>0) saturationRed*=scaleExposureForLasers; // scaled to reduced exposure time /// if (scaleExposureForLasers>0) saturationRed*=scaleExposureForLasers; // scaled to reduced exposure time
......
...@@ -899,6 +899,7 @@ public class CamerasInterface{ ...@@ -899,6 +899,7 @@ public class CamerasInterface{
return setupCameraAcquisition(Double.NaN); return setupCameraAcquisition(Double.NaN);
} }
public boolean setupCameraAcquisition(final double exposureScale){ public boolean setupCameraAcquisition(final double exposureScale){
final boolean mp14 = true;// FIXME: Modified for 14Mpix
final int ipLength=this.resetURLs.length; final int ipLength=this.resetURLs.length;
final boolean [] results=new boolean[ipLength]; final boolean [] results=new boolean[ipLength];
for (int chn=0;chn<ipLength;chn++) results[chn]=(this.sensorPresent[chn]!=null); for (int chn=0;chn<ipLength;chn++) results[chn]=(this.sensorPresent[chn]!=null);
...@@ -917,14 +918,15 @@ public class CamerasInterface{ ...@@ -917,14 +918,15 @@ public class CamerasInterface{
} }
startAndJoin(threads); startAndJoin(threads);
if (Double.isNaN(exposureScale)){ // full init if (Double.isNaN(exposureScale)){ // full init
int nRepeat=this.setupTriggerMode?4:1; // int nRepeat=this.setupTriggerMode?4:1;
int nRepeat=this.setupTriggerMode?4:2; // FIXME: Modified for 14Mpix
if (this.nc393) nRepeat++; // is it needed? if (this.nc393) nRepeat++; // is it needed?
for (int i=0;i<nRepeat;i++){ for (int i=0;i<nRepeat;i++){
if (this.debugLevel>0) System.out.println((i+1)+" of "+nRepeat+": Triggering cameras to give parameters a chance to propagate"); if (this.debugLevel>0) System.out.println((i+1)+" of "+nRepeat+": Triggering cameras to give parameters a chance to propagate");
trigger(); trigger();
try try
{ {
Thread.sleep( 1000 ); // ms Thread.sleep( 2000 ); // ms // FIXME: Modified for 14Mpix
} }
catch ( InterruptedException e ) catch ( InterruptedException e )
{ {
...@@ -932,6 +934,16 @@ public class CamerasInterface{ ...@@ -932,6 +934,16 @@ public class CamerasInterface{
} }
} }
} else if (mp14) {
try
{
Thread.sleep( 2000 ); // ms // FIXME: Modified for 14Mpix
}
catch ( InterruptedException e )
{
System.out.println( "awakened prematurely" );
}
trigger();
} }
boolean result=true; boolean result=true;
for (int chn=0;chn<ipLength;chn++) if (this.sensorPresent[chn]!=null) result &=results[chn]; for (int chn=0;chn<ipLength;chn++) if (this.sensorPresent[chn]!=null) result &=results[chn];
...@@ -1290,7 +1302,8 @@ public class CamerasInterface{ ...@@ -1290,7 +1302,8 @@ public class CamerasInterface{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); DocumentBuilder db = dbf.newDocumentBuilder();
String url=metaURLs[ipIndex]; String url=metaURLs[ipIndex];
if (debugLevel>2) System.out.println("timestampIPs:" + url ); // if (debugLevel>2) System.out.println("timestampIPs:" + url );
if (debugLevel>0) System.out.println("timestampIPs:" + url );
dom = db.parse(url); dom = db.parse(url);
if (!dom.getDocumentElement().getNodeName().equals("meta")) { if (!dom.getDocumentElement().getNodeName().equals("meta")) {
System.out.println("Root element: expected 'meta', got'" + dom.getDocumentElement().getNodeName()+"'"); System.out.println("Root element: expected 'meta', got'" + dom.getDocumentElement().getNodeName()+"'");
...@@ -1383,7 +1396,13 @@ public class CamerasInterface{ ...@@ -1383,7 +1396,13 @@ public class CamerasInterface{
startAndJoin(threads); startAndJoin(threads);
} }
// public boolean preTrigger() { // mt9f002 fails if more than 1-3 sec between triggers
// return true;
// }
public ImagePlus [] getImages(final boolean [] acquire, boolean resetAndTrigger, final boolean show){ public ImagePlus [] getImages(final boolean [] acquire, boolean resetAndTrigger, final boolean show){
final boolean dual_trig = false;
final boolean [] acquireIPs=selectIPs(acquire); final boolean [] acquireIPs=selectIPs(acquire);
if (this.debugLevel>2) { if (this.debugLevel>2) {
System.out.println("getImages(...) 2"); System.out.println("getImages(...) 2");
...@@ -1391,8 +1410,20 @@ public class CamerasInterface{ ...@@ -1391,8 +1410,20 @@ public class CamerasInterface{
} }
if (resetAndTrigger) { if (resetAndTrigger) {
try { // FIXME: Make conditional for 14MPix
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
resetCameras(); resetCameras();
trigger(); trigger();
if (dual_trig) {
timestampIPs(acquireIPs); // ignoring results, just wait
resetCameras();
// trigger();
jp4_Instances[0].readDummyURL("http://192.168.0.236/parsedit.php?immediate&TRIG_PERIOD=1*0");
}
} }
final double [] timestamps= timestampIPs(acquireIPs); final double [] timestamps= timestampIPs(acquireIPs);
if (this.debugLevel>2) System.out.println("getImages(): this.imagesIP.length=" + this.imagesIP.length); if (this.debugLevel>2) System.out.println("getImages(): this.imagesIP.length=" + this.imagesIP.length);
...@@ -1590,6 +1621,12 @@ public class CamerasInterface{ ...@@ -1590,6 +1621,12 @@ public class CamerasInterface{
if (debugLevel>2) System.out.println(String.format("this.laserPointers.setLasers (0x%x)", sequence[nSeqNum])); if (debugLevel>2) System.out.println(String.format("this.laserPointers.setLasers (0x%x)", sequence[nSeqNum]));
} }
resetIPs(selectIPs(lasersIPs)); // flush buffer resetIPs(selectIPs(lasersIPs)); // flush buffer
try { // FIXME: Make conditional for 14MPix
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
trigger(); // trigger cameras trigger(); // trigger cameras
ipIndexAtomic.set(0); ipIndexAtomic.set(0);
final int fnSeqNum=nSeqNum; final int fnSeqNum=nSeqNum;
...@@ -1613,6 +1650,8 @@ public class CamerasInterface{ ...@@ -1613,6 +1650,8 @@ public class CamerasInterface{
System.out.println("==== "+imageURLs[ipIndex]+ " opened in "+IJ.d2s(0.000000001*(System.nanoTime()-st),3)+" sec"); System.out.println("==== "+imageURLs[ipIndex]+ " opened in "+IJ.d2s(0.000000001*(System.nanoTime()-st),3)+" sec");
} }
laserImagesIP[fnSeqNum-1][ipIndex].setProperty("MIRRORED","NO"); laserImagesIP[fnSeqNum-1][ipIndex].setProperty("MIRRORED","NO");
// laserImagesIP[fnSeqNum-1][ipIndex].setTitle("raw"+fnSeqNum); //FIXME:Debugging
// laserImagesIP[fnSeqNum-1][ipIndex].show(); //FIXME:Debugging
} }
} }
}; };
......
...@@ -85,6 +85,11 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -85,6 +85,11 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
* *
*/ */
private static final long serialVersionUID = 390855361964415147L; private static final long serialVersionUID = 390855361964415147L;
public static int [][] BAYER_INDICES = {
{0, 1, 2 ,3},
{1, 0, 3 ,2},
{2, 3, 0 ,1},
{3, 2, 1 ,0}};
Panel panel1; Panel panel1;
Panel confpanel; Panel confpanel;
Frame instance; Frame instance;
...@@ -93,7 +98,7 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -93,7 +98,7 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
String arg; String arg;
static File dir; static File dir;
public boolean fix_bayer = true; // shift image (replacing last row/column) if (corrected for flips) BAYER_MODE != 0
public String camera_url = "http://192.168.0.236:8081/"; public String camera_url = "http://192.168.0.236:8081/";
public String camera_img = "bimg"; public String camera_img = "bimg";
public String camera_img_new = "towp/wait/bimg"; // will always wait for the next image (repetitive acquisitions get new images) public String camera_img_new = "towp/wait/bimg"; // will always wait for the next image (repetitive acquisitions get new images)
...@@ -109,14 +114,26 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -109,14 +114,26 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
public void run(String arg) { public void run(String arg) {
} }
public JP46_Reader_camera(Boolean showGui) { public JP46_Reader_camera(Boolean showGui) { // default fix_bayer = true
if (showGui) initGui(); if (showGui) initGui();
} }
public JP46_Reader_camera() { public JP46_Reader_camera() { // default fix_bayer = true
initGui(); initGui();
} }
public JP46_Reader_camera(Boolean showGui, int fix_bayer) {
if (showGui) initGui();
this.fix_bayer = (fix_bayer !=0);
}
public JP46_Reader_camera(int fix_bayer) {
initGui();
this.fix_bayer = (fix_bayer !=0);
}
// fix_bayer
private void initGui() { private void initGui() {
if (headless) return; if (headless) return;
...@@ -390,6 +407,8 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -390,6 +407,8 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
if (imp == null) { if (imp == null) {
IJ.showMessage("JP46 Reader Error", "Could not open the URL: " + url + " as JPEG/JP46"); IJ.showMessage("JP46 Reader Error", "Could not open the URL: " + url + " as JPEG/JP46");
} else { } else {
// imp.updateAndDraw();
// imp.show(); // updateAndDraw();
if ((imp_src==null) && showImage) { if ((imp_src==null) && showImage) {
// System.out.println("show() 1"); // System.out.println("show() 1");
imp.show(); /* Shows before re-ordering*/ imp.show(); /* Shows before re-ordering*/
...@@ -450,6 +469,7 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -450,6 +469,7 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
} }
boolean jp46Reorder(ImagePlus imp, long[] MakerNote, boolean scale, ImagePlus imp_src) { boolean jp46Reorder(ImagePlus imp, long[] MakerNote, boolean scale, ImagePlus imp_src) {
// int MARGIN=2; // 2 pixels in JP4/JP46 mode around WOI // int MARGIN=2; // 2 pixels in JP4/JP46 mode around WOI
double[] gains= new double[4]; double[] gains= new double[4];
double[] blacks= new double[4]; double[] blacks= new double[4];
double[] blacks256= new double[4]; double[] blacks256= new double[4];
...@@ -459,6 +479,7 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -459,6 +479,7 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
double[][] rgammas=new double[4][]; double[][] rgammas=new double[4][];
double min_gain; double min_gain;
long WOI_LEFT,WOI_WIDTH,WOI_TOP,WOI_HEIGHT,BAYER_MODE,DCM_HOR,DCM_VERT,BIN_HOR,BIN_VERT; long WOI_LEFT,WOI_WIDTH,WOI_TOP,WOI_HEIGHT,BAYER_MODE,DCM_HOR,DCM_VERT,BIN_HOR,BIN_VERT;
BAYER_MODE = 0;
long COLOR_MODE=0; long COLOR_MODE=0;
long FLIPH=0; long FLIPH=0;
long FLIPV=0; long FLIPV=0;
...@@ -730,35 +751,36 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -730,35 +751,36 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
} }
} }
/* apply gammas here */ /* apply gammas here */
int[] bayer_indices= BAYER_INDICES[(int) BAYER_MODE];
if (MakerNote !=null) { if (MakerNote !=null) {
if (scale) { if (scale) {
for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) { for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) {
i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x ]= (float) (((rgammas[1][i])-blacks256[1])/gains[1]); macroblock[y ][x ]= (float) (((rgammas[bayer_indices[1]][i])-blacks256[bayer_indices[1]])/gains[bayer_indices[1]]);
i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x+1]= (float) (((rgammas[0][i])-blacks256[0])/gains[0]); macroblock[y ][x+1]= (float) (((rgammas[bayer_indices[0]][i])-blacks256[bayer_indices[0]])/gains[bayer_indices[0]]);
i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x ]= (float) (((rgammas[3][i])-blacks256[3])/gains[3]); macroblock[y+1][x ]= (float) (((rgammas[bayer_indices[3]][i])-blacks256[bayer_indices[3]])/gains[bayer_indices[3]]);
i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x+1]= (float) (((rgammas[2][i])-blacks256[2])/gains[2]); macroblock[y+1][x+1]= (float) (((rgammas[bayer_indices[2]][i])-blacks256[bayer_indices[2]])/gains[bayer_indices[2]]);
} }
} else { } else {
for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) { for (y=0;y<16;y+=2) for (x=0;x<16;x+=2) {
i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x ]= (float) ((rgammas[1][i])-blacks256[1]); macroblock[y ][x ]= (float) ((rgammas[bayer_indices[1]][i])-blacks256[bayer_indices[1]]);
i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y ][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y ][x+1]= (float) ((rgammas[0][i])-blacks256[0]); macroblock[y ][x+1]= (float) ((rgammas[bayer_indices[0]][i])-blacks256[bayer_indices[0]]);
i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x ]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x ]= (float) ((rgammas[3][i])-blacks256[3]); macroblock[y+1][x ]= (float) ((rgammas[bayer_indices[3]][i])-blacks256[bayer_indices[3]]);
i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255; i=(int) macroblock[y+1][x+1]; if (i<0) i=0 ; else if (i>255) i=255;
macroblock[y+1][x+1]= (float) ((rgammas[2][i])-blacks256[2]); macroblock[y+1][x+1]= (float) ((rgammas[bayer_indices[2]][i])-blacks256[bayer_indices[2]]);
} }
} }
} }
...@@ -771,16 +793,60 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -771,16 +793,60 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
} }
} }
} }
if (FLIPH!=0) ip_src.flipHorizontal(); /* To correct Bayer */
if (FLIPV!=0) ip_src.flipVertical(); /* To correct Bayer */ if (FLIPH!=0) {
ip_src.flipHorizontal(); /* To correct Bayer */
}
if (FLIPV!=0) {
ip_src.flipVertical(); /* To correct Bayer */
}
/* Is it needed here ? */ /* Is it needed here ? */
/* imp.draw(); /* imp.draw();
imp.show(); **/ imp.show(); **/
if (use_imp_src) copyProperties (imp, imp_src); if (use_imp_src) copyProperties (imp, imp_src);
if (fix_bayer) {
shiftToBayer(use_imp_src? imp_src: imp);
}
return use_imp_src; return use_imp_src;
} }
/**
* Shift image vertically and/or horizontally to make it with BAYER_MODE=0 (RG/GB)
* @param imp_src image, will be modified
* @return true if any changes were applied
*/
public boolean shiftToBayer( ImagePlus imp) {
int bayer_mode = Integer.parseInt((String) imp.getProperty("BAYER_MODE"));
int flip_vert = Integer.parseInt((String) imp.getProperty("FLIPV"));
int flip_hor = Integer.parseInt((String) imp.getProperty("FLIPH"));
bayer_mode ^= flip_hor + (flip_vert << 1);
if (bayer_mode == 0) return false;
int width = imp.getWidth();
int height = imp.getHeight();
float [] pixels = (float[]) imp.getProcessor().getPixels();
if ((bayer_mode & 1) != 0) { // horizontal shift
System.arraycopy(pixels, 1, pixels, 0, pixels.length-1); // shift left by 1 pixel (last column will be wrong)
for (int row = 0; row < height; row++) {
pixels[(row + 1) * width -1] = pixels[(row + 1) * width - 3]; // set the last column with the nearest of the same Bayer
}
}
if ((bayer_mode & 2) != 0) { // vertical shift
System.arraycopy(pixels, width, pixels, 0, pixels.length-width); // shift up by 1 row (last row will be wrong)
System.arraycopy(pixels, width * (height - 3), pixels, width * (height-1), width); // set the row column with the nearest of the same Bayer
}
bayer_mode = flip_hor + (flip_vert << 1);
imp.setProperty("BAYER_MODE",""+bayer_mode);
return true;
}
/* reverses gamma calculations in the camera /* reverses gamma calculations in the camera
returns double[] table , in the range 0.0..255.996 returns double[] table , in the range 0.0..255.996
*/ */
...@@ -924,6 +990,22 @@ public class JP46_Reader_camera implements PlugIn, ActionListener { ...@@ -924,6 +990,22 @@ public class JP46_Reader_camera implements PlugIn, ActionListener {
} }
return data; return data;
} }
public boolean readDummyURL(String url ) { // throws IOException {
URL camURL = null;
URLConnection urlConn = null;
try {
camURL = new URL(url);
urlConn = camURL.openConnection();
urlConn.getHeaderFields();
} catch(MalformedURLException e){
System.out.println("Please check the URL:" + e.toString() );
return false;
} catch(IOException e1){
System.out.println("Can't read from the Internet: "+ e1.toString() );
return false;
}
return true;
}
long[] readElphelMakerNoteURL(String url, int len, double [] xtraExif) throws IOException { long[] readElphelMakerNoteURL(String url, int len, double [] xtraExif) throws IOException {
URL camURL = null; URL camURL = null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment