private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
{
lock (this)
{
if (tracker == null)
return;
if (form != null && !form.IsDisposed)
form.Image = image;
BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
ImageLockMode.ReadWrite, image.PixelFormat);
UnmanagedImage img = new UnmanagedImage(data);
tracker.ComputeOrientation = showAngle;
tracker.ProcessFrame(img);
Rectangle rect = tracker.TrackingObject.Rectangle;
UnmanagedImage hand = tracker.TrackingObject.Image;
if (hand != null && (showContour || showFingertips))
{
UnmanagedImage grayhand = Grayscale.CommonAlgorithms.BT709.Apply(hand);
blur.ApplyInPlace(grayhand);
List<IntPoint> contour = bf.FindContour(grayhand);
for (int i = 0; i < contour.Count; i++)
contour[i] += new IntPoint(rect.X, rect.Y);
List<IntPoint> peaks = kcurv.FindPeaks(contour);
if (showContour)
{
cmarker.Points = contour;
cmarker.ApplyInPlace(img);
}
if (showFingertips)
{
pmarker.Points = peaks;
pmarker.ApplyInPlace(img);
}
}
if (showRectangle)
{
RectanglesMarker marker = new RectanglesMarker(rect);
marker.ApplyInPlace(img);
}
if (showAngle)
{
LineSegment axis = tracker.TrackingObject.GetAxis(AxisOrientation.Vertical);
if (axis != null)
{
// Draw X axis
Drawing.Line(img, axis.Start.Round(), axis.End.Round(), Color.Red);
}
}
image.UnlockBits(data);
}
}