public FastHessian(float thresh, int octaves, int init_sample, IntegralImage img)
 {
     this.thresh      = thresh;
     this.octaves     = octaves;
     this.init_sample = init_sample;
     this.img         = img;
 }
        /// <summary>
        /// Получение интегрального изображения из массива температур
        /// </summary>
        public static IntegralImage FromArray(float[,] tArray, float max, float min)
        {
            IntegralImage pic = new IntegralImage(tArray.GetLength(0), tArray.GetLength(1));
            float rowsum = 0;
            for (int x = 0; x < tArray.GetLength(0); x++)
            {
                float temp = tArray[x, 0];
                temp = (float)((temp - min));
                rowsum += temp;
                pic[0, x] = rowsum;
            }

            for (int y = 1; y < tArray.GetLength(1); y++)
            {
                rowsum = 0;
                for (int x = 0; x < tArray.GetLength(0); x++)
                {
                    float temp = tArray[x, y];
                    temp = (float)((temp - min));
                    rowsum += temp;
                    pic[y, x] = rowsum + pic[y - 1, x];
                }
            }

            return pic;
        }
        private float thresh; //значение порога отсечения

        #endregion Fields

        #region Constructors

        public FastHessian(float thresh, int octaves, int init_sample, IntegralImage img)
        {
            this.thresh = thresh;
            this.octaves = octaves;
            this.init_sample = init_sample;
            this.img = img;
        }
        /// <summary>
        /// Получение интегрального изображения из bitmap
        /// </summary>
        public unsafe static IntegralImage FromImage(Bitmap image)
        {
            IntegralImage pic = new IntegralImage(image.Width, image.Height);

            float rowsum = 0;

            for (int x = 0; x < image.Width; x++)
            {
                Color c = image.GetPixel(x, 0);
                rowsum   += (cR * c.R + cG * c.G + cB * c.B) / 255f;
                pic[0, x] = rowsum;
            }


            for (int y = 1; y < image.Height; y++)
            {
                rowsum = 0;
                for (int x = 0; x < image.Width; x++)
                {
                    Color c = image.GetPixel(x, y);
                    rowsum   += (cR * c.R + cG * c.G + cB * c.B) / 255f;
                    pic[y, x] = rowsum + pic[y - 1, x];
                }
            }

            return(pic);
        }
        /// <summary>
        /// Получение интегрального изображения из массива температур
        /// </summary>
        public static IntegralImage FromArray(float[,] tArray, float max, float min)
        {
            IntegralImage pic    = new IntegralImage(tArray.GetLength(0), tArray.GetLength(1));
            float         rowsum = 0;

            for (int x = 0; x < tArray.GetLength(0); x++)
            {
                float temp = tArray[x, 0];
                temp      = (float)((temp - min));
                rowsum   += temp;
                pic[0, x] = rowsum;
            }

            for (int y = 1; y < tArray.GetLength(1); y++)
            {
                rowsum = 0;
                for (int x = 0; x < tArray.GetLength(0); x++)
                {
                    float temp = tArray[x, y];
                    temp      = (float)((temp - min));
                    rowsum   += temp;
                    pic[y, x] = rowsum + pic[y - 1, x];
                }
            }

            return(pic);
        }
        /// <summary>
        /// Строит вектор дескриптора для каждой ключевой точки указанного массива
        /// </summary>
        public void DescribeInterestPoints(List <InterestPoint> ipts, IntegralImage img)
        {
            if (ipts.Count == 0)
            {
                return;
            }
            this.img = img;

            Parallel.ForEach(ipts, ip =>
            {
                //Определить размер дескриптора
                ip.descriptorLength = 64;

                //Определить ориентацию
                GetOrientation(ip);

                //Вычислить дескриптор
                GetDescriptor(ip);
            });
        }
        /// <summary>
        /// Определение ориентации ключевых точек и поиск дескрипторов
        /// </summary>
        public static void DecribeInterestPoints(List <InterestPoint> ipts, IntegralImage img)
        {
            SURFDescriptor des = new SURFDescriptor();

            des.DescribeInterestPoints(ipts, img);
        }
        //Получить ключевые точки
        public static List <InterestPoint> getIpoints(float thresh, int octaves, int init_sample, IntegralImage img)
        {
            FastHessian fh = new FastHessian(thresh, octaves, init_sample, img);

            return(fh.getIpoints());
        }
 //Получить ключевые точки
 public static List<InterestPoint> getIpoints(float thresh, int octaves, int init_sample, IntegralImage img)
 {
     FastHessian fh = new FastHessian(thresh, octaves, init_sample, img);
     return fh.getIpoints();
 }
        /// <summary>
        /// Строит вектор дескриптора для каждой ключевой точки указанного массива
        /// </summary>
        public void DescribeInterestPoints(List<InterestPoint> ipts, IntegralImage img)
        {
            if (ipts.Count == 0) return;
            this.img = img;

            Parallel.ForEach(ipts, ip =>
            {
                //Определить размер дескриптора
                ip.descriptorLength = 64;

                //Определить ориентацию
                GetOrientation(ip);

                //Вычислить дескриптор
                GetDescriptor(ip);
            });
        }
 /// <summary>
 /// Определение ориентации ключевых точек и поиск дескрипторов
 /// </summary>
 public static void DecribeInterestPoints(List<InterestPoint> ipts, IntegralImage img)
 {
     SURFDescriptor des = new SURFDescriptor();
     des.DescribeInterestPoints(ipts, img);
 }
        /// <summary>
        /// Получение интегрального изображения из bitmap
        /// </summary>
        public static unsafe IntegralImage FromImage(Bitmap image)
        {
            IntegralImage pic = new IntegralImage(image.Width, image.Height);

            float rowsum = 0;
            for (int x = 0; x < image.Width; x++)
            {
                Color c = image.GetPixel(x, 0);
                rowsum += (cR * c.R + cG * c.G + cB * c.B) / 255f;
                pic[0, x] = rowsum;
            }

            for (int y = 1; y < image.Height; y++)
            {
                rowsum = 0;
                for (int x = 0; x < image.Width; x++)
                {
                    Color c = image.GetPixel(x, y);
                    rowsum += (cR * c.R + cG * c.G + cB * c.B) / 255f;
                    pic[y, x] = rowsum + pic[y - 1, x];
                }
            }

            return pic;
        }