diff --git a/ISCamRecorder/CvCamera.cs b/ISCamRecorder/CvCamera.cs index 7f5ec3c..b19432f 100644 --- a/ISCamRecorder/CvCamera.cs +++ b/ISCamRecorder/CvCamera.cs @@ -29,20 +29,21 @@ FrameRateCounter _Fps = new FrameRateCounter(10); // フレームレート計測 bool _Recoding = false; // 録画中フラグ List _RecFrames = new List(); // 録画画像 - string _OutputDir; + float _RecFrameRate = 0; // 録画フレームレート /// /// カメラ接続 /// /// - public bool Open() { - camera = new VideoCapture(0); + public bool Open(int id, int frameWidth, int frameHeight) { + camera = new VideoCapture(id); if (!camera.IsOpened()) { camera.Dispose(); camera = null; return false; } - + camera.FrameWidth = frameWidth; + camera.FrameHeight = frameHeight; return true; } @@ -67,19 +68,25 @@ if (camera != null) camera.Dispose(); } - public void SaveToFile(string outDir, string imageType) { + public void SaveToFile(string outDir, string imageType, string recTime) { + if (_RecFrames.Count < 1) return; var CamID = "CvCam"; Debug.WriteLine($"{CamID} starts saving with 0.0fps."); // 保存先確保 var outDir2 = Path.Combine(outDir, CamID); Directory.CreateDirectory(outDir2); - + // 動画保存準備 + var movieFile = Path.Combine(outDir, $"{CamID}_{recTime}.mp4"); + var writer = new VideoWriter(movieFile, FourCC.H264, + _RecFrameRate, _RecFrames[0].FrameImage.Size()); for (int i = 0; i < _RecFrames.Count; i++) { string strSampleTime = _RecFrames[i].FrameTime.ToString(@"HHmmss\.fff"); var fileName = $"{CamID}_{strSampleTime}.{imageType.ToLower()}"; var filePath = Path.Combine(outDir2, fileName); _RecFrames[i].FrameImage.SaveImage(filePath); + writer.Write(_RecFrames[i].FrameImage); } + writer.Release(); _RecFrames.Clear(); Debug.WriteLine($"{CamID} ends saving."); @@ -90,6 +97,7 @@ /// public void StartRecoding() { if (_RecFrames.Count > 0) _RecFrames.Clear(); + _RecFrameRate = _Fps.FrameRate; _Recoding = true; } diff --git a/ISCamRecorder/MainForm.cs b/ISCamRecorder/MainForm.cs index 3929f2c..6e74095 100644 --- a/ISCamRecorder/MainForm.cs +++ b/ISCamRecorder/MainForm.cs @@ -21,6 +21,9 @@ readonly int PLOT_YAXIS_MIN = 800; // センサー値縦軸仮最小値 readonly int PLOT_UPDATE_INTERVAL = 30; // グラフ更新時間 readonly int UI_UPDATE_INTERVAL = 2000; // UI更新時間 + readonly int CVCAMERA_ID = 0; // 追加カメラのID + readonly int CVCAMERA_WIDTH = 1920; // 追加カメラの画像幅 + readonly int CVCAMERA_HEIGHT = 1080; // 追加カメラの画像高さ private System.Threading.Timer _UITimer; // UI更新タイマー List _Cameras = new List (); // カメラオブジェクト @@ -86,7 +89,7 @@ /// OpenCVカメラスレッド /// private void CvCameraThread() { - if (!_CvCamera.Open()) return; + if (!_CvCamera.Open(CVCAMERA_ID, CVCAMERA_WIDTH, CVCAMERA_HEIGHT)) return; _CvCamera.CameraLoop(); } @@ -215,8 +218,8 @@ /// 消費メモリ量をラベルに表示 /// private void MemoryToUse() { - var memoryConsumption = _Cameras.Select(c => c.MemoryFor1SecRecoding()).Sum() - * float.Parse(TxtRecodingDulation.Text); + var memoryConsumption = (_Cameras.Select(c => c.MemoryFor1SecRecoding()).Sum() + + _CvCamera.MemoryFor1SecRecoding()) * float.Parse(TxtRecodingDulation.Text); LblRecodingMemory.Text = "消費するメモリ:" + memoryConsumption.ToString("#,0") + "MB"; if (memoryConsumption > _availablePhysicalMemory && _availablePhysicalMemory != 0) LblRecodingMemory.ForeColor = Color.Red; else LblRecodingMemory.ForeColor = Color.Black; @@ -286,7 +289,7 @@ outputDir, frameRate, movieRate, imageType, recTime)); } Task.WaitAll(tasks); - _CvCamera.SaveToFile(outputDir, imageType); + _CvCamera.SaveToFile(outputDir, imageType, recTime); // プレビューモードへ変更 _Cameras.ForEach(c => c.ChangeSink(false));