/// <summary> /// Handles all the drawing on the image /// </summary> /// <param name="p_imgData"></param> protected override void doWork(object p_imgData) { if (((ImageData)p_imgData).ConvexDefects != null) { List <Point> convexHull = ((ImageData)p_imgData).ConvexHull; List <Point> contour = ((ImageData)p_imgData).Contour; List <ConvexDefect> convexDefects = ((ImageData)p_imgData).ConvexDefects; List <Point> fingerTips = ((ImageData)p_imgData).FingerTips; MotionGestureProcessing.ImageData.Gestures gesture = ((ImageData)p_imgData).Gesture; byte[] buffer; BitmapData data = BitmapManip.lockBitmap(out buffer, ((ImageData)p_imgData).Image); drawOrientation(data, buffer, ((ImageData)p_imgData).EigenVectors, ((ImageData)p_imgData).Center); drawLines(ref data, ref buffer, convexHull, Color.Yellow); drawLines(ref data, ref buffer, contour, Color.Blue); drawDefects(ref data, ref buffer, convexDefects, Color.Orange); drawFingers(ref data, ref buffer, fingerTips, 20, Color.Red); drawGesture(ref data, ref buffer, gesture); BitmapManip.unlockBitmap(ref buffer, ref data, ((ImageData)p_imgData).Image); ((ImageData)p_imgData).Image.Save("Final.jpg"); } Processing.getInstance().ToReturnImage = (ImageData)p_imgData; }
/// <summary> /// Runs through some defaults for determining gesture /// </summary> /// <param name="p_convexDefects"></param> /// <param name="p_fingerTips"></param> /// <returns>Gesture represented</returns> private MotionGestureProcessing.ImageData.Gestures deriveGesture(ref List <ConvexDefect> p_convexDefects, ref List <Point> p_fingerTips) { int max; ConvexDefect maxDefect; MotionGestureProcessing.ImageData.Gestures gesture = ImageData.Gestures.INITIALIZING; switch (p_convexDefects.Count) { case 0: gesture = ImageData.Gestures.CLICKANDHOLD; break; case 1: gesture = ImageData.Gestures.CLICKANDHOLD; break; case 2: gesture = ImageData.Gestures.DOUBLECLICK; break; case 3: if (m_thumbPos != 0) { gesture = parse3Defect(ref p_convexDefects, ref p_fingerTips); } break; case 4: if (p_fingerTips.Count == 5 && m_thumbPos == 0) { max = (int)p_convexDefects.Max(x => x.Area); maxDefect = p_convexDefects.Where(cd => (int)cd.Area == max).ToList().First(); if (maxDefect.Equals(p_convexDefects[0])) { m_thumbPos = -1; } else { m_thumbPos = 1; } } gesture = ImageData.Gestures.MOVE; break; default: throw new Exception("more than 4 defects"); } if (m_thumbPos == 0) { gesture = ImageData.Gestures.INITIALIZING; } return(gesture); }
/// <summary> /// This get the gesture of the hand /// </summary> /// <param name="p_imgData"></param> protected override async void doWork(Object p_imgData) { if (((ImageData)p_imgData).ConvexDefects != null) { MotionGestureProcessing.ImageData.Gestures gesture = ImageData.Gestures.INITIALIZING; List <ConvexDefect> convexDefects = ((ImageData)p_imgData).ConvexDefects; List <Point> fingerTips = ((ImageData)p_imgData).FingerTips; ((ImageData)p_imgData).Gesture = deriveGesture(ref convexDefects, ref fingerTips); } else { m_thumbPos = 0; } //writeGesture(gesture); Processing.getInstance().ToDrawingImage = (ImageData)p_imgData; }