diff --git a/TIASshot/Cameras/CameraBase.cs b/TIASshot/Cameras/CameraBase.cs index 17f0c56..c543cde 100644 --- a/TIASshot/Cameras/CameraBase.cs +++ b/TIASshot/Cameras/CameraBase.cs @@ -56,8 +56,8 @@ public CameraBase(Form1 form) { _form = form; UpdateRate = Config.GetFloat("Calib/UpdateRate"); - var tccSrgb = LoadMatFromCsv(Config.GetString("File/TccSrgbRef")); - var tccXyz = LoadMatFromCsv(Config.GetString("File/TccXyzRef")); + var tccSrgb = IoUtil.LoadMatFromCsv(Config.GetString("File/TccSrgbRef")); + var tccXyz = IoUtil.LoadMatFromCsv(Config.GetString("File/TccXyzRef")); _colorCorrector = new ColorCorrector(tccSrgb, tccXyz); _chartDetector = new ChartDetector(_form.ShowMessage); } @@ -91,7 +91,7 @@ SetInfo("データ名", _form.GetDataName()); SetInfo("撮影枚数", "1"); Shot(); - EventSound(Config.GetString("Sound/OneShotDone")); + IoUtil.PlaySound(Config.GetString("Sound/OneShotDone")); _form.ShowMessage("撮影終了"); } @@ -104,7 +104,7 @@ SetInfo("撮影枚数", $"{_form.GetNumMultiShots()}"); SetInfo("撮影間隔(ms)", $"{_form.GetMultiShotsInterval()}"); Shot(_form.GetNumMultiShots(), _form.GetMultiShotsInterval()); - EventSound(Config.GetString("Sound/MultiShotDone")); + IoUtil.PlaySound(Config.GetString("Sound/MultiShotDone")); _form.ShowMessage("撮影終了"); } @@ -189,9 +189,9 @@ Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("File/TccRoisImage")), imgRois); // 変換行列の計算・保存は ColorCorrector に委譲する - _colorCorrector.CalcTcc(tccRgb, _saveFolder, SaveMatToCsv); + _colorCorrector.CalcTcc(tccRgb, _saveFolder, IoUtil.SaveMatToCsv); - EventSound(Config.GetString("Sound/CalibDone")); + IoUtil.PlaySound(Config.GetString("Sound/CalibDone")); _form.ShowMessage("自動校正完了"); _form.EnableShots(); _calibrated = true; @@ -238,69 +238,11 @@ } /// - /// csvファイルからMatを読み込む - /// - /// - /// - /// - private Mat LoadMatFromCsv(string csvFile) { - try { - var arr = new List(); - int cols = -1; - using (var reader = new StreamReader(csvFile)) { - while (!reader.EndOfStream) { - var line = reader.ReadLine(); - var valStrs = line.Split(','); - if (cols == -1) cols = valStrs.Length; - else if (cols != valStrs.Length) throw new Exception("cols != valStrs.Length"); - var vals = valStrs.Select(x => double.Parse(x)).ToArray(); - arr.Add(vals); - } - } - var m = new Mat(arr.Count, cols, MatType.CV_64FC1); - for (var row = 0; row < arr.Count; row++) { - for (var col = 0; col < cols; col++) { - m.At(row, col) = arr[row][col]; - } - } - return m; - } catch (Exception) { - return null; - } - } - - /// - /// Matをcsvファイルに保存 - /// - /// - /// - private void SaveMatToCsv(string csvFile, Mat m) { - using (var writer = new StreamWriter(csvFile)) { - for (var row = 0; row < m.Rows; row++) { - var line = ""; - for (var col = 0; col < m.Cols; col++) { - if (col > 0) line += ","; - line += $"{m.At(row, col):0.0000000}"; - } - writer.WriteLine(line); - } - } - } - - /// /// 保存フォルダの取得 /// - /// - /// + /// protected void SetSaveFolder(string note) { - var dt = DateTime.Now; - var paths = new List() { - Config.GetString("File/SaveFolder"), - dt.ToString("yyyy-MM-dd"), - dt.ToString("HH_mm_ss") + $"-{note}", - }; - _saveFolder = Path.Combine(paths.ToArray()); - Directory.CreateDirectory(_saveFolder); + _saveFolder = IoUtil.CreateSaveFolder(note); } /// @@ -321,24 +263,7 @@ /// /// protected void WriteInfo(StreamWriter sw) { - sw.WriteLine($"撮影日時,{DateTime.Now:yyyy/MM/dd HH:mm:ss}"); // 撮影日時を追加 - foreach (var kvp in _ShotInfo) { - sw.WriteLine($"{kvp.Key},{kvp.Value}"); - } - } - - private void EventSound(string wavfile) { - if (!File.Exists(wavfile)) { - Debug.WriteLine($"音声ファイルが見つかりません: {wavfile}"); - return; - } - try { - using (var player = new SoundPlayer(wavfile)) { - player.Play(); - } - } catch (Exception ex) { - Debug.WriteLine($"音声再生に失敗しました: {ex.Message}"); - } + IoUtil.WriteInfo(sw, _ShotInfo); } } } diff --git a/TIASshot/TIASshot.csproj b/TIASshot/TIASshot.csproj index 3da5606..17d62b6 100644 --- a/TIASshot/TIASshot.csproj +++ b/TIASshot/TIASshot.csproj @@ -1,4 +1,4 @@ - + @@ -122,6 +122,7 @@ + Form diff --git a/TIASshot/Utils/IoUtil.cs b/TIASshot/Utils/IoUtil.cs new file mode 100644 index 0000000..0d7c41e --- /dev/null +++ b/TIASshot/Utils/IoUtil.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Media; +using OpenCvSharp; + +namespace TIASshot { + /// + /// ファイル I/O(CSV 読み書き・保存フォルダ生成・撮影情報出力)とサウンド再生の + /// ユーティリティ.CameraBase から委譲される.状態を持たない. + /// + internal static class IoUtil { + + /// + /// csvファイルからMatを読み込む + /// + /// + /// + /// + public static Mat LoadMatFromCsv(string csvFile) { + try { + var arr = new List(); + int cols = -1; + using (var reader = new StreamReader(csvFile)) { + while (!reader.EndOfStream) { + var line = reader.ReadLine(); + var valStrs = line.Split(','); + if (cols == -1) cols = valStrs.Length; + else if (cols != valStrs.Length) throw new Exception("cols != valStrs.Length"); + var vals = valStrs.Select(x => double.Parse(x)).ToArray(); + arr.Add(vals); + } + } + var m = new Mat(arr.Count, cols, MatType.CV_64FC1); + for (var row = 0; row < arr.Count; row++) { + for (var col = 0; col < cols; col++) { + m.At(row, col) = arr[row][col]; + } + } + return m; + } catch (Exception) { + return null; + } + } + + /// + /// Matをcsvファイルに保存 + /// + /// + /// + public static void SaveMatToCsv(string csvFile, Mat m) { + using (var writer = new StreamWriter(csvFile)) { + for (var row = 0; row < m.Rows; row++) { + var line = ""; + for (var col = 0; col < m.Cols; col++) { + if (col > 0) line += ","; + line += $"{m.At(row, col):0.0000000}"; + } + writer.WriteLine(line); + } + } + } + + /// + /// 保存フォルダを生成し,そのパスを返す + /// + /// + /// 生成した保存フォルダのパス + public static string CreateSaveFolder(string note) { + var dt = DateTime.Now; + var paths = new List() { + Config.GetString("File/SaveFolder"), + dt.ToString("yyyy-MM-dd"), + dt.ToString("HH_mm_ss") + $"-{note}", + }; + var saveFolder = Path.Combine(paths.ToArray()); + Directory.CreateDirectory(saveFolder); + return saveFolder; + } + + /// + /// 設定値をCSVファイルに書き込む + /// + /// + /// + public static void WriteInfo(StreamWriter sw, Dictionary info) { + sw.WriteLine($"撮影日時,{DateTime.Now:yyyy/MM/dd HH:mm:ss}"); // 撮影日時を追加 + foreach (var kvp in info) { + sw.WriteLine($"{kvp.Key},{kvp.Value}"); + } + } + + /// + /// 効果音を再生する + /// + /// + public static void PlaySound(string wavfile) { + if (!File.Exists(wavfile)) { + Debug.WriteLine($"音声ファイルが見つかりません: {wavfile}"); + return; + } + try { + using (var player = new SoundPlayer(wavfile)) { + player.Play(); + } + } catch (Exception ex) { + Debug.WriteLine($"音声再生に失敗しました: {ex.Message}"); + } + } + } +}