Esempio n. 1
0
        public void SkeletonTestB2()
        {
            var polygon = new List <Vector2d>
            {
                new Vector2d(0.0, 0.0),
                new Vector2d(0.7904833761549828, 8.520486967607015),
                new Vector2d(5.9784187896622765, 8.712497973425755),
                new Vector2d(5.952691051656153, -2.6355979260182156),
                new Vector2d(4.56691002966568, -2.632456164967797),
                new Vector2d(4.560358563022897, -5.522203838843264),
                new Vector2d(6.0435692076276695, -5.525566487718182),
                new Vector2d(6.038049999391761, -7.960001358480875),
                new Vector2d(9.886846028339992, -7.968727126560646),
                new Vector2d(9.902081573249141, -1.2485706833316517),
                new Vector2d(13.74221500483584, -1.2572768087712447),
                new Vector2d(13.754007176546189, 3.944062400003698),
                new Vector2d(9.194585721122445, 3.9543992526641416),
                new Vector2d(9.840828592998651, 10.391220834155359),
                new Vector2d(-0.24573045314637643, 10.433085818392197)
            };


            var expected = new List <Vector2d>
            {
                new Vector2d(0.311377, 9.026957),
                new Vector2d(0.732142, 9.474000),
                new Vector2d(6.008508, -4.080606),
                new Vector2d(6.810341, 9.573824),
                new Vector2d(7.394289, -4.083747),
                new Vector2d(7.498680, 2.423725),
                new Vector2d(7.813149, 8.564560),
                new Vector2d(7.923726, -3.556706),
                new Vector2d(7.933442, 0.729015),
                new Vector2d(7.966811, -6.039966),
                new Vector2d(7.972330, -3.605531),
                new Vector2d(8.562422, 1.355149),
                new Vector2d(11.147441, 1.349289)
            };

            expected.AddRange(polygon);


            var sk = SkeletonBuilder.Build(polygon);


            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
        private void BuildSkeleton(Transform root)
        {
            var position = root.position;

            root.position = Vector3.zero;

            try
            {
                // hips -> spine -> chest
                var builder = new SkeletonBuilder(root);
                builder.AddHips(0.8f, 0.2f);
                builder.AddSpine(0.1f);
                builder.AddChest(0.2f);
                builder.AddNeck(0.1f);
                builder.AddHead(0.2f);
                builder.AddArm(0.1f, 0.3f, 0.3f, 0.1f);
                builder.AddLeg(0.1f, 0.3f, 0.4f, 0.1f, 0.1f);

                var description = AvatarDescription.Create(builder.Skeleton);
                var animator    = GetComponent <Animator>();
                animator.avatar = description.CreateAvatar(root);

                // create SkinnedMesh for bone visualize
                var renderer = SkeletonMeshUtility.CreateRenderer(animator);

                if (m_material == null)
                {
                    m_material = new Material(Shader.Find("Standard"));
                }
                renderer.sharedMaterial = m_material;
                //root.gameObject.AddComponent<BoneMapping>();

                var transfer = GetComponent <HumanPoseTransfer>();
                if (transfer != null)
                {
                    transfer.Avatar = animator.avatar;
                    transfer.Setup();
                }
            }
            finally
            {
                // restore position
                root.position = position;
            }
        }
Esempio n. 3
0
        SkeletonBuilder ProcessSkeleton(string name, BinaryMap binary)
        {
            SkeletonBuilder skeleton = null;

            DetailLogger.RunInContext(name, delegate()
            {
                Logger.Log("Binarized", binary);
                BinaryMap thinned = Thinner.Thin(binary);
                skeleton          = new SkeletonBuilder();
                RidgeTracer.Trace(thinned, skeleton);
                DotRemover.Filter(skeleton);
                PoreRemover.Filter(skeleton);
                GapRemover.Filter(skeleton);
                TailRemover.Filter(skeleton);
                FragmentRemover.Filter(skeleton);
                BranchMinutiaRemover.Filter(skeleton);
            });
            return(skeleton);
        }
        public void CanGenerateFloorFromFootprint9()
        {
            _settings.Footprint = new List <Vector2d>()
            {
                new Vector2d(731.436882019043f, 157.344799041748f),
                new Vector2d(720.060272216797f, 171.514301300049f),
                new Vector2d(715.286140441895f, 167.680201530457f),
                new Vector2d(693.210067749023f, 195.130128860474f),
                new Vector2d(697.916450500488f, 198.964233398438f),
                new Vector2d(686.742973327637f, 212.911462783813f),
                new Vector2d(682.002716064453f, 209.132928848267f),
                new Vector2d(671.777305603027f, 221.8577003479f),
                new Vector2d(670.152053833008f, 220.635232925415f),
                new Vector2d(625.593605041504f, 196.241464614868f),
                new Vector2d(627.455825805664f, 197.019395828247f),
                new Vector2d(651.055564880371f, 167.569065093994f),
                new Vector2d(646.958618164063f, 164.512901306152f),
                new Vector2d(663.955841064453f, 141.786131858826f),
                new Vector2d(668.79768371582f, 145.397968292236f),
                new Vector2d(692.363586425781f, 115.947632789612f),
                new Vector2d(719.112205505371f, 132.450933456421f),
                new Vector2d(739.867782592773f, 137.007400989532f),
                new Vector2d(726.628913879395f, 153.510699272156f),
            };
            _settings.Doors    = null;
            _settings.Skeleton = SkeletonBuilder.Build(_settings.Footprint);
            _settings.Holes    = new List <List <Vector2d> >();

            _settings.MinimalWidthStep     = 1;
            _settings.PreferedWidthStep    = 5;
            _settings.VaaSizeHeight        = 2;
            _settings.VaaSizeWidth         = 4;
            _settings.TransitAreaWidth     = 2;
            _settings.HalfTransitAreaWidth = 1;
            _settings.MinimalArea          = 4;

            // ACT
            var floor = _generator.Build(_settings);

            // ASSERT
            AssertFloor(floor);
        }
Esempio n. 5
0
        SkeletonBuilder ProcessSkeleton(string name, BinaryMap binary)
        {
            SkeletonBuilder skeleton = null;

            DetailLogger.RunInContext(name, delegate()
            {
                Logger.Log("Binarized", binary);
                BinaryMap thinned = Thinner.Thin(binary);
                skeleton          = new SkeletonBuilder();
                RidgeTracer.Trace(thinned, skeleton);

                ////Testing Start
                //var outFileDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "outputSkeletonRidgeTracer-" + name + DateTime.UtcNow.Millisecond + ".bin");
                //var file = new FileStream(outFileDir, FileMode.CreateNew);
                //var binWrite = new BinaryWriter(file);
                //binWrite.Write(skeleton.Minutiae.Count());
                //Console.WriteLine(skeleton.Minutiae.Count());
                //foreach (var minutia in skeleton.Minutiae)
                //{
                //    binWrite.Write(minutia.Valid);
                //    Console.WriteLine(minutia.Valid);
                //    binWrite.Write(minutia.Position.X);
                //    Console.WriteLine(minutia.Position.X);
                //    binWrite.Write(minutia.Position.Y);
                //    Console.WriteLine(minutia.Position.Y);
                //    binWrite.Write(minutia.Ridges.Count);
                //    Console.WriteLine(minutia.Ridges.Count);
                //}
                //binWrite.Close();
                //file.Close();
                ////Testing Finish

                DotRemover.Filter(skeleton);
                PoreRemover.Filter(skeleton);
                GapRemover.Filter(skeleton);
                TailRemover.Filter(skeleton);
                FragmentRemover.Filter(skeleton);
                BranchMinutiaRemover.Filter(skeleton);
            });
            Count++;
            return(skeleton);
        }
Esempio n. 6
0
        public void CircularAddTest()
        {
            var polygon = new List <Vector2d>
            {
                new Vector2d(50, 50),
                new Vector2d(100, 50),
                new Vector2d(100, 100),
                new Vector2d(50, 100)
            };

            var expected = new List <Vector2d> {
                new Vector2d(75.000000, 75.000000)
            };

            expected.AddRange(polygon);

            var sk = SkeletonBuilder.Build(polygon);

            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
Esempio n. 7
0
        public void SkeletonTest_hole_2()
        {
            var polygon = new List <Vector2d>
            {
                new Vector2d(0.0, 0.0),
                new Vector2d(7.087653026630875, -0.0572739636795121),
                new Vector2d(7.035244566479503, -6.5428208800475005),
                new Vector2d(-0.052408459722688594, -6.485546915224834)
            };

            var hole = new List <Vector2d>
            {
                new Vector2d(1.4849939588531493, -1.5250224044562133),
                new Vector2d(1.4341762422598874, -5.1814705083480606),
                new Vector2d(5.747532319228888, -5.241418004618678),
                new Vector2d(5.798350035536362, -1.5849699030131408)
            };

            var innerList = new List <List <Vector2d> > {
                hole
            };

            var expected = new List <Vector2d>();

            expected.AddRange(polygon);
            expected.AddRange(hole);

            expected.Add(new Vector2d(6.3821371859978875, -5.893911100019249));
            expected.Add(new Vector2d(0.7651208111455217, -5.8321836510415475));
            expected.Add(new Vector2d(0.6898242249025952, -5.755213752675646));
            expected.Add(new Vector2d(6.389576876981116, -5.886633146615758));
            expected.Add(new Vector2d(6.443747494495353, -0.9572661447277495));
            expected.Add(new Vector2d(6.310953658294117, -0.8215212379272131));
            expected.Add(new Vector2d(0.7481994722534444, -0.7603900949775717));
            expected.Add(new Vector2d(0.7446762937827887, -0.7638366801629576));

            var sk = SkeletonBuilder.Build(polygon, innerList);


            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
Esempio n. 8
0
        public void Skeleton_pickEvent()
        {
            var outer = new List <Vector2d>
            {
                new Vector2d(-1, -1),
                new Vector2d(1, -1),
                new Vector2d(1, 1),
                new Vector2d(-1, 1)
            };
            var expected = new List <Vector2d>
            {
                new Vector2d(0, 0)
            };

            expected.AddRange(outer);


            var sk = SkeletonBuilder.Build(outer, null);

            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
Esempio n. 9
0
        /// <summary>
        /// Build the node tree of the robot from Inventor
        /// </summary>
        public bool LoadRobotSkeleton(Progress <ProgressUpdate> progress = null)
        {
            try
            {
                RobotBaseNode = SkeletonBuilder.ExportSkeleton(progress);
                GC.Collect();
            }
            catch (InvalidComObjectException) // TODO: Don't do this
            {
            }
            catch (TaskCanceledException)
            {
                return(false);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return(false);
            }

            return(RobotBaseNode != null);
        }
Esempio n. 10
0
        /// <summary>
        /// Returns a List of Polygons derived from the Polygon's straight skeleton.
        /// </summary>
        /// <returns>A List of Polygons.</Line></returns>
        public static List <Polygon> Jigsaw(this Polygon polygon)
        {
            var vertices2d = new List <Vector2d>();

            foreach (var vertex in polygon.Vertices)
            {
                vertices2d.Add(new Vector2d(vertex.X, vertex.Y));
            }
            var skeleton = SkeletonBuilder.Build(vertices2d);
            var polygons = new List <Polygon>();

            foreach (var edgeResult in skeleton.Edges)
            {
                var vertices = new List <Vector3>();
                foreach (var vertex in edgeResult.Polygon)
                {
                    vertices.Add(new Vector3(vertex.X, vertex.Y, 0.0));
                }
                polygons.Add(Shaper.MakePolygon(vertices));
            }
            return(polygons.OrderBy(p => p.Centroid()).ToList());
        }
Esempio n. 11
0
        public void SkeletonTest_hole_1()
        {
            var inner = new List <Vector2d>
            {
                new Vector2d(-1, 1),
                new Vector2d(1, 1),
                new Vector2d(1, -1),
                new Vector2d(-1, -1)
            };

            var outer = new List <Vector2d>
            {
                new Vector2d(-2, -2),
                new Vector2d(2, -2),
                new Vector2d(2, 2),
                new Vector2d(-2, 2)
            };

            var innerList = new List <List <Vector2d> > {
                inner
            };

            var expected = new List <Vector2d>
            {
                new Vector2d(-1.500000, -1.500000),
                new Vector2d(-1.500000, 1.500000),
                new Vector2d(1.500000, -1.500000),
                new Vector2d(1.500000, 1.500000)
            };

            expected.AddRange(outer);
            expected.AddRange(inner);


            var sk = SkeletonBuilder.Build(outer, innerList);


            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
Esempio n. 12
0
    public static IEnumerable <Polyline> GetStraightSkeleton(Polyline polyline)
    {
        if (!polyline.IsClosed)
        {
            throw new Exception(" Polyline must be closed.");
        }

        var polygon = polyline.Select(p => p.ToVector2d()).ToList();

        polygon.RemoveAt(polygon.Count - 1);
        var skeleton = SkeletonBuilder.Build(polygon);

        //var shape = Polyline.CreateStarPolygon(new Circle(Point3d.Origin, 5), 3, 3);

        return(skeleton.Edges.Select(e =>
        {
            var region = new Polyline(e.Polygon.Select(v => v.ToPoint3d()));
            region.Add(region[0]);
            //  region.AddRange(shape);
            return region;
        }
                                     ));
    }
Esempio n. 13
0
        public void SkeletonTestB10()
        {
            var polygon = new List <Vector2d>
            {
                new Vector2d(0.0, 0.0),
                new Vector2d(23.542862199718826, -1.0957017437087124),
                new Vector2d(12.89581137652037, 1.5573908447103584),
                new Vector2d(13.68678342709616, 5.195862274901293),
                new Vector2d(30.92997412599037, 6.619611963708646),
                new Vector2d(16.53428280871175, 7.568778425199767),
                new Vector2d(13.05400578686415, 8.676139297892002),
                new Vector2d(-4.188927083681472, 7.336703572978552),
                new Vector2d(10.196014852102863, 4.475707108744242),
                new Vector2d(8.782756714583655, 1.5573908412810287)
            };


            var expected = new List <Vector2d>
            {
                new Vector2d(9.496922, 0.613365),
                new Vector2d(10.882442, 1.437594),
                new Vector2d(11.471020, 0.671521),
                new Vector2d(11.720280, 6.390569),
                new Vector2d(12.241556, 6.845124),
                new Vector2d(12.291810, 5.518617),
                new Vector2d(12.847638, 6.893686),
                new Vector2d(16.331903, 6.498860)
            };

            expected.AddRange(polygon);


            var sk = SkeletonBuilder.Build(polygon);


            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
        void Initialize()
        {
            var skeletonBuilder = new SkeletonBuilder(this.transform);

            skeletonBuilder.AddBasicSkeleton(new SkeletonBuilderParams());

            var leftHandRotation = Quaternion.Euler(0, 0, 180);

            skeletonBuilder.UpdateRotation(HumanBodyBones.LeftHand, leftHandRotation);

            var rightHandRotation = Quaternion.Euler(0, 180, 0);

            skeletonBuilder.UpdateRotation(HumanBodyBones.RightHand, rightHandRotation);

            _LeftHandOVRSkelton = _LeftOVRHand.GetComponent <OVRSkeleton>();
            AddHandSkeletonBones(skeletonBuilder, true);

            _RightHandOVRSkelton = _RightOVRHand.GetComponent <OVRSkeleton>();
            AddHandSkeletonBones(skeletonBuilder, false);

            _Skeleton = skeletonBuilder.Skeleton;

            var avatar = AvatarBuilder.BuildHumanAvatar(this.gameObject, skeletonBuilder.GetHumanDescription());

            _SrcPoseHandler = new HumanPoseHandler(avatar, this.transform);

            if (_VisualizeBones && _XYZAxisPrefab != null)
            {
                foreach (var bone in skeletonBuilder.Skeleton.Values)
                {
                    GameObject axis = GameObject.Instantiate(_XYZAxisPrefab, Vector3.zero, Quaternion.identity, bone);
                    axis.transform.localScale    = new Vector3(_AxisObjectScale, _AxisObjectScale, _AxisObjectScale);
                    axis.transform.localPosition = Vector3.zero;
                    axis.transform.localRotation = Quaternion.identity;
                }
            }
        }
        public void CanGenerateFloorFromFootprint7()
        {
            _settings.Footprint = new List <Vector2d>()
            {
                new Vector2d(299, 133),
                new Vector2d(99, 283),
                new Vector2d(227, 554),
                new Vector2d(832, 575),
                new Vector2d(971, 250),
                new Vector2d(792, 61),
            };
            _settings.Doors = new List <KeyValuePair <int, double> >()
            {
                new KeyValuePair <int, double>(1, 30)
            };
            _settings.Skeleton = SkeletonBuilder.Build(_settings.Footprint);
            _settings.Holes    = new List <List <Vector2d> >();

            // ACT
            var floor = _generator.Build(_settings);

            // ASSERT
            AssertFloor(floor);
        }
        public void CanGenerateFloorFromFootprint8()
        {
            _settings.Footprint = new List <Vector2d>()
            {
                new Vector2d(107, 62),
                new Vector2d(284, 62),
                new Vector2d(291, 322),
                new Vector2d(464, 320),
                new Vector2d(464, 168),
                new Vector2d(616, 162),
                new Vector2d(618, 309),
                new Vector2d(814, 308),
                new Vector2d(808, 40),
                new Vector2d(1003, 36),
                new Vector2d(1003, 495),
                new Vector2d(833, 503),
                new Vector2d(837, 599),
                new Vector2d(616, 604),
                new Vector2d(618, 511),
                new Vector2d(483, 509),
                new Vector2d(480, 600),
                new Vector2d(103, 601),
            };
            _settings.Doors = new List <KeyValuePair <int, double> >()
            {
                new KeyValuePair <int, double>(1, 30)
            };
            _settings.Skeleton = SkeletonBuilder.Build(_settings.Footprint);
            _settings.Holes    = new List <List <Vector2d> >();

            // ACT
            var floor = _generator.Build(_settings);

            // ASSERT
            AssertFloor(floor);
        }
        public void CanGenerateFloorFromFootprint2()
        {
            // ARRANGE
            _settings.Footprint = new List <Vector2d>()
            {
                new Vector2d(100, 80),
                new Vector2d(100, 400),
                new Vector2d(500, 400),
                new Vector2d(500, 250),
                new Vector2d(500, 100),
            };
            _settings.Doors = new List <KeyValuePair <int, double> >()
            {
                new KeyValuePair <int, double>(1, 30)
            };
            _settings.Skeleton = SkeletonBuilder.Build(_settings.Footprint);
            _settings.Holes    = new List <List <Vector2d> >();

            // ACT
            var floor = _generator.Build(_settings);

            // ASSERT
            AssertFloor(floor, 5, 4, 9, 15);
        }
Esempio n. 18
0
        public void SkeletonTest_double_split()
        {
            var outer = new List <Vector2d>
            {
                new Vector2d(-6, 0),
                new Vector2d(-3, -6),
                new Vector2d(-1, -2),
                new Vector2d(1, -2),
                new Vector2d(3, -6),
                new Vector2d(6, 0)
            };

            var expected = new List <Vector2d>(outer)
            {
                new Vector2d(-3.0000000000000004, -1.854101966249685),
                new Vector2d(-1.6180339887498951, -1.0000000000000002),
                new Vector2d(1.6180339887498951, -1.0000000000000002),
                new Vector2d(3.0000000000000004, -1.854101966249685)
            };

            var sk = SkeletonBuilder.Build(outer, null);

            SkeletonTestUtil.AssertExpectedPoints(expected, SkeletonTestUtil.GetFacePoints(sk));
        }
Esempio n. 19
0
        public TemplateBuilder Extract(byte[,] invertedImage, int dpi)
        {
            TemplateBuilder template = null;

            DpiAdjuster.Adjust(this, dpi, delegate()
            {
                byte[,] image = ImageInverter.GetInverted(invertedImage);  //图片反色,黑《--》白

                //var watch = Stopwatch.StartNew();
                //watch.Start();
                BlockMap blocks = new BlockMap(new Size(image.GetLength(1), image.GetLength(0)), BlockSize); //将图片数组转换为blockmap,对图片进行分块,方便进行并行计算
                Logger.Log("BlockMap", blocks);                                                              //可能是用于调试时的log输出
                //watch.Start();
                short[, ,] histogram = Histogram.Analyze(blocks, image);
                //watch.Stop();
                //Console.WriteLine("---------------------------histogram实例化时间:{0}",watch.ElapsedMilliseconds);
                //watch.Start();
                short[, ,] smoothHistogram = Histogram.SmoothAroundCorners(blocks, histogram);
                BinaryMap mask             = Mask.ComputeMask(blocks, histogram);
                float[,] equalized         = Equalizer.Equalize(blocks, image, smoothHistogram, mask);
                //watch.Stop();
                //Console.WriteLine("----------------------------equalized实例化时间:{0}",watch.ElapsedMilliseconds);
                byte[,] orientation = Orientation.Detect(equalized, mask, blocks);

                equalizedMap        = GdiIO.GetBitmap(ShowImage.floatToByte(equalized));
                float[,] smoothed   = RidgeSmoother.Smooth(equalized, orientation, mask, blocks);
                float[,] orthogonal = OrthogonalSmoother.Smooth(smoothed, orientation, mask, blocks);

                BinaryMap binary = Binarizer.Binarize(smoothed, orthogonal, mask, blocks);
                binary.AndNot(BinarySmoother.Filter(binary.GetInverted()));
                binary.Or(BinarySmoother.Filter(binary));
                Logger.Log("BinarySmoothingResult", binary);
                CrossRemover.Remove(binary);

                BinaryMap pixelMask = mask.FillBlocks(blocks);
                BinaryMap innerMask = InnerMask.Compute(pixelMask);

                BinaryMap inverted = binary.GetInverted();
                inverted.And(pixelMask);

                SkeletonBuilder ridges  = null;
                SkeletonBuilder valleys = null;
                Parallel.Invoke(
                    () => { ridges = ProcessSkeleton("Ridges", binary); },
                    () => { valleys = ProcessSkeleton("Valleys", inverted); });

                template                = new TemplateBuilder();
                template.OriginalDpi    = dpi;
                template.OriginalWidth  = invertedImage.GetLength(1);
                template.OriginalHeight = invertedImage.GetLength(0);

                MinutiaCollector.Collect(ridges, TemplateBuilder.MinutiaType.Ending, template);
                MinutiaCollector.Collect(valleys, TemplateBuilder.MinutiaType.Bifurcation, template);
                MinutiaMask.Filter(template, innerMask);
                StandardDpiScaling.Scale(template);
                MinutiaCloudRemover.Filter(template);
                UniqueMinutiaSorter.Filter(template);
                MinutiaSorter.Shuffle(template);
                Logger.Log("FinalTemplate", template);
                //watch.Stop();
                //Console.WriteLine("---------------------------Template实例化时间:{0}",watch.ElapsedMilliseconds);
            });
            return(template);
        }
Esempio n. 20
0
        /// <inheritdoc />
        public override List <MeshData> Build(Building building)
        {
            var roofHeight = building.RoofHeight;
            var roofOffset = building.Elevation + building.MinHeight + building.Height;

            var skeleton        = SkeletonBuilder.Build(building.Footprint);
            var roofVertexCount = 0;

            foreach (var edgeResult in skeleton.Edges)
            {
                roofVertexCount += (edgeResult.Polygon.Count - 2) * 12;
            }

            var mesh             = CreateMesh(building.Footprint);
            var floorCount       = building.Levels;
            var floorVertexCount = mesh.Triangles.Count * 3 * 2 * floorCount;

            var vertexCount = roofVertexCount + floorVertexCount;
            var planeCount  = skeleton.Edges.Count + floorCount;

            bool limitIsReached = false;

            if (vertexCount * 2 > Consts.MaxMeshSize)
            {
                vertexCount    = roofVertexCount;
                planeCount     = building.Footprint.Count;
                limitIsReached = true;
            }

            var      meshIndex = new MultiPlaneMeshIndex(planeCount + floorCount, vertexCount);
            MeshData meshData  = new MeshData(meshIndex, vertexCount);

            try
            {
                var roofGradient = CustomizationService.GetGradient(building.RoofColor);
                foreach (var edge in skeleton.Edges)
                {
                    if (edge.Polygon.Count < 5)
                    {
                        HandleSimpleCase(meshData, meshIndex, roofGradient, skeleton, edge, roofOffset, roofHeight);
                    }
                    else
                    {
                        HandleComplexCase(meshData, meshIndex, roofGradient, skeleton, edge, roofOffset, roofHeight);
                    }
                }

                if (!limitIsReached)
                {
                    // attach floors
                    AttachFloors(new RoofContext()
                    {
                        Mesh      = mesh,
                        MeshData  = meshData,
                        MeshIndex = meshIndex,

                        Bottom             = building.Elevation + building.MinHeight,
                        FloorCount         = floorCount,
                        FloorHeight        = building.Height / floorCount,
                        FloorFrontGradient = CustomizationService.GetGradient(building.FloorFrontColor),
                        FloorBackGradient  = CustomizationService.GetGradient(building.FloorBackColor),

                        IsLastRoof = false
                    });
                    return(new List <MeshData>(1)
                    {
                        meshData
                    });
                }
                var meshDataList = BuildFloors(building, building.Levels, false);
                meshDataList.Add(meshData);
                return(meshDataList);
            }
            catch
            {
                // NOTE straight skeleton may fail on some footprints.
                Trace.Warn("building.roof", Strings.RoofGenFailed, Name, building.Id.ToString());
                return(base.Build(building));
            }
        }
Esempio n. 21
0
        public TemplateBuilder Extract(byte[,] invertedImage, int dpi)
        {
            TemplateBuilder template = null;

            DpiAdjuster.Adjust(this, dpi, delegate()
            {
                byte[,] image = ImageInverter.GetInverted(invertedImage);

                BlockMap blocks = new BlockMap(new Size(image.GetLength(1), image.GetLength(0)), BlockSize);
                Logger.Log("BlockMap", blocks);
                //Testing Start
                var outFileDir  = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "bloackMapOut" + DateTime.Now.Second + ".bin");
                var outFileText = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                                               "blockMapTextOut" + DateTime.Now.Second + ".txt");
                var file      = new FileStream(outFileDir, FileMode.CreateNew);
                var binWrite  = new BinaryWriter(file);
                TextWriter tw = new StreamWriter(outFileText);
                LogSize(blocks.PixelCount, binWrite, tw, "PixelCount");
                LogSize(blocks.BlockCount, binWrite, tw, "BlockCount");
                LogSize(blocks.CornerCount, binWrite, tw, "CornerCount");
                LogRectangleC(blocks.AllBlocks, binWrite, tw, "AllBlocks");
                LogRectangleC(blocks.AllCorners, binWrite, tw, "AllCorners");
                LogPointGrid(blocks.Corners, binWrite, tw, "Corners");
                LogRectangleGrid(blocks.BlockAreas, binWrite, tw, "BlockAreas");
                LogPointGrid(blocks.BlockCenters, binWrite, tw, "BlockCenters");
                LogRectangleGrid(blocks.CornerAreas, binWrite, tw, "CornerAreas");
                binWrite.Close();
                tw.Close();
                //Testing End

                short[,,] histogram = Histogram.Analyze(blocks, image);
                ////testing
                //var outFileDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "histogramImageInput" + ".bin");
                //var file = new FileStream(outFileDir, FileMode.CreateNew);
                //var binWrite = new BinaryWriter(file);
                //binWrite.Write(image.GetLength(0));
                //binWrite.Write(image.GetLength(1));
                //for (var i = 0; i < image.GetLength(0); i++)
                //{
                //    for (var j = 0; j < image.GetLength(1); j++)
                //    {
                //        binWrite.Write(image[i, j]);
                //    }
                //}
                //binWrite.Close();
                ////End testing

                ////Testing Start
                //Count++;
                //var outFileDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "histogramOut" + Count + ".bin");
                //var outFileText = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                //    "histogramTextOut" + Count + ".txt");
                //var file = new FileStream(outFileDir, FileMode.CreateNew);
                //var binWrite = new BinaryWriter(file);
                //TextWriter tw = new StreamWriter(outFileText);
                //binWrite.Write(histogram.GetLength(0));
                //tw.WriteLine(histogram.GetLength(0));
                //binWrite.Write(histogram.GetLength(1));
                //tw.WriteLine(histogram.GetLength(1));
                //binWrite.Write(histogram.GetLength(2));
                //tw.WriteLine(histogram.GetLength(2));
                //for (var i = 0; i < histogram.GetLength(0); i++)
                //{
                //    for (var j = 0; j < histogram.GetLength(1); j++)
                //    {
                //        for (var k = 0; k < histogram.GetLength(2); k++)
                //        {
                //            binWrite.Write(histogram[i, j, k]);
                //            tw.WriteLine(histogram[i, j, k]);
                //        }
                //    }
                //}
                //binWrite.Close();
                //file.Close();
                //tw.Close();
                //Testing Finish

                //Testing Start
                //outFileDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "bloackMapOutPostHis" + DateTime.Now.Second + ".bin");
                //outFileText = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                //   "blockMapTextOutPostHis" + DateTime.Now.Second + ".txt");
                //file = new FileStream(outFileDir, FileMode.CreateNew);
                //binWrite = new BinaryWriter(file);
                //tw = new StreamWriter(outFileText);
                //LogSize(blocks.PixelCount, binWrite, tw);
                //LogSize(blocks.BlockCount, binWrite, tw);
                //LogSize(blocks.CornerCount, binWrite, tw);
                //LogRectangleC(blocks.AllBlocks, binWrite, tw);
                //LogRectangleC(blocks.AllCorners, binWrite, tw);
                //LogPointGrid(blocks.Corners, binWrite, tw);
                //LogRectangleGrid(blocks.BlockAreas, binWrite, tw);
                //LogPointGrid(blocks.BlockCenters, binWrite, tw);
                //LogRectangleGrid(blocks.CornerAreas, binWrite, tw);
                //binWrite.Close();
                //tw.Close();
                //Testing End

                short[,,] smoothHistogram = Histogram.SmoothAroundCorners(blocks, histogram);
                BinaryMap mask            = Mask.ComputeMask(blocks, histogram);
                float[,] equalized        = Equalizer.Equalize(blocks, image, smoothHistogram, mask);

                byte[,] orientation = Orientation.Detect(equalized, mask, blocks);
                float[,] smoothed   = RidgeSmoother.Smooth(equalized, orientation, mask, blocks);
                float[,] orthogonal = OrthogonalSmoother.Smooth(smoothed, orientation, mask, blocks);

                BinaryMap binary = Binarizer.Binarize(smoothed, orthogonal, mask, blocks);
                binary.AndNot(BinarySmoother.Filter(binary.GetInverted()));
                binary.Or(BinarySmoother.Filter(binary));
                Logger.Log("BinarySmoothingResult", binary);
                CrossRemover.Remove(binary);

                BinaryMap pixelMask = mask.FillBlocks(blocks);
                BinaryMap innerMask = InnerMask.Compute(pixelMask);

                BinaryMap inverted = binary.GetInverted();
                inverted.And(pixelMask);

                SkeletonBuilder ridges  = null;
                SkeletonBuilder valleys = null;

                Parallel.Invoke(
                    () => { ridges = ProcessSkeleton("Ridges", binary); },
                    () => { valleys = ProcessSkeleton("Valleys", inverted); });

                template                = new TemplateBuilder();
                template.OriginalDpi    = dpi;
                template.OriginalWidth  = invertedImage.GetLength(1);
                template.OriginalHeight = invertedImage.GetLength(0);

                MinutiaCollector.Collect(ridges, TemplateBuilder.MinutiaType.Ending, template);
                MinutiaCollector.Collect(valleys, TemplateBuilder.MinutiaType.Bifurcation, template);
                MinutiaMask.Filter(template, innerMask);
                StandardDpiScaling.Scale(template);
                MinutiaCloudRemover.Filter(template);
                UniqueMinutiaSorter.Filter(template);
                MinutiaSorter.Shuffle(template);
                Logger.Log("FinalTemplate", template);
            });
            return(template);
        }