185 lines
6.5 KiB
C#
185 lines
6.5 KiB
C#
using OpenCvSharp;
|
|
using OpenCvSharp.Extensions;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace AIParkingApplication
|
|
{
|
|
public partial class LaneIn : UserControl, ILane
|
|
{
|
|
private Camera overviewCamera;
|
|
private Camera plateCamera;
|
|
private PlateProcessor plateProcessor;
|
|
private bool isSupportSquarePlate;
|
|
private bool isSupportLongPlate;
|
|
private bool isRetryMode;
|
|
private bool isRetryModeUntilOk; //TODO: Test mode
|
|
|
|
public LaneIn(string plateStream, string overviewStream, bool isSupportSquarePlate = true, bool isSupportLongPlate = false, bool isRetryMode = false, bool isRetryModeUntilOk = false)
|
|
{
|
|
InitializeComponent();
|
|
this.isSupportSquarePlate = isSupportSquarePlate;
|
|
this.isSupportLongPlate = isSupportLongPlate;
|
|
this.isRetryMode = isRetryMode;
|
|
this.isRetryModeUntilOk = isRetryModeUntilOk;
|
|
overviewCamera = new Camera(overviewStream);
|
|
plateCamera = new Camera(plateStream);
|
|
|
|
plateCamera.OnVideoFrameReceived += PlateCameraOnVideoFrameReceived;
|
|
plateCamera.OnOneVideoFrameRequested += PlateCamera_OnOneVideoFrameRequested;
|
|
|
|
overviewCamera.OnVideoFrameReceived += OverviewCameraOnVideoFrameReceived;
|
|
overviewCamera.OnOneVideoFrameRequested += OverviewCamera_OnOneVideoFrameRequested;
|
|
|
|
plateProcessor = new PlateProcessor(this.isSupportSquarePlate, this.isSupportLongPlate);
|
|
}
|
|
|
|
private void OverviewCamera_OnOneVideoFrameRequested(Mat videoFrame)
|
|
{
|
|
try
|
|
{
|
|
pictureBoxOverviewImage.Invoke(new Action(() =>
|
|
{
|
|
pictureBoxOverviewImage.Image?.Dispose();
|
|
pictureBoxOverviewImage.Image = videoFrame.ToBitmap();
|
|
}));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"{Util.GetCurrentMethodName()}\texMessage: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private void PlateCamera_OnOneVideoFrameRequested(Mat videoFrame)
|
|
{
|
|
Task.Factory.StartNew(new Action(async () =>
|
|
{
|
|
try
|
|
{
|
|
//TODO: check size before resizing
|
|
Cv2.Resize(videoFrame, videoFrame, new Size(1280, 720));
|
|
FinalPlateResult finalPlateResult = await plateProcessor.ProcessPlate(videoFrame);
|
|
|
|
if (isRetryMode && !plateProcessor.IsPlateStringValid(finalPlateResult.PlateString))
|
|
{
|
|
if (isRetryModeUntilOk) //TODO: TestMode
|
|
{
|
|
Thread.Sleep(500);
|
|
CaptureAllCamera();
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("PlateCamera_OnOneVideoFrameRequested Retry Mode");
|
|
Thread.Sleep(1000);
|
|
overviewCamera.RequestCaptureOneFrame();
|
|
finalPlateResult = await plateProcessor.ProcessPlate(videoFrame);
|
|
}
|
|
}
|
|
|
|
lblPlateString.Invoke(new Action(() =>
|
|
{
|
|
lblPlateString.Text = finalPlateResult.PlateString;
|
|
}));
|
|
|
|
pictureBoxPlateImage.Invoke(new Action(() =>
|
|
{
|
|
pictureBoxPlateImage.Image?.Dispose();
|
|
pictureBoxPlateImage.Image = finalPlateResult.PlateImage;
|
|
}));
|
|
|
|
ShowCardInfoOnUI("224", finalPlateResult.PlateString, "Thẻ tháng", DateTime.Now.ToString(AppConstant.DATETIME_FORMAT));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"PlateCamera_OnOneVideoFrameRequested\texMessage: {ex.Message}");
|
|
}
|
|
}));
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
plateCamera.Stop();
|
|
overviewCamera.Stop();
|
|
}
|
|
|
|
public void Start()
|
|
{
|
|
plateCamera.Start();
|
|
overviewCamera.Start();
|
|
}
|
|
|
|
private void ShowCardInfoOnUI(string cardNumber, string plateString, string cardType, string cardTime)
|
|
{
|
|
lblCardNumber.Invoke(new Action(() =>
|
|
{
|
|
lblCardNumber.Text = $"Số thẻ: {cardNumber}";
|
|
}));
|
|
|
|
lblPlateString.Invoke(new Action(() =>
|
|
{
|
|
lblPlateString.Text = $"Biển số: {plateString}";
|
|
}));
|
|
|
|
lblCardType.Invoke(new Action(() =>
|
|
{
|
|
lblCardType.Text = $"Loại thẻ: {cardType}";
|
|
}));
|
|
|
|
lblCardTime.Invoke(new Action(() =>
|
|
{
|
|
lblCardTime.Text = $"Thời gian: {cardTime}";
|
|
}));
|
|
|
|
lblRecogizePlateStatus.Invoke(new Action(() =>
|
|
{
|
|
lblRecogizePlateStatus.Text = string.IsNullOrEmpty(plateString) ? "KHÔNG NHẬN DIỆN ĐƯỢC BIỂN SỐ" : $"MỜI XE {plateString} VÀO";
|
|
}));
|
|
}
|
|
|
|
private void OverviewCameraOnVideoFrameReceived(Mat videoFrame)
|
|
{
|
|
try
|
|
{
|
|
pictureBoxOverviewVideo.Invoke(new Action(() =>
|
|
{
|
|
pictureBoxOverviewVideo.Image?.Dispose();
|
|
pictureBoxOverviewVideo.Image = videoFrame.ToBitmap();
|
|
}));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"{Util.GetCurrentMethodName()}\texMessage: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private void PlateCameraOnVideoFrameReceived(Mat videoFrame)
|
|
{
|
|
try
|
|
{
|
|
pictureBoxPlateVideo.Invoke(new Action(() =>
|
|
{
|
|
pictureBoxPlateVideo.Image?.Dispose();
|
|
pictureBoxPlateVideo.Image = videoFrame.ToBitmap();
|
|
}));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"{Util.GetCurrentMethodName()}\texMessage: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private void CaptureAllCamera()
|
|
{
|
|
plateCamera.RequestCaptureOneFrame();
|
|
overviewCamera.RequestCaptureOneFrame();
|
|
}
|
|
|
|
private void button1_Click(object sender, EventArgs e)
|
|
{
|
|
CaptureAllCamera();
|
|
}
|
|
}
|
|
}
|