Commit b724a8ca authored by Andrey Filippov's avatar Andrey Filippov

Working on Cuas RT

parent 21b47b81
......@@ -38,6 +38,8 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.swing.JFileChooser;
......@@ -2033,6 +2035,65 @@ public class EyesisCorrectionParameters {
return;
}
public static String [] listModelNames(String [] source_tiff_paths) {
HashSet<String> models_set = new HashSet<String>();
for (String tiff_path: source_tiff_paths) {
models_set.add(Path.of(tiff_path).getParent().getFileName().toString());
}
List<String> models_list = new ArrayList<>(models_set);
Collections.sort(models_list);
return models_list.toArray(new String[0]);
}
public static String [] listExistingModelPaths(
String models_directory,
String version, // if null, will return top directories
String model_name_suffix,
String [] model_names) {
ArrayList<String> existing_list = new ArrayList<String>();
for (int i =0; i < model_names.length; i++) {
String model_name = model_names[i] + ((model_name_suffix != null)?model_name_suffix:"");
String model_path = (version != null)?
Paths.get(models_directory, model_name, version).toString():
Paths.get(models_directory, model_name).toString();
if ((new File(model_path)).exists()){
existing_list.add(model_path);
}
}
return existing_list.toArray(new String[0]);
}
public static String[] getFilesByExtensionAsArray(String dirPath, String suffix) {
Path path = Path.of(dirPath);
/*
// Open a stream of the directory contents
try (Stream<Path> stream = Files.list(path)) {
return stream
// 1. Filter out subdirectories
.filter(Files::isRegularFile)
// 2. Match the end of the filename (case-insensitive example)
.filter(p -> p.getFileName().toString().toLowerCase().endsWith(suffix.toLowerCase()))
// 3. Collect matching paths to a list
.collect(Collectors.toList()); // Use .collect(Collectors.toList()) if on Java 15 or below
}
*/
try (Stream<Path> stream = Files.list(path)) {
return stream
.filter(Files::isRegularFile)
// Convert Path object to String so the array holds Strings
.map(p -> p.toString())
.filter(s -> s.endsWith(suffix))
// Convert directly to String array (Works perfectly in Java 8 to 21+)
.toArray(String[]::new);
} catch (IOException | SecurityException e) {
// TODO Auto-generated catch block
return new String[0];
}
}
// .filter(s -> s.toLowerCase().endsWith(suffix.toLowerCase()))
// get list of source files in a directory
public String[] selectSourceFileInSet(String setdir, int debugLevel) {
int num_chn_main = numSubCameras;
......@@ -2670,6 +2731,12 @@ public class EyesisCorrectionParameters {
return dir;
}
public String getX3dDirectory() {
return x3dDirectory;
}
public String getX3dModelVersion() {
return x3dModelVersion;
}
public String selectX3dDirectory(boolean smart, boolean newAllowed) {
String dir= CalibrationFileManagement.selectDirectory(
smart,
......
......@@ -22,6 +22,9 @@
**
*/
package com.elphel.imagej.common;
import java.awt.Font;
import javax.swing.UIManager;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Arrays;
......@@ -150,6 +153,11 @@ import ij.process.ImageProcessor;
}
public static ImagePlus showArraysHyperstack(double[][] pixels, int width, int height, int slices, String title, String [] titles, boolean show) {
// Explicitly push Java's fallback engine to use its universal "Dialog" family
// This forces Kubuntu to dynamically pull the missing arrow glyphs from Noto Sans Symbols
// Font linuxFallbackFont = new Font("Dialog", Font.PLAIN, 12);
// UIManager.put("Label.font", linuxFallbackFont);
// UIManager.put("TableHeader.font", linuxFallbackFont); // Fixes stack window header text
int i,j;
if (pixels==null) {
System.out.println("showDoubleFloatArrays.showArrays(): - pixel array is null");
......
......@@ -909,6 +909,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
addJButton("Aux Build Series", jpanelLWIRWorld, color_stop);
addJButton("CUAS Combine", jpanelLWIRWorld, color_stop, "Combine previously processed CUAS series");
addJButton("CUAS Video", jpanelLWIRWorld, color_stop, "Combine previously rendered CUAS videos");
addJButton("CUAS RT", jpanelLWIRWorld, color_stop, "CUAS Real-time Tests");
addJButton("Build World", jpanelLWIRWorld, color_process);
addJButton("Test IMX5", jpanelLWIRWorld, color_process);
addJButton("Show mice", jpanelLWIRWorld, color_process);
......@@ -5551,6 +5552,14 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
2); // int cuas_proc_mode); // 0 - old, 1 combine scene series) {);
return;
/* ======================================================================== */
} else if (label.equals("CUAS RT")) {
DEBUG_LEVEL = MASTER_DEBUG_LEVEL;
CLT_PARAMETERS.batch_run = true;
buildSeries(
true,
3); // int cuas_proc_mode); // 0 - old, 1 combine scene series) {);
return;
/* ======================================================================== */
} else if (label.equals("Aux Inter Test")) {
DEBUG_LEVEL = MASTER_DEBUG_LEVEL;
CLT_PARAMETERS.batch_run = true;
......@@ -7650,7 +7659,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
public boolean buildSeries(
boolean use_aux,
int cuas_proc_mode) { // 0 - old, 1 combine scene series) {
int cuas_proc_mode) { // 0 - old, 1 combine scene series, 2 - combine video, 3 - RT tests) {
int lwir_level = CLT_PARAMETERS.lwir.getDebugLevel();
String slev = EyesisCorrections.stringLogLevel(lwir_level);
if (slev != null) {
......
......@@ -88,7 +88,6 @@ public class CuasMultiSeries {
QuadCLT quadCLT_main,
String path,
String version) {
// System.out.println ("CuasMultiSeries(): path="+path);
this.clt_parameters = clt_parameters;
double infinity = clt_parameters.imp.cuas_infinity;
File [] scene_dirs = (new File(path)).listFiles(); // may contain non-directories, will be filtered by filterScenes
......
This diff is collapsed.
......@@ -1121,8 +1121,22 @@ min_str_neib_fpn 0.35
public double cuas_max_disp_diff = 0.05; // Maximal disparity difference during last change to consider disparity valid
public double cuas_min_disp_str = 0.4; // Minimal disparity strength to consider disparity valid
public double cuas_rng_limit = 5000; // maximal displayed distance to target
// CUAS Reltime
public boolean curt_en = false; // enable airplane mode
// CUAS Realtime
public boolean curt_en = false; // enable cuas rt calculation
public int curt_pyramid = 7; // temporal pyramid levels
public double curt_psf_radius = 1.6; // sensor PSF radius for LoG pre-filter
public double curt_n_sigma = 4.0; // cutoff LoG kernel array, number of sigmas
public double curt_rleak0 = 0.1; // 1-ReLU leak (0 - linear, 1.0 - classic ReLU) for the LoG prefilter
public double curt_3d3_wnow = 0.5; // Weight of the latest (now) temporal slice when creating coarse velocities
public double curt_3d3_wprev = 0.5; // Weight of the previous temporal slice when creating coarse velocities
public double curt_rleak1 = 0.1; // 1-ReLU leak (0 - linear, 1.0 - classic ReLU) for the coarse velocity 3d convolution
public int curt_pix_decimate = 1; // decimate pixel resolution
public int curt_vel_decimate = 4; // decimate velocities
public int curt_vel_radius = 5; // velocities radius in decimated samples
public double[] curt_temp_weights = {1,1,1,1,1}; // historic weights for 5D convolution ([0] is the latest sample)
// Airplane mode
public boolean air_mode_en = false; // enable airplane mode
......@@ -3344,6 +3358,30 @@ min_str_neib_fpn 0.35
gd.addTab("CUAS RT", "CUAS Real Time");
gd.addCheckbox ("CUAS realtime enable", this.curt_en,
"Enable testing of the realtime CUAS detection.");
gd.addNumericField("Temporal pyramid levels", this.curt_pyramid, 0,3,"",
"Number of binary temporal pyramid levels.");
gd.addNumericField("Optical PSF radius", this.curt_psf_radius, 6,8,"pix",
"Sensor optical PSF radius for the LoG pre-filter.");
gd.addNumericField("N-sigmas for LoG cutoff", this.curt_n_sigma, 6,8,"x",
"Cutoff LoG kernel array, number of sigmas.");
gd.addNumericField("Reversed LReLU LoG leak", this.curt_rleak0, 6,8,"x",
"1-ReLU leak (0 - linear, 1.0 - classic ReLU) for the LoG prefilter.");
gd.addNumericField("Coarse velocities weight now", this.curt_3d3_wnow, 6,8,"x",
"Weight of the latest (now) temporal slice when creating coarse velocities.");
gd.addNumericField("Coarse velocities weight previous", this.curt_3d3_wprev, 6,8,"x",
"Weight of the previous temporal slice when creating coarse velocities.");
gd.addNumericField("Reversed LReLU 3d3 leak", this.curt_rleak1, 6,8,"x",
" 1-ReLU leak (0 - linear, 1.0 - classic ReLU) for the coarse velocity 3d convolution.");
gd.addNumericField("Pixel decimate", this.curt_pix_decimate, 0,3,"",
"Decimate pixels (increase resolution).");
gd.addNumericField("Velocity decimate", this.curt_vel_decimate, 0,3,"",
"Decimate velocities (increase velocity resolution).");
gd.addNumericField("Velocities radius", this.curt_vel_radius, 0,3,"",
"Velocities radius in decimated samples.");
gd.addStringField ("Historic weight for 5D convolution", IntersceneMatchParameters.doublesToString(curt_temp_weights), 80,
"Historic weights for 5D convolution ([0] is the latest sample). Will be normalized");
//
gd.addTab("Airplane","Airplane mode (fast forward movement, low vertical speed");
gd.addCheckbox ("Enable airplane mode", this.air_mode_en,
......@@ -4816,6 +4854,18 @@ min_str_neib_fpn 0.35
this.cuas_rng_limit = gd.getNextNumber();
this.curt_en = gd.getNextBoolean();
this.curt_pyramid = (int) gd.getNextNumber();
this.curt_psf_radius = gd.getNextNumber();
this.curt_n_sigma = gd.getNextNumber();
this.curt_rleak0 = gd.getNextNumber();
this.curt_3d3_wnow = gd.getNextNumber();
this.curt_3d3_wprev = gd.getNextNumber();
this.curt_rleak1 = gd.getNextNumber();
this.curt_pix_decimate = (int) gd.getNextNumber();
this.curt_vel_decimate = (int) gd.getNextNumber();
this.curt_vel_radius = (int) gd.getNextNumber();
this.curt_temp_weights = IntersceneMatchParameters. StringToDoubles(gd.getNextString(), 0);
this.air_mode_en = gd.getNextBoolean();
this.air_sync_ims = gd.getNextBoolean();
this.air_disp_corr = gd.getNextBoolean();
......@@ -6117,6 +6167,18 @@ min_str_neib_fpn 0.35
properties.setProperty(prefix+"cuas_rng_limit", this.cuas_rng_limit+""); // double
properties.setProperty(prefix+"curt_en", this.curt_en+""); // boolean
properties.setProperty(prefix+"curt_pyramid", this.curt_pyramid+""); // int
properties.setProperty(prefix+"curt_psf_radius", this.curt_psf_radius+""); // double
properties.setProperty(prefix+"curt_n_sigma", this.curt_n_sigma+""); // double
properties.setProperty(prefix+"curt_rleak0", this.curt_rleak0+""); // double
properties.setProperty(prefix+"curt_3d3_wnow", this.curt_3d3_wnow+""); // double
properties.setProperty(prefix+"curt_3d3_wprev", this.curt_3d3_wprev+""); // double
properties.setProperty(prefix+"curt_rleak1", this.curt_rleak1+""); // double
properties.setProperty(prefix+"curt_pix_decimate", this.curt_pix_decimate+""); // int
properties.setProperty(prefix+"curt_vel_decimate", this.curt_vel_decimate+""); // int
properties.setProperty(prefix+"curt_vel_radius", this.curt_vel_radius+""); // int
properties.setProperty(prefix+"curt_temp_weights", IntersceneMatchParameters.doublesToString(this.curt_temp_weights));
properties.setProperty(prefix+"air_mode_en", this.air_mode_en+""); // boolean
properties.setProperty(prefix+"air_sync_ims", this.air_sync_ims+""); // boolean
properties.setProperty(prefix+"air_disp_corr", this.air_disp_corr+""); // boolean
......@@ -7401,6 +7463,21 @@ min_str_neib_fpn 0.35
if (properties.getProperty(prefix+"cuas_rng_limit")!=null) this.cuas_rng_limit=Double.parseDouble(properties.getProperty(prefix+"cuas_rng_limit"));
if (properties.getProperty(prefix+"curt_en")!=null) this.curt_en=Boolean.parseBoolean(properties.getProperty(prefix+"curt_en"));
if (properties.getProperty(prefix+"curt_pyramid")!=null) this.curt_pyramid=Integer.parseInt(properties.getProperty(prefix+"curt_pyramid"));
if (properties.getProperty(prefix+"curt_psf_radius")!=null) this.curt_psf_radius=Double.parseDouble(properties.getProperty(prefix+"curt_psf_radius"));
if (properties.getProperty(prefix+"curt_n_sigma")!=null) this.curt_n_sigma=Double.parseDouble(properties.getProperty(prefix+"curt_n_sigma"));
if (properties.getProperty(prefix+"curt_rleak0")!=null) this.curt_rleak0=Double.parseDouble(properties.getProperty(prefix+"curt_rleak0"));
if (properties.getProperty(prefix+"curt_3d3_wnow")!=null) this.curt_3d3_wnow=Double.parseDouble(properties.getProperty(prefix+"curt_3d3_wnow"));
if (properties.getProperty(prefix+"curt_3d3_wprev")!=null) this.curt_3d3_wprev=Double.parseDouble(properties.getProperty(prefix+"curt_3d3_wprev"));
if (properties.getProperty(prefix+"curt_rleak1")!=null) this.curt_rleak1=Double.parseDouble(properties.getProperty(prefix+"curt_rleak1"));
if (properties.getProperty(prefix+"curt_pix_decimate")!=null) this.curt_pix_decimate=Integer.parseInt(properties.getProperty(prefix+"curt_pix_decimate"));
if (properties.getProperty(prefix+"curt_vel_decimate")!=null) this.curt_vel_decimate=Integer.parseInt(properties.getProperty(prefix+"curt_vel_decimate"));
if (properties.getProperty(prefix+"curt_vel_radius")!=null) this.curt_vel_radius=Integer.parseInt(properties.getProperty(prefix+"curt_vel_radius"));
if (properties.getProperty(prefix+"curt_temp_weights")!=null) this.curt_temp_weights= IntersceneMatchParameters.StringToDoubles(properties.getProperty(prefix+"curt_temp_weights"),0); // use 0
if (properties.getProperty(prefix+"air_mode_en")!=null) this.air_mode_en=Boolean.parseBoolean(properties.getProperty(prefix+"air_mode_en"));
if (properties.getProperty(prefix+"air_sync_ims")!=null) this.air_sync_ims=Boolean.parseBoolean(properties.getProperty(prefix+"air_sync_ims"));
if (properties.getProperty(prefix+"air_disp_corr")!=null) this.air_disp_corr=Boolean.parseBoolean(properties.getProperty(prefix+"air_disp_corr"));
......@@ -8666,6 +8743,18 @@ min_str_neib_fpn 0.35
imp.cuas_rng_limit = this.cuas_rng_limit;
imp.curt_en = this.curt_en;
imp.curt_pyramid = this.curt_pyramid;
imp.curt_psf_radius = this.curt_psf_radius;
imp.curt_n_sigma = this.curt_n_sigma;
imp.curt_rleak0 = this.curt_rleak0;
imp.curt_3d3_wnow = this.curt_3d3_wnow;
imp.curt_3d3_wprev = this.curt_3d3_wprev;
imp.curt_rleak1 = this.curt_rleak1;
imp.curt_pix_decimate = this.curt_pix_decimate;
imp.curt_vel_decimate = this.curt_vel_decimate;
imp.curt_vel_radius = this.curt_vel_radius;
imp.curt_temp_weights = this.curt_temp_weights.clone();
imp.air_mode_en = this.air_mode_en;
imp.air_sync_ims = this.air_sync_ims;
imp.air_disp_corr = this.air_disp_corr;
......
......@@ -62,6 +62,7 @@ import com.elphel.imagej.cuas.Cuas;
import com.elphel.imagej.cuas.CuasCenterLma;
import com.elphel.imagej.cuas.CuasMotion;
import com.elphel.imagej.cuas.CuasRanging;
import com.elphel.imagej.cuas.rt.CuasDetectRT;
import com.elphel.imagej.gpu.GPUTileProcessor;
import com.elphel.imagej.gpu.GpuQuad;
import com.elphel.imagej.gpu.TpTask;
......@@ -7237,37 +7238,13 @@ java.lang.NullPointerException
// Testing vegetation, for debugging supposing that terrain layer is already set in *-INTER-INTRA-LMA.tiff - normally it is only set during 3d model generation
// Moved to the very end, after 3D
// boolean test_vegetation = true;
if (master_CLT.hasCenterClt() && clt_parameters.imp.curt_en) { // cuas mode
if (debugLevel >-3) {
System.out.println("===== Running CUAS realtime testing. =====");
}
CuasRanging cuasRanging = new CuasRanging (
clt_parameters, // CLTParameters clt_parameters,
false, // boolean realtime_mode,
master_CLT, // QuadCLT center_CLT,
quadCLTs, // QuadCLT [] scenes,
debugLevel); // int debugLevel) {
CuasMotion cuasMotion = cuasRanging.detectTargets(
uasLogReader, // UasLogReader uasLogReader,
batch_mode); // boolean batch_mode)
if (cuasMotion == null) {
System.out.println("Failed target detection. Probably, radar mode was selected but target file does not exist (created with \"CUAS Combine\" command)");
} else {
if (debugLevel > -4) {
System.out.println("Target detection DONE");
}
}
}
if (master_CLT.hasCenterClt() && clt_parameters.imp.cuas_targets_en) { // cuas mode
if (debugLevel >-3) {
System.out.println("===== Running CUAS ranging. =====");
}
CuasRanging cuasRanging = new CuasRanging (
clt_parameters, // CLTParameters clt_parameters,
false, // boolean realtime_mode,
master_CLT, // QuadCLT center_CLT,
quadCLTs, // QuadCLT [] scenes,
debugLevel); // int debugLevel) {
......
......@@ -53,13 +53,16 @@ import java.util.concurrent.atomic.AtomicInteger;
import com.elphel.imagej.cameras.CLTParameters;
import com.elphel.imagej.cameras.ColorProcParameters;
import com.elphel.imagej.cameras.EyesisCorrectionParameters;
import com.elphel.imagej.cameras.EyesisCorrectionParameters.CorrectionParameters;
import com.elphel.imagej.common.GenericJTabbedDialog;
import com.elphel.imagej.common.LogTee;
import com.elphel.imagej.common.ShowDoubleFloatArrays;
import com.elphel.imagej.correction.CorrectionColorProc;
import com.elphel.imagej.correction.EyesisCorrections;
import com.elphel.imagej.correction.SyncCommand;
import com.elphel.imagej.cuas.CuasMotion;
import com.elphel.imagej.cuas.CuasMultiSeries;
import com.elphel.imagej.cuas.rt.CuasDetectRT;
import com.elphel.imagej.gpu.ExportForGPUDevelopment;
import com.elphel.imagej.gpu.GPUTileProcessor;
import com.elphel.imagej.gpu.GpuQuad;
......@@ -8541,9 +8544,9 @@ if (debugLevel > -100) return true; // temporarily !
// has no IMS data loaded. setCameraLLA() is called in CuasRanging.addUasData()
// once center_CLT.did_ins_2 is available (from createCenterClt() or restoreCenterClt()).
}
String uas_sky_mask_path = quadCLT_main.correctionsParameters.getUasSkyMask();
switch (cuas_proc_mode) {
case 0 :
String uas_sky_mask_path = quadCLT_main.correctionsParameters.getUasSkyMask();
QuadCLT[] index_scenes = {null,null}; // [0] - first for this series, [1] - overall first
for (int nseq = 0; nseq < num_seq; nseq++) {
long start_time_seq = System.nanoTime();
......@@ -8595,19 +8598,6 @@ if (debugLevel > -100) return true; // temporarily !
Arrays.sort(scene_names);
}
/*
// Process UAS logs
UasLogReader uasLogReader = null;
String uas_log_path = quadCLT_main.correctionsParameters.getUasLogsPath();
System.out.println("Using UAS log file: "+uas_log_path);
if ((uas_log_path != null) && (uas_log_path.length() > 0)) {
uasLogReader = new UasLogReader(uas_log_path, quadCLT_main.correctionsParameters.cuasUasTimeStamp, null, quadCLT_main);
uasLogReader.setCameraATR(quadCLT_main.correctionsParameters.cuasCameraATR);
uasLogReader.setUASHomeNed(quadCLT_main.correctionsParameters.cuasSetHome? quadCLT_main.correctionsParameters.cuasUASHome : null);
}
*/
if (debugLevel > -4) {
System.out.println("cuas_centers="+((cuas_centers != null)?("[\""+cuas_centers[0]+"\",\""+cuas_centers[1]+"\"]"):"null"));
}
......@@ -9185,6 +9175,83 @@ if (debugLevel > -100) return true; // temporarily !
cuasMultiSeries.combineVideos();
}
break;
case 3:
{
System.out.println("Processing realtime tests");
SetChannels [] set_channels_main = quadCLT_main.setChannels(debugLevel);
String [] scene_names = null;
if (set_channels_main != null) {
scene_names = new String[ set_channels_main.length];
for (int i = 0; i < scene_names.length; i++) {
scene_names[i] = set_channels_main[i].name();
}
Arrays.sort(scene_names);
}
String model_suffix = "-CENTER";
for (int nseq = 0; nseq < num_seq; nseq++) {
long start_time_seq = System.nanoTime();
System.out.println("\nSTARTED PROCESSING SCENE SEQUENCE "+nseq+" (last is "+(num_seq-1)+")\n");
if (pathFirstLast != null) {
File [] scene_dirs = (new File(pathFirstLast[nseq].path)).listFiles(); // may contain non-directories, will be filtered by filterScenes
System.out.println("scene_dirs.length="+scene_dirs.length);
System.out.println("pathFirstLast[nseq].path="+pathFirstLast[nseq].path);
quadCLT_main.correctionsParameters.filterScenes(
scene_dirs, // File [] scene_dirs,
pathFirstLast[nseq].first, // int scene_first, // first scene to process
pathFirstLast[nseq].last); // int scene_last); // last scene to process (negative - add length
/*
if (pathFirstLast[nseq].movement_size < 0) {
clt_parameters.imp.mov_en = false;
if (debugLevel > -4) {
System.out.println("Disabling movement detection for this scene.");
}
} else {
clt_parameters.imp.mov_en = true;
clt_parameters.imp.mov_max_len = pathFirstLast[nseq].movement_size;
if (debugLevel > -4) {
System.out.println("Enabling movement detection for this scene with maximum cluster linear size of "+
clt_parameters.imp.mov_max_len+" tiles.");
}
}
clt_parameters.imp.cuas_sky_path = uas_sky_mask_path;
if (clt_parameters.imp.cuas_sky_path != null) {
clt_parameters.imp.cuas_sky_offset = new double[] {pathFirstLast[nseq].mask_x,pathFirstLast[nseq].mask_y};
}
*/
String [] model_names = CorrectionParameters.listModelNames( quadCLT_main.correctionsParameters.getSourcePaths());
// below is valid for CUAS
String models_directory = quadCLT_main.correctionsParameters.getX3dDirectory();
String model_version = quadCLT_main.correctionsParameters.getX3dModelVersion();
String [] model_paths = CorrectionParameters.listExistingModelPaths(
models_directory,
model_version,
model_suffix,
model_names);
if (model_paths.length > 0) {
for (int i = 0; i < model_paths.length; i++) {
System.out.println("Processing model directory: "+model_paths[i]);
// check if *-CUAS
CuasDetectRT cuasDetectRT = new CuasDetectRT(
clt_parameters, // CLTParameters clt_parameters,
uasLogReader, // UasLogReader uasLogReader,
model_paths[i], // String model_directory) {
debugLevel); // int debugLevel)
CuasMotion cuasMotion= cuasDetectRT.detectTargets(
clt_parameters, // CLTParameters clt_parameters,
(pathFirstLast != null), // boolean batch_mode,
debugLevel); // int debugLevel) {
}
} else {
System.out.println("No model paths match criteria");
}
}
System.out.println("nseq="+nseq);
}
}
break;
} // switch (cuas_proc_mode) {
System.out.println("\n\n\nPROCESSING OF "+num_seq+" SCENE SEQUENCES is FINISHED in "+
......
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