From 7880d5bced4348e4aff65958d98ee88daaf5afd9 Mon Sep 17 00:00:00 2001 From: DucDangAnh Date: Mon, 22 Jun 2020 10:17:06 +0700 Subject: [PATCH] Project - Add CantConnectCamera.jpg. AppConstant: Add CAMERA_FAILED_IMAGE_PATH. Camera: Add Event OnOpenVideoStreamFailed. LaneIn: Add Event handler for OnOpenVideoStreamFailed --- .../AIParkingApplication.csproj | 4 +++ .../AIParkingApplicationForm.Designer.cs | 27 ++++++++++++++++++ .../AIParkingApplicationForm.cs | 14 ++++++++- AIParkingApplication/AppConstant.cs | 2 ++ AIParkingApplication/Camera.cs | 5 +++- .../Images/CantConnectCamera.jpg | Bin 0 -> 53761 bytes AIParkingApplication/LaneIn.cs | 26 +++++++++++++++-- 7 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 AIParkingApplication/Images/CantConnectCamera.jpg diff --git a/AIParkingApplication/AIParkingApplication.csproj b/AIParkingApplication/AIParkingApplication.csproj index de9bf7d..29788a1 100644 --- a/AIParkingApplication/AIParkingApplication.csproj +++ b/AIParkingApplication/AIParkingApplication.csproj @@ -139,6 +139,9 @@ + + PreserveNewest + PreserveNewest @@ -146,6 +149,7 @@ PreserveNewest + diff --git a/AIParkingApplication/AIParkingApplicationForm.Designer.cs b/AIParkingApplication/AIParkingApplicationForm.Designer.cs index 7344900..6c3bde7 100644 --- a/AIParkingApplication/AIParkingApplicationForm.Designer.cs +++ b/AIParkingApplication/AIParkingApplicationForm.Designer.cs @@ -28,13 +28,37 @@ /// private void InitializeComponent() { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // + // button1 + // + this.button1.Location = new System.Drawing.Point(840, 223); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(840, 267); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 0; + this.button2.Text = "button1"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // // AIParkingApplicationForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1350, 729); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); this.MinimumSize = new System.Drawing.Size(1366, 768); this.Name = "AIParkingApplicationForm"; this.Text = "AIParking Application"; @@ -43,6 +67,9 @@ } #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; } } diff --git a/AIParkingApplication/AIParkingApplicationForm.cs b/AIParkingApplication/AIParkingApplicationForm.cs index f0f794c..5440bba 100644 --- a/AIParkingApplication/AIParkingApplicationForm.cs +++ b/AIParkingApplication/AIParkingApplicationForm.cs @@ -4,14 +4,26 @@ namespace AIParkingApplication { public partial class AIParkingApplicationForm : Form { + //@"C:\CongRa_1.mp4"; @"C:\HS_test.mp4"; @"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov" + LaneIn laneIn = new LaneIn(@"C:\HS_test.mp4", @"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov", true, false, false); public AIParkingApplicationForm() { InitializeComponent(); - LaneIn laneIn = new LaneIn(@"C:\HS_test.mp4", @"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov", true, true); //@"C:\CongRa_1.mp4"; + //LaneIn laneOut = new LaneIn(); Controls.Add(laneIn); //laneOut.Location = new System.Drawing.Point(550, 0); //Controls.Add(laneOut); } + + private void button1_Click(object sender, System.EventArgs e) + { + laneIn.Stop(); + } + + private void button2_Click(object sender, System.EventArgs e) + { + laneIn.Start(); + } } } diff --git a/AIParkingApplication/AppConstant.cs b/AIParkingApplication/AppConstant.cs index d189532..e447052 100644 --- a/AIParkingApplication/AppConstant.cs +++ b/AIParkingApplication/AppConstant.cs @@ -7,5 +7,7 @@ public const string ERROR_TITLE = "Lỗi"; public const string DATETIME_FORMAT = "HH:mm:ss dd/MM/yyyy"; #endregion + + public const string CAMERA_FAILED_IMAGE_PATH = @"Images\CantConnectCamera.jpg"; } } diff --git a/AIParkingApplication/Camera.cs b/AIParkingApplication/Camera.cs index c162a69..e523295 100644 --- a/AIParkingApplication/Camera.cs +++ b/AIParkingApplication/Camera.cs @@ -4,6 +4,7 @@ using System.Threading; namespace AIParkingApplication { public delegate void CameraEvent(Mat videoFrame); + public class Camera { private string streamUrl; @@ -12,6 +13,7 @@ namespace AIParkingApplication public event CameraEvent OnVideoFrameReceived; public event CameraEvent OnOneVideoFrameRequested; + public event CameraEvent OnOpenVideoStreamFailed; public Camera(string streamUrl) { @@ -43,10 +45,11 @@ namespace AIParkingApplication public void ReadVideoStream() { - VideoCapture videoCapture = new VideoCapture(); + VideoCapture videoCapture = new VideoCapture(); //TODO: Need to dispose this videoCapture? Mat videoFrame = new Mat(); if (!videoCapture.Open(streamUrl)) { + OnOpenVideoStreamFailed?.Invoke(Cv2.ImRead(AppConstant.CAMERA_FAILED_IMAGE_PATH)); return; } diff --git a/AIParkingApplication/Images/CantConnectCamera.jpg b/AIParkingApplication/Images/CantConnectCamera.jpg new file mode 100644 index 0000000000000000000000000000000000000000..769218f8bc6f3d38ecff04e5fe2fae3af505f579 GIT binary patch literal 53761 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 literal 0 HcmV?d00001 diff --git a/AIParkingApplication/LaneIn.cs b/AIParkingApplication/LaneIn.cs index b4d244a..f9fbaab 100644 --- a/AIParkingApplication/LaneIn.cs +++ b/AIParkingApplication/LaneIn.cs @@ -1,9 +1,9 @@ -using OpenCvSharp; -using OpenCvSharp.Extensions; -using System; +using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using OpenCvSharp; +using OpenCvSharp.Extensions; namespace AIParkingApplication { @@ -29,13 +29,33 @@ namespace AIParkingApplication plateCamera.OnVideoFrameReceived += PlateCameraOnVideoFrameReceived; plateCamera.OnOneVideoFrameRequested += PlateCamera_OnOneVideoFrameRequested; + plateCamera.OnOpenVideoStreamFailed += PlateCamera_OnOpenVideoStreamFailed; overviewCamera.OnVideoFrameReceived += OverviewCameraOnVideoFrameReceived; overviewCamera.OnOneVideoFrameRequested += OverviewCamera_OnOneVideoFrameRequested; + overviewCamera.OnOpenVideoStreamFailed += OverviewCamera_OnOpenVideoStreamFailed; plateProcessor = new PlateProcessor(this.isSupportSquarePlate, this.isSupportLongPlate); } + private void PlateCamera_OnOpenVideoStreamFailed(Mat videoFrame) + { + pictureBoxPlateVideo.Invoke(new Action(() => + { + pictureBoxPlateVideo.Image?.Dispose(); + pictureBoxPlateVideo.Image = videoFrame.ToBitmap(); + })); + } + + private void OverviewCamera_OnOpenVideoStreamFailed(Mat videoFrame) + { + pictureBoxOverviewVideo.Invoke(new Action(() => + { + pictureBoxOverviewImage.Image?.Dispose(); + pictureBoxOverviewVideo.Image = videoFrame.ToBitmap(); + })); + } + private void OverviewCamera_OnOneVideoFrameRequested(Mat videoFrame) { try