public static FingerLED FromLED(LED led, Rectangle lightBox) { FingerLED res = new FingerLED(); res.HaloBox = led.HaloBox; res.LightBox = lightBox; res.HaloColor = led.HaloColor; res.LightColor = led.LightColor; return(res); }
public GloveHand Read(Image <Bgr, Byte> src) { //double areaDiv = 55.0; var redLeds = indexLEDDetect.GetAll(src, out _lightCount).OrderByDescending(x => GeometryExt.Area(x.HaloBox)).ToList(); var blueLeds = sideLEDDetect.GetAll(src, out _lightCount).OrderByDescending(x => GeometryExt.Area(x.HaloBox)).ToList(); if (redLeds.Count == 0 && blueLeds.Count == 0) { return(null); } List <LEDBoxTuple> ledBoxes = new List <LEDBoxTuple>(); foreach (var l in blueLeds) { foreach (var box in l.LightBoxes) { ledBoxes.Add(new LEDBoxTuple(l, box)); } } ledBoxes = ledBoxes.OrderByDescending(x => GeometryExt.Area(x.box)).ToList(); GloveHand res = new GloveHand(); if (redLeds.Count >= 1) { res.IndexFinger = FingerLED.FromLED(redLeds[0], redLeds[0].MainLightBox); } double avgBigArea = 0.0; if (res.IndexFinger != null) { avgBigArea = GeometryExt.Area(res.IndexFinger.LightBox); } if (ledBoxes.Count > 0 && GeometryExt.Area(ledBoxes[0].box) > avgBigArea) { GeometryExt.Area(ledBoxes[0].box); } if (blueLeds.Count == 0) { res.SideFingers = new FingerLED[0]; //non si vedono led blu } else { List <FingerLED> splitLEDS = new List <FingerLED>(); for (int k = 0; k < ledBoxes.Count; k++) { if (res.IndexFinger == null || GeometryExt.Distance(ledBoxes[k].box, res.IndexFinger.LightBox) >= 20.0) { if (splitLEDS.Count == 0 || GeometryExt.Distance(splitLEDS[0].LightBox, ledBoxes[k].box) >= 10.0) { splitLEDS.Add(FingerLED.FromLED(ledBoxes[k].led, ledBoxes[k].box)); } } if (splitLEDS.Count == 2) { break; } } /*while (splitLEDS.Count < 2 && res.IndexFinger != null) * { * splitLEDS.Add(FingerLED.FromLED(redLeds[0], redLeds[0].MainLightBox)); * }*/ res.SideFingers = splitLEDS.ToArray(); } return(res); }