コード例 #1
0
ファイル: Pyramid.cs プロジェクト: MrBarrymore/CourseWorkCV
        private static void BuildOctave(Pyramid pyramid, int index, int layers, double sigma0, double k,
                                        Mat image)
        {
            var list    = new List <PyramidMat>(layers);
            var dogList = new List <Mat>(layers);

            var sigmaPrev = sigma0;

            list.Add(new PyramidMat(image, index, 0, sigmaPrev, sigmaPrev * (1 << index)));

            for (var i = 1; i < layers; i++)
            {
                var sigmaCurrent = sigmaPrev * k;

                var prevImage    = list[list.Count - 1].GetMat();
                var currentImage = GaussBlur(prevImage, sigma0, sigmaCurrent);

                list.Add(new PyramidMat(currentImage, index, i + 1, sigmaCurrent, sigmaCurrent * (1 << index)));
                dogList.Add(Diff(currentImage, prevImage));

                sigmaPrev = sigmaCurrent;
            }

            pyramid.octaves.Add(index, list);
            pyramid.dog.Add(index, dogList);
        }
コード例 #2
0
ファイル: Pyramid.cs プロジェクト: MrBarrymore/CourseWorkCV
        public static Pyramid Build(Mat source, int layers, double sigma1, double sigma0)
        {
            if (sigma1 > sigma0)
            {
                throw new ArgumentException("sigma1 must be <= sigma0");
            }

            var image   = GaussBlur(source, sigma1, sigma0);
            var pyramid = new Pyramid(sigma0, Depth, layers);
            var k       = Math.Pow(2, 1D / layers);

            for (var i = 0; i < Depth; i++)
            {
                BuildOctave(pyramid, i, layers + Overlap, sigma0, k, image);
                var result = pyramid.octaves[i];

                if (i != Depth - 1)
                {
                    image = Downscale(result[layers].GetMat());
                }
            }

            return(pyramid);
        }