コード例 #1
0
ファイル: SkeletonTest.cs プロジェクト: gregmeess/csharp-libs
        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));
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
ファイル: Extractor.cs プロジェクト: sduxz/FingerDroid
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
ファイル: Extractor.cs プロジェクト: TristramN/SourceAFIS
        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);
        }
コード例 #6
0
ファイル: SkeletonTest.cs プロジェクト: gregmeess/csharp-libs
        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));
        }
コード例 #7
0
ファイル: SkeletonTest.cs プロジェクト: gregmeess/csharp-libs
        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));
        }
コード例 #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));
        }
コード例 #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);
        }
コード例 #10
0
ファイル: PolygonEx.cs プロジェクト: cs-util/GeometryEx
        /// <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());
        }
コード例 #11
0
ファイル: SkeletonTest.cs プロジェクト: gregmeess/csharp-libs
        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));
        }
コード例 #12
0
ファイル: StraightSkeleton.cs プロジェクト: visose/Extensions
    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;
        }
                                     ));
    }
コード例 #13
0
ファイル: SkeletonTest.cs プロジェクト: gregmeess/csharp-libs
        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));
        }
コード例 #14
0
        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;
                }
            }
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
        }
コード例 #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));
        }
コード例 #19
0
ファイル: Extractor.cs プロジェクト: sduxz/FingerDroid
        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);
        }
コード例 #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));
            }
        }
コード例 #21
0
ファイル: Extractor.cs プロジェクト: TristramN/SourceAFIS
        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);
        }