private void source_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (!IsRunning || (!IsTracking && !IsDetecting))
return;
lock (syncObject)
{
Bitmap frame = eventArgs.Frame;
int width = frame.Width;
int height = frame.Height;
BitmapData data = frame.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, frame.PixelFormat);
UnmanagedImage head = new UnmanagedImage(data);
if (IsDetecting)
{
IsDetecting = false;
// Process the nose detector in the head image
Rectangle[] regions = detector.ProcessFrame(head);
if (regions.Length >= 1)
{
// Re-initialize tracker
tracker.Reset();
tracker.SearchWindow = regions[0];
tracker.ProcessFrame(head);
// Update initial position
computeCurrentPosition(width, height);
OnFaceEnter(new FaceEventArgs(currentX, currentY));
}
else
{
IsDetecting = true;
}
}
else if (IsTracking)
{
// Track the object
tracker.ProcessFrame(head);
// Get the object position
TrackingObject obj = tracker.TrackingObject;
// Update current position
computeCurrentPosition(width, height);
if (obj.IsEmpty)
{
OnFaceLeave(EventArgs.Empty);
}
else
{
OnFaceMove(new FaceEventArgs(currentX, currentY));
}
}
frame.UnlockBits(data);
}
}