/// <summary> /// Show calibration area /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnShowSampleArea_Click(object sender, EventArgs e) { if (this.ImageMat != null) { Rectangle sampleArea1, sampleArea2; sampleArea1 = new Rectangle(this.pbxImage.Image.Width / 2, this.pbxImage.Image.Height / 2, 50, 50); sampleArea2 = new Rectangle(this.pbxImage.Image.Width / 2, this.pbxImage.Image.Height / 3, 50, 50); this.ImageMat = SkinDetector.DrawSkinColorSampler(this.ImageMat, sampleArea1, sampleArea2); pbxImage.Image = this.ImageMat.ToBitmap(); } }
/// <summary> /// Calibrate skin mask and detect gesture /// </summary> /// <param name="img">Input Image</param> /// <param name="sampleArea1">Skin mask sample area 1</param> /// <param name="sampleArea2">Skin mask sample area 1</param> /// <returns>Image with debug information and detected gesture</returns> public static Mat GetGestureFromImage(Mat img, Rectangle sampleArea1, Rectangle sampleArea2) { SkinDetector skinDetector = new SkinDetector(); FingerCounter fingerCounter = new FingerCounter(); Gesture gesture = Gesture.None; if (img != null) { skinDetector.Calibrate(img, sampleArea1, sampleArea2); Mat skinMask = skinDetector.GetSkinMask(img); var newImage = fingerCounter.FindFingersCount(skinMask); img = newImage; switch (fingerCounter.NumberOfFingersRaised) { case 0: gesture = Gesture.None; break; case 1: gesture = Gesture.Pointing; break; case 2: gesture = Gesture.Sign_2; break; case 3: gesture = Gesture.Sign_3; break; case 4: gesture = Gesture.Sign_4; break; case 5: gesture = Gesture.OpenHand; break; default: break; } } Console.WriteLine(gesture.ToString()); CvInvoke.PutText(img, gesture.ToString(), new Point(50, 50), FontFace.HersheyComplex, 1, new Bgr(255, 255, 255).MCvScalar, 3); return(img); }