X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemiaUI%2FProgram.fs;fp=Parasitemia%2FParasitemiaUI%2FProgram.fs;h=bbf20b37da02e981916507772bc7e33947ee8fd1;hb=4bfa3cbdc6145e6944f02e24829ab2ef3a851ac1;hp=0000000000000000000000000000000000000000;hpb=48ecdfc43001c444eff6ad442986049384674af2;p=master-thesis.git diff --git a/Parasitemia/ParasitemiaUI/Program.fs b/Parasitemia/ParasitemiaUI/Program.fs new file mode 100644 index 0000000..bbf20b3 --- /dev/null +++ b/Parasitemia/ParasitemiaUI/Program.fs @@ -0,0 +1,94 @@ +module ParasitemiaUI.Main + +open System +open System.IO +open System.Threading + +open Emgu.CV +open Emgu.CV.Structure + +open Logger + +open ParasitemiaCore.Utils +open ParasitemiaCore.Config + +type Input = + | File of string + | Dir of string + +type RunningMode = + | CmdLine of Input * string // A file or a directory to process and the output directory. + | Window of string option // An optional path to a file to open can be given in window mode. + +type Arguments = RunningMode * bool + +let parseArgs (args: string[]) : Arguments = + + let output = Array.tryFindIndex ((=) "--output") args + + let runningMode = + match Array.tryFindIndex ((=) "--folder") args, output with + | Some i, Some i_output when i < args.Length - 2 && i_output < args.Length - 2 -> + CmdLine ((Dir args.[i+1]), args.[i_output + 1]) + | _ -> + match Array.tryFindIndex ((=) "--file") args, output with + | Some i, Some i_output when i < args.Length - 2 && i_output < args.Length - 2 -> + CmdLine ((File args.[i+1]), args.[i_output + 1]) + |_ -> + Window (if args.Length > 0 && not (args.[0].StartsWith("--")) then Some args.[0] else None) + + runningMode, Array.exists ((=) "--debug") args + +[] +[] +let main args = + try + Log.User("Starting of Parasitemia UI ...") + + let result = + match parseArgs args with + | mode, debug -> + let config = Config(defaultParameters) + + match mode with + | CmdLine (input, output) -> + if debug + then + config.Debug <- DebugOn output + + Directory.CreateDirectory output |> ignore + + use logFile = new StreamWriter(new FileStream(Path.Combine(output, "log.txt"), FileMode.Append, FileAccess.Write)) + Log.AddListener({ new IListener with member this.NewEntry mess severity = logFile.WriteLine(mess) }) + + Log.User (sprintf "=== New run : %A %A ===" DateTime.Now (if debug then "[DEBUG]" else "[RELEASE]")) + + let files = match input with + | File file -> [ file ] + | Dir dir -> Directory.EnumerateFiles dir |> List.ofSeq + + use resultFile = new StreamWriter(new FileStream(Path.Combine(output, "results.txt"), FileMode.Append, FileAccess.Write)) + + + let images = [ for file in files -> Path.GetFileNameWithoutExtension(FileInfo(file).Name), config.Copy(), new Image(file) ] + + Log.LogWithTime("Whole analyze", Severity.USER, (fun () -> + let results = ParasitemiaCore.Analysis.doMultipleAnalysis images None + + for id, cells in results do + let config = images |> List.pick (fun (id', config', _) -> if id' = id then Some config' else None) + let total, infected = countCells cells + fprintf resultFile "File: %s %d %d %.2f (diameter: %A)\n" id total infected (100. * (float infected) / (float total)) config.RBCRadius)) + 0 + + | Window fileToOpen -> + if debug then config.Debug <- DebugOn "." + GUI.run config fileToOpen + + Log.User("Parasitemia UI closed") + result + + with + | _ as ex -> + Log.Fatal("Error: {0}", ex) + 1 \ No newline at end of file