diff --git a/TIASshot/Lucam.cs b/TIASshot/Lucam.cs index 3ad9af8..061d861 100644 --- a/TIASshot/Lucam.cs +++ b/TIASshot/Lucam.cs @@ -18,6 +18,8 @@ using System.Windows.Controls; using System.IO; using static System.Resources.ResXFileRef; +using System.Windows.Shapes; +using Path = System.IO.Path; namespace TIASshot { @@ -58,6 +60,7 @@ int _detectionCount = 0; Point2f _lastPosition = new Point2f(0, 0); Mat _convRGB2SRGB; + Mat _tccRois; // TCCのROI検出結果画像 /// /// コンストラクタ @@ -73,7 +76,7 @@ RefRGB = Config.GetFloat("ReferenceValue"); UpdateRate = Config.GetFloat("UpdateRate"); - TCC_SRGB = LoadMatFromCsv(Config.GetString("TccTableCsvSrgb")); + TCC_SRGB = LoadMatFromCsv(Config.GetString("TccSrgbTableFile")); // カメラパラメータの初期値 _snap.BufferLastFrame = false; @@ -118,7 +121,7 @@ return false; } if (TCC_SRGB is null) { - ErrorMsg = $"ファイル({Config.GetString("TccTableCsvSrgb")})の読み込みに失敗しました.\r\n終了します."; + ErrorMsg = $"ファイル({Config.GetString("TccSrgbTableFile")})の読み込みに失敗しました.\r\n終了します."; return false; } @@ -239,6 +242,7 @@ // チャートマスク作成 _chartMasks.Clear(); var roiSize = ptsPict.Count < 8 ? 60 : 80; + _tccRois = img.Clone(); for (int i = 0; i < 24; i++) { var row = i % 6; var col = i / 6; @@ -247,14 +251,12 @@ var roi = new Rect(x, y, roiSize, roiSize); using (var mask = new Mat(1545, 810, MatType.CV_8U)) { Cv2.Rectangle(mask, roi, new Scalar(255), Cv2.FILLED); - var maskF = new Mat(img.Size(), MatType.CV_8U); + var maskF = new Mat(_tccRois.Size(), MatType.CV_8U); Cv2.WarpPerspective(mask, maskF, matH, maskF.Size()); _chartMasks.Add(maskF); - img.SetTo(new Scalar(0, 200, 0), maskF); + _tccRois.SetTo(new Scalar(0, 200, 0), maskF); } } - Cv2.ImWrite("チャート検出結果.jpg", img); - Debug.WriteLine("チャート検出結果.jpg 保存"); _form.ShowMessage("舌診チャート検出 校正中"); _calibrating = Config.GetInt("CalibrationFrames"); @@ -284,10 +286,7 @@ } _calibrating--; if (_calibrating == 0) { - _convRGB2SRGB = CalcConvertMatrix(imgt, TCC_SRGB); - _form.ShowMessage("自動校正完了"); - _form.EnableShots(); - _calibrated = true; + CalcTcc(imgt); } } @@ -301,6 +300,20 @@ if (_bmps[_bmpIndex] != null) _bmps[_bmpIndex].Dispose(); } + private void CalcTcc(Mat img) { + _convRGB2SRGB = CalcConvertMatrix(img, TCC_SRGB); + + // データ保存 + var folder = GetSaveFolder("校正"); + Cv2.ImWrite(Path.Combine(folder, Config.GetString("TccSaveFile")), img); + Cv2.ImWrite(Path.Combine(folder, Config.GetString("TccRoisFile")), _tccRois); + SaveMatToCsv(Path.Combine(folder, Config.GetString("ConvSrgbSaveFile")), _convRGB2SRGB); + + _form.ShowMessage("自動校正完了"); + _form.EnableShots(); + _calibrated = true; + } + /// /// 変換行列算出 /// @@ -458,6 +471,17 @@ } /// + /// Matをcsvファイルに保存 + /// + /// + /// + private void SaveMatToCsv(string csvFile, Mat m) { + using (var writer = new StreamWriter(csvFile)) { + writer.Write(m.Dump(FormatType.CSV)); + } + } + + /// /// 画像の色変換 /// /// @@ -508,6 +532,23 @@ } /// + /// 保存フォルダの取得 + /// + /// + /// + private string GetSaveFolder(string note) { + var dt = DateTime.Now; + var paths = new List() { + Config.GetString("SaveFolder"), + dt.ToString("yyyy-MM-dd"), + dt.ToString("HH_mm_ss") + $"-{note}", + }; + var path = Path.Combine(paths.ToArray()); + Directory.CreateDirectory(path); + return path; + } + + /// /// カメラ切断 /// public void Disconnect() { diff --git a/TIASshot/config.xml b/TIASshot/config.xml index 2c4d0f7..3f8544b 100644 --- a/TIASshot/config.xml +++ b/TIASshot/config.xml @@ -15,6 +15,9 @@ 1000 4.0 30 - tcc_srgb.csv + tcc_srgb.csv + tcc.png + tcc_rois.jpg + conv_mat_srgb.csv C:\TIAS_Data