AIParkingApplication/AIParkingApplication/Camera.cs

79 lines
2.1 KiB
C#

using OpenCvSharp;
using System.Threading;
namespace AIParkingApplication
{
public delegate void CameraEvent(Mat videoFrame);
public class Camera
{
private string streamUrl;
private volatile bool isFrameRequested;
private Thread readStreamThread;
public event CameraEvent OnVideoFrameReceived;
public event CameraEvent OnOneVideoFrameRequested;
public Camera(string streamUrl)
{
this.streamUrl = streamUrl;
isFrameRequested = false;
readStreamThread = new Thread(new ThreadStart(ReadVideoStream));
readStreamThread.IsBackground = true;
}
~Camera()
{
Stop();
}
public void Start()
{
if (!readStreamThread.IsAlive)
{
readStreamThread = new Thread(new ThreadStart(ReadVideoStream));
readStreamThread.IsBackground = true;
readStreamThread.Start();
}
}
public void RequestCaptureOneFrame()
{
isFrameRequested = true;
}
public void ReadVideoStream()
{
VideoCapture videoCapture = new VideoCapture();
Mat videoFrame = new Mat();
if (!videoCapture.Open(streamUrl))
{
return;
}
while (true)
{
Thread.Sleep(50); //Stream Thread Sleep
//Thread.Sleep(40); //Video Thread Sleep
if (videoCapture.Read(videoFrame) && videoFrame.Width > 0 && videoFrame.Height > 0)
{
OnVideoFrameReceived?.Invoke(videoFrame);
if (isFrameRequested)
{
OnOneVideoFrameRequested?.Invoke(videoFrame);
isFrameRequested = false;
}
}
}
}
public void Stop()
{
if (readStreamThread.IsAlive)
{
readStreamThread.Abort();
}
}
}
}