static public RectInt?FläceAusGbsAstInfoMitVonParentErbe( UINodeInfoInTree gbsAstInfo) { if (null == gbsAstInfo) { return(null); } var Grööse = gbsAstInfo.Grööse; var MiteLaage = gbsAstInfo.LaagePlusVonParentErbeLaage() + (Grööse * 0.5); if (!Grööse.HasValue || !MiteLaage.HasValue) { return(null); } return(RectInt.FromCenterAndSize( MiteLaage.Value.AlsVektor2DInt(), Grööse.Value.AlsVektor2DInt())); }
public IEnumerable <KeyValuePair <string, ImagePatternMatch> > SetMatchInImage(KeyValuePair <UInt32[], int> raster) { if (null == raster.Key) { return(null); } var rasterSizeA = raster.Value; var rasterSizeB = raster.Key.Length / rasterSizeA; var setTypeIdAndPattern = setTypeSetPattern .SelectMany(typeIdAndSetPattern => typeIdAndSetPattern.Value.Select(pattern => new KeyValuePair <string, ImagePattern>(typeIdAndSetPattern.Key, pattern))) .ToArray(); var setPatternMatch = setTypeIdAndPattern .AsParallel() .Select(typeIdAndPattern => { var patternFirstElement = typeIdAndPattern.Value.ListElement.FirstOrDefault(); var patternSetOffset = typeIdAndPattern.Value.ListElement.SelectMany(elem => elem.locationOption).ToArray(); var boundRect = patternSetOffset.BoundingRectangle(); var tolerance = 0x20; var patternSetMatchLocation = new List <Vektor2DInt>(); for (int rasterLocB = Math.Max(0, (int)-boundRect.Min1); rasterLocB < rasterSizeB - Math.Max(0, boundRect.Max1 + 1); rasterLocB++) { for (int rasterLocA = Math.Max(0, (int)-boundRect.Min0); rasterLocA < rasterSizeA - Math.Max(0, boundRect.Max1 + 1); rasterLocA++) { var rasterLoc = new Vektor2DInt(rasterLocA, rasterLocB); bool match = true; for (int patternElemIndex = 0; patternElemIndex < typeIdAndPattern.Value.ListElement.Length; ++patternElemIndex) { var elem = typeIdAndPattern.Value.ListElement[patternElemIndex]; var elemMatch = false; foreach (var elemLoc in elem.locationOption) { var inRasterLocation = rasterLoc + elemLoc; var rasterPixelIndex = inRasterLocation.A + inRasterLocation.B * rasterSizeA; var rasterColorAggr = raster.Key[rasterPixelIndex]; var rasterR = (rasterColorAggr >> 16) & 0xff; var rasterG = (rasterColorAggr >> 8) & 0xff; var rasterB = (rasterColorAggr >> 0) & 0xff; var ColorConstraint = elem.ColorConstraintDelegate; if (null == ColorConstraint) { var DiffR = Math.Abs(rasterR - elem.ColorR); var DiffG = Math.Abs(rasterG - elem.ColorG); var DiffB = Math.Abs(rasterB - elem.ColorB); if (!(tolerance < DiffR || tolerance < DiffG || tolerance < DiffB)) { elemMatch = true; } } else { elemMatch = ColorConstraint((int)rasterR, (int)rasterG, (int)rasterB); } if (elemMatch) { break; } } if (!elemMatch) { match = false; break; } } if (match) { patternSetMatchLocation.Add(rasterLoc); } } } return(new KeyValuePair <string, IEnumerable <ImagePatternMatch> >(typeIdAndPattern.Key, patternSetMatchLocation.Select(matchLocation => new ImagePatternMatch() { SourcePatternId = typeIdAndPattern.Value.Id, Area = RectInt.FromCenterAndSize(matchLocation, new Vektor2DInt()), }))); }) .ToArray(); var setTypeIdAndSetMatchAggregated = setPatternMatch .GroupBy(typeIdAndSetMatch => typeIdAndSetMatch.Key) .Select(group => new KeyValuePair <string, ImagePatternMatch[]>(group.Key, group.Values().ConcatNullable().PatternMatchLocationAggregated(4).ToArray())) .ToArray(); return (setTypeIdAndSetMatchAggregated .SelectMany(typeIdAndSetMatchAggregated => typeIdAndSetMatchAggregated.Value .Select(match => new KeyValuePair <string, ImagePatternMatch>(typeIdAndSetMatchAggregated.Key, match)))); }
public void LocatePattern_InImage() { var listTestCase = setTestCase.OrderBy(testCase => testCase.FileName.RegexMatchSuccessIgnoreCase(Regex.Escape(testCaseFirst)) ? 0 : 1).ToArray(); var setTestCaseDuration = new List <KeyValuePair <LocatePatternTestCase, int> >(); foreach (var testCase in listTestCase) { var testCaseStopwatch = Stopwatch.StartNew(); try { var filePath = System.IO.Path.IsPathRooted(testCase.FileName) ? testCase.FileName : DirectoryPath.PathToFilesysChild(testCase.FileName); var raster = filePath.RasterFromFilePath(); var setMatch = service?.RequestSetMatchFromRaster(raster) ?.Select(match => new KeyValuePair <string, ImageProcessing.ImagePatternMatch>(match.SourcePatternId, match)) ?.ToArray(); var setMatchGroup = setMatch .GroupBy(match => match.Key) .ToArray(); var setTypeId = testCase.setTypeMatch.Select(typeMatch => typeMatch.Key) .ConcatNullable(setMatch.Keys()) .Except(testCase.setTypeIdIgnore.EmptyIfNull()) .Distinct() .ToArray(); foreach (var typeId in setTypeId) { try { var testCaseType = testCase.setTypeMatch?.FirstOrDefault(typeMatch => typeMatch.Key == typeId); var typeSetMatch = setMatchGroup?.FirstOrDefault(group => group.Key == typeId); foreach (var locationExpected in (testCaseType?.Value).EmptyIfNull()) { var tolerance = patternTypeLocationTolerance.TryGetValueOrDefault(typeId); var regionExpected = RectInt.FromCenterAndSize(locationExpected, tolerance); var inRegionLocation = typeSetMatch?.Values().Where(c => regionExpected.ContainsPointForMinInclusiveAndMaxInclusive(c.Area.Center())).ToArray(); if (!(0 < inRegionLocation?.Length)) { throw new System.Exception("no match at " + locationExpected.ToString()); } } Assert.AreEqual(testCaseType?.Value?.Length, typeSetMatch?.Count(), "count"); } catch (System.Exception Exception) { throw new System.Exception("type " + typeId, Exception); } } setTestCaseDuration.Add(new KeyValuePair <LocatePatternTestCase, int>(testCase, (int)testCaseStopwatch.ElapsedMilliseconds)); } catch (System.Exception Exception) { throw new System.Exception("test case " + testCase.FileName, Exception); } } var testCaseDurationLongest = setTestCaseDuration.OrderByDescending(t => t.Value).First(); if (4444 < testCaseDurationLongest.Value) { throw new System.Exception("test case " + testCaseDurationLongest.Key.FileName + " took " + testCaseDurationLongest.Value + "ms"); } }