Ejemplo n.º 1
0
        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()));
        }
Ejemplo n.º 2
0
        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))));
        }
Ejemplo n.º 3
0
        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");
            }
        }