diff --git a/TIASshot/CameraBase.cs b/TIASshot/CameraBase.cs index 6192892..cfbd286 100644 --- a/TIASshot/CameraBase.cs +++ b/TIASshot/CameraBase.cs @@ -8,6 +8,7 @@ using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; +using System.Windows.Controls; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Aruco; @@ -17,6 +18,7 @@ // インターフェース public abstract bool Connect(); public abstract void Disconnect(); + protected abstract void Shot(int numImages=1, int interval=0); // プロパティ public string DeviceName { get; protected set; } = "Unknown"; @@ -47,6 +49,7 @@ int _detectionCount = 0; Point2f _lastPosition = new Point2f(0, 0); Mat _tccRois; // TCCのROI検出結果画像 + string _saveFolder = ""; /// @@ -82,6 +85,43 @@ } /// + /// 画像撮影1枚 + /// + public void ShotOne() { + SetSaveFolder(_form.GetDataName()); + Shot(); + _form.ShowMessage("1枚撮影 保存しました"); + } + + /// + /// 複数画像撮影 + /// + public void ShotMulti() { + SetSaveFolder(_form.GetDataName()); + Shot(_form.GetNumMultiShots(), _form.GetMultiShotsInterval()); + _form.ShowMessage("連続撮影 保存しました"); + } + + /// + /// 画像保存処理 + /// + /// + /// + protected void SaveImages(Mat img, int idx) { + + var filename = Config.GetString("ImageRgbFile"); + filename = filename.Replace("0000", $"{idx + 1:0000}"); + + Cv2.ImWrite(Path.Combine(_saveFolder, filename), img); + + using (var converted = ConvertImage(img, _convRGB2SRGB)) { + filename = Config.GetString("ImageSrgbFile"); + filename = filename.Replace("0000", $"{idx + 1:0000}"); + Cv2.ImWrite(Path.Combine(_saveFolder, filename), converted); + } + } + + /// /// チャートの検出 /// /// @@ -174,12 +214,12 @@ Debug.WriteLine($"RGB→SRGB 変換行列の誤差 = {diff:.000}"); // データ保存 - 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); - SaveMatToCsv(Path.Combine(folder, Config.GetString("ConvXyzSaveFile")), _convRGB2XYZ); - SaveMatToCsv(Path.Combine(folder, Config.GetString("ConvSrgb2XyzSaveFile")), convSrgb2Xyz); + SetSaveFolder("校正"); + Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("TccSaveFile")), img); + Cv2.ImWrite(Path.Combine(_saveFolder, Config.GetString("TccRoisFile")), _tccRois); + SaveMatToCsv(Path.Combine(_saveFolder, Config.GetString("ConvSrgbSaveFile")), _convRGB2SRGB); + SaveMatToCsv(Path.Combine(_saveFolder, Config.GetString("ConvXyzSaveFile")), _convRGB2XYZ); + SaveMatToCsv(Path.Combine(_saveFolder, Config.GetString("ConvSrgb2XyzSaveFile")), convSrgb2Xyz); _form.ShowMessage("自動校正完了"); _form.EnableShots(); @@ -342,16 +382,15 @@ /// /// /// - protected string GetSaveFolder(string note) { + protected void SetSaveFolder(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; + _saveFolder = Path.Combine(paths.ToArray()); + Directory.CreateDirectory(_saveFolder); } } diff --git a/TIASshot/Form1.cs b/TIASshot/Form1.cs index b07aac2..50c4411 100644 --- a/TIASshot/Form1.cs +++ b/TIASshot/Form1.cs @@ -91,7 +91,7 @@ /// /// private void btnShot1_Click(object sender, EventArgs e) { - //_lucam.ShotOne(); + _camera.ShotOne(); } /// @@ -100,7 +100,7 @@ /// /// private void btnShotMulti_Click(object sender, EventArgs e) { - //_lucam.ShotMulti(); + _camera.ShotMulti(); } /// diff --git a/TIASshot/IScam.cs b/TIASshot/IScam.cs index 2a8b7a5..b1172ee 100644 --- a/TIASshot/IScam.cs +++ b/TIASshot/IScam.cs @@ -9,6 +9,7 @@ using OpenCvSharp.Extensions; using System.Diagnostics; using System.Drawing; +using System.Threading; namespace TIASshot { internal class IScam : CameraBase { @@ -20,6 +21,8 @@ VCDRangeProperty _whiteBalanceBlue; VCDRangeProperty _whiteBalanceGreen; VCDRangeProperty _whiteBalanceRed; + FrameQueueSink _queueSink; + FrameSnapSink _snapSink; /// /// IScamコンストラクタ @@ -48,7 +51,9 @@ return false; } - _ic.Sink = new TIS.Imaging.FrameQueueSink(Retrieve, MediaSubtypes.RGB24, 5); + _queueSink = new FrameQueueSink(Retrieve, MediaSubtypes.RGB24, 5); + _snapSink = new FrameSnapSink(MediaSubtypes.RGB24); + _ic.Sink = _queueSink; DeviceName = _ic.DeviceCurrent.Name; SerialNumber = _ic.DeviceCurrent.GetSerialNumber(); _brightness = _ic.VCDPropertyItems.Find(VCDGUIDs.VCDID_Brightness, VCDGUIDs.VCDElement_Value); @@ -125,5 +130,35 @@ return FrameQueuedResult.ReQueue; } + + /// + /// 撮影 + /// + /// + /// + protected override void Shot(int numImages = 1, int interval = 0) { + _ic.LiveStop(); + _ic.Sink = _snapSink; + _ic.LiveStart(); + + var snapSink = _ic.Sink as FrameSnapSink; + + for (int i = 0; i < numImages; i++) { + var buffer = snapSink.SnapSingle(TimeSpan.FromSeconds(5)); + + using (Mat img = Mat.FromPixelData(buffer.FrameType.Height, buffer.FrameType.Width, MatType.CV_8UC3, buffer.GetIntPtr())) { + using (Mat imgt = img.T()) { + SaveImages(imgt, i); + } + } + if (i < numImages - 1 && interval > 0) { + Thread.Sleep(interval); + } + } + + _ic.LiveStop(); + _ic.Sink = _queueSink; + _ic.LiveStart(); + } } } diff --git a/TIASshot/Lucam.cs b/TIASshot/Lucam.cs index 3b619c1..2de5dc8 100644 --- a/TIASshot/Lucam.cs +++ b/TIASshot/Lucam.cs @@ -192,29 +192,12 @@ } /// - /// 画像撮影1枚 - /// - public void ShotOne() { - Shot(); - _form.ShowMessage("1枚撮影 保存しました"); - } - - /// - /// 複数画像撮影 - /// - public void ShotMulti() { - Shot(_form.GetNumMultiShots(), _form.GetMultiShotsInterval()); - _form.ShowMessage("連続撮影 保存しました"); - } - - /// /// 撮影 /// /// /// - private void Shot(int numImages=1, int interval=0) { + protected override void Shot(int numImages=1, int interval=0) { SetSnapParam(); - var folder = GetSaveFolder(_form.GetDataName()); dll.LucamEnableFastFrames(_hCam, ref _snap); var imageSize = _snap.Format.Width * _snap.Format.Height; @@ -229,14 +212,7 @@ _snap.Format.Width, _snap.Format.Height, dll.LucamPixelFormat.PF_8, ref _convert); using (Mat img = Mat.FromPixelData(_snap.Format.Height, _snap.Format.Width, MatType.CV_8UC3, rgbImage)) { using (Mat imgt = img.T()) { - var filename = Config.GetString("ImageRgbFile"); - filename = filename.Replace("0000", $"{i + 1:0000}"); - Cv2.ImWrite(Path.Combine(folder, filename), imgt); - using (var converted = ConvertImage(imgt, _convRGB2SRGB)) { - filename = Config.GetString("ImageSrgbFile"); - filename = filename.Replace("0000", $"{i + 1:0000}"); - Cv2.ImWrite(Path.Combine(folder, filename), converted); - } + SaveImages(imgt, i); } }