LaneIn - synchronous C3Device_OnNewCardReceived and PlateCamera_OnOneVideoFrameRequested

This commit is contained in:
DucDangAnh 2020-06-26 17:38:50 +07:00
parent c01b0dac8a
commit 44eb7c3ee7
3 changed files with 38 additions and 16 deletions

View File

@ -8,8 +8,10 @@ namespace AIParkingApplication
public AIParkingApplicationForm() public AIParkingApplicationForm()
{ {
InitializeComponent(); InitializeComponent();
string serverBaseAddress = "http://localhost:80/";
ApiController apiController = new ApiController(serverBaseAddress);
C3DeviceController c3Device = new C3DeviceController("192.168.1.200"); C3DeviceController c3Device = new C3DeviceController("192.168.1.200");
LaneIn laneIn = new LaneIn(1, @"C:\HS_test.mp4", @"C:\HS_test.mp4", c3Device, true, false, true); LaneIn laneIn = new LaneIn(1, @"C:\HS_test.mp4", @"C:\HS_test.mp4", c3Device, apiController, true, false, true);
//LaneIn laneOut = new LaneIn(); //LaneIn laneOut = new LaneIn();
Controls.Add(laneIn); Controls.Add(laneIn);
laneIn.Start(); laneIn.Start();

View File

@ -10,6 +10,7 @@ namespace AIParkingApplication
private string streamUrl; private string streamUrl;
private volatile bool isFrameRequested; private volatile bool isFrameRequested;
private Thread readStreamThread; private Thread readStreamThread;
public volatile Mat CurrentFrame;
public event CameraEvent OnVideoFrameReceived; public event CameraEvent OnVideoFrameReceived;
public event CameraEvent OnOneVideoFrameRequested; public event CameraEvent OnOneVideoFrameRequested;
@ -63,6 +64,7 @@ namespace AIParkingApplication
OnVideoFrameReceived?.Invoke(videoFrame); OnVideoFrameReceived?.Invoke(videoFrame);
if (isFrameRequested) if (isFrameRequested)
{ {
CurrentFrame = videoFrame;
OnOneVideoFrameRequested?.Invoke(videoFrame); OnOneVideoFrameRequested?.Invoke(videoFrame);
isFrameRequested = false; isFrameRequested = false;
} }

View File

@ -19,11 +19,13 @@ namespace AIParkingApplication
private bool isRetryMode; private bool isRetryMode;
private bool isRetryModeUntilOk; //TODO: Test mode private bool isRetryModeUntilOk; //TODO: Test mode
private C3DeviceController c3Device; private C3DeviceController c3Device;
private ApiController apiController;
public LaneIn(int doorId, public LaneIn(int doorId,
string plateStream, string plateStream,
string overviewStream, string overviewStream,
C3DeviceController c3Device, C3DeviceController c3Device,
ApiController apiController,
bool isSupportSquarePlate = true, bool isSupportSquarePlate = true,
bool isSupportLongPlate = false, bool isSupportLongPlate = false,
bool isAutoOpenDoor = true, bool isAutoOpenDoor = true,
@ -32,6 +34,7 @@ namespace AIParkingApplication
{ {
InitializeComponent(); InitializeComponent();
this.doorId = doorId; this.doorId = doorId;
this.isSupportSquarePlate = isSupportSquarePlate; this.isSupportSquarePlate = isSupportSquarePlate;
this.isSupportLongPlate = isSupportLongPlate; this.isSupportLongPlate = isSupportLongPlate;
this.isAutoOpenDoor = isAutoOpenDoor; this.isAutoOpenDoor = isAutoOpenDoor;
@ -39,6 +42,7 @@ namespace AIParkingApplication
this.isRetryModeUntilOk = isRetryModeUntilOk; this.isRetryModeUntilOk = isRetryModeUntilOk;
overviewCamera = new Camera(overviewStream); overviewCamera = new Camera(overviewStream);
plateCamera = new Camera(plateStream); plateCamera = new Camera(plateStream);
this.apiController = apiController;
this.c3Device = c3Device; this.c3Device = c3Device;
this.c3Device.OnNewCardReceived += C3Device_OnNewCardReceived; this.c3Device.OnNewCardReceived += C3Device_OnNewCardReceived;
@ -60,16 +64,31 @@ namespace AIParkingApplication
private void C3Device_OnNewCardReceived(int doorId, string cardNumber) private void C3Device_OnNewCardReceived(int doorId, string cardNumber)
{ {
//Request To Capture And Process Frame. Task.Factory.StartNew(async () =>
CaptureAllCamera();
//Request Card Info
if (isAutoOpenDoor)
{ {
if (this.doorId == doorId) plateCamera.RequestCaptureOneFrame();
await Task.Delay(500);
var videoFrame = plateCamera.CurrentFrame;
FinalPlateResult result = await ProcessFrameImage(plateProcessor, videoFrame, isRetryMode, isRetryModeUntilOk);
pictureBoxPlateImage.Invoke(new Action(() =>
{ {
c3Device.OpenDoor(doorId); pictureBoxPlateImage.Image?.Dispose();
pictureBoxPlateImage.Image = result.PlateImage;
}));
var cardValidation = await apiController.CheckCard(cardNumber);
ShowCardInfoOnUI(cardNumber, result.PlateString, cardValidation.CardType, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT));
if (isAutoOpenDoor)
{
if (this.doorId == doorId)
{
c3Device.OpenDoor(doorId);
}
} }
} });
} }
private void PlateCamera_OnOpenVideoStreamFailed(Mat videoFrame) private void PlateCamera_OnOpenVideoStreamFailed(Mat videoFrame)
@ -106,7 +125,7 @@ namespace AIParkingApplication
} }
} }
private async Task<FinalPlateResult> ProcessFrameImage(Mat frame, bool isRetryMode, bool isRetryModeUntilOk) private async Task<FinalPlateResult> ProcessFrameImage(PlateProcessor plateProcessor, Mat frame, bool isRetryMode, bool isRetryModeUntilOk)
{ {
try try
{ {
@ -144,13 +163,12 @@ namespace AIParkingApplication
private async void PlateCamera_OnOneVideoFrameRequested(Mat videoFrame) private async void PlateCamera_OnOneVideoFrameRequested(Mat videoFrame)
{ {
FinalPlateResult result = await ProcessFrameImage(videoFrame, isRetryMode, isRetryModeUntilOk); //FinalPlateResult result = await ProcessFrameImage(plateProcessor, videoFrame, isRetryMode, isRetryModeUntilOk);
pictureBoxPlateImage.Invoke(new Action(() => //pictureBoxPlateImage.Invoke(new Action(() =>
{ //{
pictureBoxPlateImage.Image?.Dispose(); // pictureBoxPlateImage.Image?.Dispose();
pictureBoxPlateImage.Image = result.PlateImage; // pictureBoxPlateImage.Image = result.PlateImage;
})); //}));
ShowCardInfoOnUI("224", result.PlateString, "Thẻ tháng", DateTime.Now.ToString(AppConstant.DATETIME_FORMAT));
} }
public void Stop() public void Stop()