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);
}
}