public void BinaryDilation3x3Test1()
        {
            string basePath = NUnit.Framework.TestContext.CurrentContext.TestDirectory;

            #region doc_binary_dilation_3x3
            // Let's start with one of the default
            // color test images in the framework:
            var test = new TestImages(basePath);

            // Let's get Lena's picture
            Bitmap bmp = test["lena.bmp"];

            // And transform it to a binary mask
            // using Niblack's threshold class
            var    niblack = new NiblackThreshold();
            Bitmap binary  = niblack.Apply(bmp);

            // The result can be seen below:
            // ImageBox.Show(binary);

            // Now, let's finally apply the dilation
            // filter to the binarized image below:
            var    dil3x3 = new BinaryDilation3x3();
            Bitmap result = dil3x3.Apply(binary);

            // The result can be seen below:
            // ImageBox.Show(result);
            #endregion

            //result.Save(@"C:\Projects\morpho-dilation3x3-result.png");
            //binary.Save(@"C:\Projects\morpho-dilation3x3-binary.png");
        }
Esempio n. 2
0
        public mErosionDilation()
        {
            BitmapType = mFilter.BitmapTypes.GrayscaleBT709;

            Effect = new BinaryDilation3x3();

            filter = Effect;
        }
Esempio n. 3
0
        /// <summary>
        /// Called when videoPlayer receives a new frame.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="image"></param>
        private void videoPlayer_NewFrame(object sender, ref Bitmap frame)
        {
            if (previousFrame != null)
            {
                // find the thresholded euclidian difference between two subsequent frames
                ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40);
                threshold.OverlayImage = previousFrame;
                var difference = threshold.Apply(frame);

                // only keep big blobs
                var filter = new BlobsFiltering();
                filter.CoupledSizeFiltering = true;
                filter.MinHeight            = 50;
                filter.MinWidth             = 50;
                filter.ApplyInPlace(difference);

                // dilate remaining blobs
                var dilate = new BinaryDilation3x3();
                dilate.ApplyInPlace(difference);
                dilate.ApplyInPlace(difference);
                dilate.ApplyInPlace(difference);
                dilate.ApplyInPlace(difference);

                // put this image in the thresholded picturebox
                thresholdedBox.Image = difference.Clone() as Bitmap;

                // use this as a mask for the current frame
                var mask        = new ApplyMask(difference);
                var maskedFrame = mask.Apply(frame);

                // put this image in the masked picturebox
                maskedBox.Image = maskedFrame.Clone() as Bitmap;

                // now find all moving blobs
                if (frameIndex % 10 == 0)
                {
                    var counter = new BlobCounter();
                    counter.ProcessImage(difference);

                    // only keep blobs that:
                    //     - do not overlap with known cars
                    //     - do not overlap with other blobs
                    //     - have crossed the middle of the frame
                    //     - are at least 100 pixels tall
                    var blobs    = counter.GetObjectsRectangles();
                    var newBlobs = from r in counter.GetObjectsRectangles()
                                   where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) &&
                                   !blobs.Any(b => b.IntersectsWith(r) && b != r) &&
                                   r.Top >= 240 && r.Bottom <= 480 &&
                                   r.Height >= 100
                                   select r;

                    // set up new camshift trackers for each detected blob
                    foreach (var rect in newBlobs)
                    {
                        trackers.Add(new TrackerType(rect, frameIndex, ++carIndex));
                    }
                }

                // now kill all car trackers that have expanded by too much
                trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360);

                // and kill all trackers that have lived for 30 frames
                trackers.RemoveAll(t => frameIndex - t.StartIndex > 30);

                // let all remaining trackers process the current frame
                var img = UnmanagedImage.FromManagedImage(maskedFrame);
                trackers
                .ForEach(t => t.Tracker.ProcessFrame(img));

                // remember this frame for next iteration
                previousFrame.Dispose();
                previousFrame = frame.Clone() as Bitmap;

                // draw labels on all tracked cars
                var outputFrame = frame.Clone() as Bitmap;
                trackers
                .FindAll(t => !t.Tracker.TrackingObject.IsEmpty)
                .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber));

                // return the processed frame to the video
                frame = outputFrame;
            }

            // or else just remember this frame for next iteration
            else
            {
                previousFrame = frame.Clone() as Bitmap;
            }

            frameIndex++;
        }
Esempio n. 4
0
        /// <summary>
        /// Called when videoPlayer receives a new frame.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="image"></param>
        private void videoPlayer_NewFrame(object sender, ref Bitmap frame)
        {
            // use an rgb filter to remove everything but mario's outfit
            var filter = new ColorFiltering(
                new IntRange(220, 240),
                new IntRange(200, 220),
                new IntRange(160, 180)
                );
            var filteredFrame = filter.Apply(frame);

            // convert the image to grayscale
            var gray          = new GrayscaleBT709();
            var trackingFrame = gray.Apply(filteredFrame);

            // use a threshold to make the image black & white
            var threshold = new Threshold(1);

            threshold.ApplyInPlace(trackingFrame);

            // apply agressive dilation
            var dilation = new BinaryDilation3x3();

            dilation.ApplyInPlace(trackingFrame);
            dilation.ApplyInPlace(trackingFrame);
            dilation.ApplyInPlace(trackingFrame);

            // use image to mask the original frame
            var mask        = new ApplyMask(trackingFrame);
            var maskedFrame = mask.Apply(frame);

            // is the camshift tracker still tracking mario?
            //     - the tracking object cannot be empty
            //     - the tracking rectangle has to be small
            bool isTracking = tracker.TrackingObject?.IsEmpty == false &&
                              tracker.TrackingObject?.Rectangle.Width <= 50;

            if (!isTracking)
            {
                // no - so do a blob search
                var blobSearch = new BlobCounter();
                blobSearch.FilterBlobs = true;
                blobSearch.MinHeight   = 25;
                blobSearch.MinWidth    = 25;
                blobSearch.ProcessImage(trackingFrame);
                if (blobSearch.ObjectsCount > 0)
                {
                    // assume the first blog we find is mario
                    var rectangles = blobSearch.GetObjectsRectangles();
                    var rect       = rectangles.First();

                    // use camshift to track mario from now on
                    var img = UnmanagedImage.FromManagedImage(maskedFrame);
                    tracker.SearchWindow = rect;
                    tracker.ProcessFrame(img);
                }
            }

            else
            {
                // track mario using camshift
                var img = UnmanagedImage.FromManagedImage(maskedFrame);
                tracker.ProcessFrame(img);

                // draw the reticle where mario is
                var rect = tracker.TrackingObject.Rectangle;
                rect.Inflate(30, 30);
                DrawReticle(frame, rect);
            }

            // update pictureboxes
            thresholdedBox.Image = trackingFrame;
            maskedBox.Image      = maskedFrame;

            frameIndex++;
        }
Esempio n. 5
0
        /// <summary>
        /// Called when videoPlayer receives a new frame.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="image"></param>
        private void videoPlayer_NewFrame_1(object sender, ref Bitmap frame)
        {
            //if (cmb_fuente.SelectedIndex==1)
            //{
            //    RotateBicubic filter = new RotateBicubic(90, true);
            //    frame = filter.Apply(frame);
            //}

            if (previousFrame != null)
            {
                // find the thresholded euclidian difference between two subsequent frames
                //ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40);
                ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(thr);
                threshold.OverlayImage = previousFrame;
                var difference = threshold.Apply(frame);

                // only keep big blobs
                var filter = new BlobsFiltering();
                filter.CoupledSizeFiltering = true;
                filter.MinHeight            = int.Parse(txt_tamanio2.Text);
                filter.MinWidth             = int.Parse(txt_tamanio2.Text);
                filter.ApplyInPlace(difference);



                //var sobl = new SobelEdgeDetector();
                //sobl.ApplyInPlace(difference);

                //erode image
                var erode = new Erosion3x3();
                for (int i = 0; i < int.Parse(txt_ers.Text); i++)
                {
                    erode.ApplyInPlace(difference);
                    //erode.ApplyInPlace(difference);
                    //erode.ApplyInPlace(difference);
                }

                // dilate remaining blobs
                var dilate = new BinaryDilation3x3();
                for (int i = 0; i < int.Parse(txt_dils.Text); i++)
                {
                    dilate.ApplyInPlace(difference);
                    //dilate.ApplyInPlace(difference);
                    //dilate.ApplyInPlace(difference);
                    //dilate.ApplyInPlace(difference);
                }

                // put this image in the thresholded picturebox
                thresholdedBox.Image = difference.Clone() as Bitmap;

                // use this as a mask for the current frame
                var mask        = new ApplyMask(difference);
                var maskedFrame = mask.Apply(frame);

                // put this image in the masked picturebox
                maskedBox.Image = maskedFrame.Clone() as Bitmap;

                // now find all moving blobs
                if (frameIndex % 10 == 0)
                {
                    var counter = new BlobCounter();
                    counter.ProcessImage(difference);

                    // only keep blobs that:
                    //     - do not overlap with known cars
                    //     - do not overlap with other blobs
                    //     - have crossed the middle of the frame
                    //     - are at least 100 pixels tall
                    var blobs    = counter.GetObjectsRectangles();
                    var newBlobs = from r in counter.GetObjectsRectangles()
                                   where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) &&
                                   !blobs.Any(b => b.IntersectsWith(r) && b != r) &&
                                   r.Top >= 240 && r.Bottom <= 480 &&
                                   r.Height >= int.Parse(txt_tamanio.Text)
                                   select r;

                    // set up new camshift trackers for each detected blob
                    foreach (var rect in newBlobs)
                    {
                        trackers.Add(new TrackerType(rect, frameIndex, ++carIndex));
                    }
                }

                // now kill all car trackers that have expanded by too much
                trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360);

                // and kill all trackers that have lived for 30 frames
                //trackers.RemoveAll(t => frameIndex - t.StartIndex > 30);
                trackers.RemoveAll(t => frameIndex - t.StartIndex > frames);

                // let all remaining trackers process the current frame
                var img = UnmanagedImage.FromManagedImage(maskedFrame);
                trackers
                .ForEach(t => t.Tracker.ProcessFrame(img));

                // remember this frame for next iteration
                previousFrame.Dispose();
                previousFrame = frame.Clone() as Bitmap;


                //escribir etiqueta para cada vehiculo
                var outputFrame = frame.Clone() as Bitmap;
                trackers
                .FindAll(t => !t.Tracker.TrackingObject.IsEmpty)
                .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber));


                // regresar frame procesado
                frame = outputFrame;
            }
            else
            {   // recordar para siguiente iteracion
                previousFrame = frame.Clone() as Bitmap;
            }

            frameIndex++;

            //if (previousFrame != null)
            //{
            //    // find the thresholded euclidian difference between two subsequent frames
            //    ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40);
            //    threshold.OverlayImage = previousFrame;
            //    var difference = threshold.Apply(frame);

            //    // only keep big blobs
            //    var filter = new BlobsFiltering();
            //    filter.CoupledSizeFiltering = true;
            //    filter.MinHeight = 50;
            //    filter.MinWidth = 50;
            //    filter.ApplyInPlace(difference);

            //    // dilate remaining blobs
            //    var dilate = new BinaryDilation3x3();
            //    dilate.ApplyInPlace(difference);
            //    //dilate.ApplyInPlace(difference);
            //    //dilate.ApplyInPlace(difference);
            //    //dilate.ApplyInPlace(difference);

            //    // put this image in the thresholded picturebox
            //    thresholdedBox.Image = difference.Clone() as Bitmap;

            //    // use this as a mask for the current frame
            //    var mask = new ApplyMask(difference);
            //    var maskedFrame = mask.Apply(frame);

            //    // put this image in the masked picturebox
            //    maskedBox.Image = maskedFrame.Clone() as Bitmap;

            //    // now find all moving blobs
            //    if (frameIndex % 10 == 0)
            //    {
            //        var counter = new BlobCounter();
            //        counter.ProcessImage(difference);

            //        // only keep blobs that:
            //        //     - do not overlap with known cars
            //        //     - do not overlap with other blobs
            //        //     - have crossed the middle of the frame
            //        //     - are at least 100 pixels tall
            //        var blobs = counter.GetObjectsRectangles();
            //        var newBlobs = from r in counter.GetObjectsRectangles()
            //                       where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r))
            //                          && !blobs.Any(b => b.IntersectsWith(r) && b != r)
            //                          && r.Top >= 240 && r.Bottom <= 480
            //                          && r.Height >= 100
            //                       select r;

            //        // set up new camshift trackers for each detected blob
            //        foreach (var rect in newBlobs)
            //        {
            //            trackers.Add(new TrackerType(rect, frameIndex, ++carIndex));
            //        }
            //    }

            //    // now kill all car trackers that have expanded by too much
            //    trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360);

            //    // and kill all trackers that have lived for 30 frames
            //    trackers.RemoveAll(t => frameIndex - t.StartIndex > 30);

            //    // let all remaining trackers process the current frame
            //    var img = UnmanagedImage.FromManagedImage(maskedFrame);
            //    trackers
            //        .ForEach(t => t.Tracker.ProcessFrame(img));

            //    // remember this frame for next iteration
            //    previousFrame.Dispose();
            //    previousFrame = frame.Clone() as Bitmap;


            //    // draw labels on all tracked cars
            //    var outputFrame = frame.Clone() as Bitmap;
            //    trackers
            //        .FindAll(t => !t.Tracker.TrackingObject.IsEmpty)
            //        .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber));


            //    // return the processed frame to the video
            //    frame = outputFrame;
            //}

            //// or else just remember this frame for next iteration
            //else
            //    previousFrame = frame.Clone() as Bitmap;

            //frameIndex++;
        }
Esempio n. 6
0
        private void Cap_ImageGrabbed(object sender, EventArgs e)
        {
            try
            {
                Mat imagen = new Mat();
                cap.Retrieve(imagen);
                //pb_lprptzanalitica.Image = imagen.Bitmap;

                Bitmap frame = new Bitmap(imagen.Bitmap);
                //pb_ipcam.Image = frame.Clone() as Bitmap;

                if (previousFrame != null)
                {
                    // find the thresholded euclidian difference between two subsequent frames
                    //ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40);
                    ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(thr);
                    threshold.OverlayImage = previousFrame;
                    var difference = threshold.Apply(frame.Clone() as Bitmap);

                    // only keep big blobs
                    var filter = new BlobsFiltering();
                    filter.CoupledSizeFiltering = true;
                    filter.MinHeight            = int.Parse(txt_tamanio2.Text);
                    filter.MinWidth             = int.Parse(txt_tamanio2.Text);
                    filter.ApplyInPlace(difference);



                    //var sobl = new SobelEdgeDetector();
                    //sobl.ApplyInPlace(difference);

                    //erode image
                    var erode = new Erosion3x3();
                    for (int i = 0; i < int.Parse(txt_ers.Text); i++)
                    {
                        erode.ApplyInPlace(difference);
                        //erode.ApplyInPlace(difference);
                        //erode.ApplyInPlace(difference);
                    }

                    // dilate remaining blobs
                    var dilate = new BinaryDilation3x3();
                    for (int i = 0; i < int.Parse(txt_dils.Text); i++)
                    {
                        dilate.ApplyInPlace(difference);
                        //dilate.ApplyInPlace(difference);
                        //dilate.ApplyInPlace(difference);
                        //dilate.ApplyInPlace(difference);
                    }

                    // put this image in the thresholded picturebox
                    thresholdedBox.Image = difference.Clone() as Bitmap;

                    // use this as a mask for the current frame
                    var mask        = new ApplyMask(difference);
                    var maskedFrame = mask.Apply(frame);

                    // put this image in the masked picturebox
                    maskedBox.Image = maskedFrame.Clone() as Bitmap;

                    // now find all moving blobs
                    if (frameIndex % 10 == 0)
                    {
                        var counter = new BlobCounter();
                        counter.ProcessImage(difference);

                        // only keep blobs that:
                        //     - do not overlap with known cars
                        //     - do not overlap with other blobs
                        //     - have crossed the middle of the frame
                        //     - are at least 100 pixels tall
                        var blobs    = counter.GetObjectsRectangles();
                        var newBlobs = from r in counter.GetObjectsRectangles()
                                       where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) &&
                                       !blobs.Any(b => b.IntersectsWith(r) && b != r) &&
                                       r.Top >= 240 && r.Bottom <= 480 &&
                                       r.Height >= int.Parse(txt_tamanio.Text)
                                       select r;

                        // set up new camshift trackers for each detected blob
                        foreach (var rect in newBlobs)
                        {
                            trackers.Add(new TrackerType(rect, frameIndex, ++carIndex));
                        }
                    }

                    // now kill all car trackers that have expanded by too much
                    trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360);

                    // and kill all trackers that have lived for 30 frames
                    //trackers.RemoveAll(t => frameIndex - t.StartIndex > 30);
                    trackers.RemoveAll(t => frameIndex - t.StartIndex > frames);

                    // let all remaining trackers process the current frame
                    var img = UnmanagedImage.FromManagedImage(maskedFrame);
                    trackers
                    .ForEach(t => t.Tracker.ProcessFrame(img));

                    // remember this frame for next iteration
                    previousFrame.Dispose();
                    previousFrame = frame.Clone() as Bitmap;


                    //escribir etiqueta para cada vehiculo
                    var outputFrame = frame.Clone() as Bitmap;
                    trackers
                    .FindAll(t => !t.Tracker.TrackingObject.IsEmpty)
                    .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber));


                    // regresar frame procesado
                    frame = outputFrame;
                    //pb_ipcam.Image = outputFrame;
                    pb_lprptzanalitica.Image = outputFrame;
                }
                else
                {   // recordar para siguiente iteracion
                    previousFrame = frame.Clone() as Bitmap;
                }

                frameIndex++;
            }
            catch (Exception)
            {
                MessageBox.Show("Error al decodificar video de PTZ, LPR o ANALITICA");
            }
        }
Esempio n. 7
0
        private void Detection()
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();

            if (Video.Image != null)
            {
                if (ModeList.selectedIndex == 0)
                {
                    training = 1;
                    int prev = AlphabetList.selectedIndex;
                    if (AlphabetList.selectedIndex == 26 || prev == 26)
                    {
                        label = 67;
                    }
                    else if (AlphabetList.selectedIndex == -1)
                    {
                        label = prev;
                    }
                    else
                    {
                        label = AlphabetList.selectedIndex;
                    }
                }
                else
                {
                    training = 0;
                }


                ProgressBar.Visible = true;

                ProgressBar.Value         = 0;
                ProgressBar.Maximum_Value = 9;
                ProgressBar.Value        += 1;


                CapturedBox.Image = (Bitmap)Video.Image.Clone();
                Bitmap src = new Bitmap(CapturedBox.Image);

                //skin detection
                var image  = new Rectangle(0, 0, src.Width, src.Height);
                var value  = src.LockBits(image, ImageLockMode.ReadWrite, src.PixelFormat);
                var size   = Bitmap.GetPixelFormatSize(value.PixelFormat) / 8;
                var buffer = new byte[value.Width * value.Height * size];
                Marshal.Copy(value.Scan0, buffer, 0, buffer.Length);

                System.Threading.Tasks.Parallel.Invoke(
                    () =>
                {
                    Skin_process(buffer, 0, 0, value.Width / 2, value.Height / 2, value.Width, size);
                },
                    () =>
                {
                    Skin_process(buffer, 0, value.Height / 2, value.Width / 2, value.Height, value.Width, size);
                },
                    () =>
                {
                    Skin_process(buffer, value.Width / 2, 0, value.Width, value.Height / 2, value.Width, size);
                },
                    () =>
                {
                    Skin_process(buffer, value.Width / 2, value.Height / 2, value.Width, value.Height, value.Width, size);
                }
                    );
                Marshal.Copy(buffer, 0, value.Scan0, buffer.Length);
                src.UnlockBits(value);
                SkinBox.Image = src;


                if (Skin == 1)
                {
                    ProgressBar.Value += 1;

                    //Dilation & Erosion
                    src = Grayscale.CommonAlgorithms.BT709.Apply(src);
                    BinaryDilation3x3 dilatation = new BinaryDilation3x3();
                    BinaryErosion3x3  erosion    = new BinaryErosion3x3();
                    for (int a = 1; a <= 10; a++)
                    {
                        src = dilatation.Apply(src);
                    }
                    for (int a = 1; a <= 10; a++)
                    {
                        src = erosion.Apply(src);
                    }

                    ProgressBar.Value += 1;
                    NoiseBox.Image     = src;

                    //Blob
                    try
                    {
                        ExtractBiggestBlob blob = new ExtractBiggestBlob();
                        src = blob.Apply(src);
                        x   = blob.BlobPosition.X;
                        y   = blob.BlobPosition.Y;
                        ProgressBar.Value += 1;
                    }
                    catch
                    {
                        this.Show();
                        //MessageBox.Show("Lightning conditions are not good for detecting the gestures", "Bad Lights", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                    //Merge
                    Bitmap srcImage = new Bitmap(CapturedBox.Image);
                    Bitmap dstImage = new Bitmap(src);
                    var    srcrect  = new Rectangle(0, 0, srcImage.Width, srcImage.Height);
                    var    dstrect  = new Rectangle(0, 0, dstImage.Width, dstImage.Height);
                    var    srcdata  = srcImage.LockBits(srcrect, ImageLockMode.ReadWrite, srcImage.PixelFormat);
                    var    dstdata  = dstImage.LockBits(dstrect, ImageLockMode.ReadWrite, dstImage.PixelFormat);
                    var    srcdepth = Bitmap.GetPixelFormatSize(srcdata.PixelFormat) / 8;
                    var    dstdepth = Bitmap.GetPixelFormatSize(dstdata.PixelFormat) / 8;
                    //bytes per pixel
                    var srcbuffer = new byte[srcdata.Width * srcdata.Height * srcdepth];
                    var dstbuffer = new byte[dstdata.Width * dstdata.Height * dstdepth];
                    //copy pixels to buffer
                    Marshal.Copy(srcdata.Scan0, srcbuffer, 0, srcbuffer.Length);
                    Marshal.Copy(dstdata.Scan0, dstbuffer, 0, dstbuffer.Length);

                    System.Threading.Tasks.Parallel.Invoke(
                        () =>
                    {
                        //upper-left
                        Merge_process(srcbuffer, dstbuffer, x, 0, y, 0, x + (dstdata.Width / 2), dstdata.Width / 2, y + (dstdata.Height / 2), dstdata.Height / 2, srcdata.Width, dstdata.Width, srcdepth, dstdepth);
                    },
                        () =>
                    {
                        //upper-right
                        Merge_process(srcbuffer, dstbuffer, x + (dstdata.Width / 2), dstdata.Width / 2, y, 0, x + (dstdata.Width), dstdata.Width, y + (dstdata.Height / 2), dstdata.Height / 2, srcdata.Width, dstdata.Width, srcdepth, dstdepth);
                    },
                        () =>
                    {
                        //lower-left
                        Merge_process(srcbuffer, dstbuffer, x, 0, y + (dstdata.Height / 2), dstdata.Height / 2, x + (dstdata.Width / 2), dstdata.Width / 2, y + (dstdata.Height), dstdata.Height, srcdata.Width, dstdata.Width, srcdepth, dstdepth);
                    },
                        () =>
                    {
                        //lower-right
                        Merge_process(srcbuffer, dstbuffer, x + (dstdata.Width / 2), dstdata.Width / 2, y + (dstdata.Height / 2), dstdata.Height / 2, x + (dstdata.Width), dstdata.Width, y + (dstdata.Height), dstdata.Height, srcdata.Width, dstdata.Width, srcdepth, dstdepth);
                    }
                        );

                    //Copy the buffer back to image
                    Marshal.Copy(srcbuffer, 0, srcdata.Scan0, srcbuffer.Length);
                    Marshal.Copy(dstbuffer, 0, dstdata.Scan0, dstbuffer.Length);
                    srcImage.UnlockBits(srcdata);
                    dstImage.UnlockBits(dstdata);
                    src = dstImage;
                    ProgressBar.Value += 1;
                    CropBox.Image      = src;


                    //Resize
                    ResizeBilinear resize = new ResizeBilinear(200, 200);
                    src = resize.Apply(src);
                    ProgressBar.Value += 1;

                    //Edges
                    src = Grayscale.CommonAlgorithms.BT709.Apply((Bitmap)src);
                    SobelEdgeDetector edges = new SobelEdgeDetector();
                    src = edges.Apply(src);
                    ProgressBar.Value    += 1;
                    EdgeDetectorBox.Image = src;

                    //HOEF
                    Bitmap   block      = new Bitmap(src);
                    int[]    edgescount = new int[50];
                    double[] norm       = new double[200];
                    String   text       = null;
                    int      sum        = 0;
                    int      z          = 1;
                    for (int p = 1; p <= 6; p++)
                    {
                        for (int q = 1; q <= 6; q++)
                        {
                            for (int x = (p - 1) * block.Width / 6; x < (p * block.Width / 6); x++)
                            {
                                for (int y = (q - 1) * block.Height / 6; y < (q * block.Height / 6); y++)
                                {
                                    Color colorPixel = block.GetPixel(x, y);

                                    int r = colorPixel.R;
                                    int g = colorPixel.G;
                                    int b = colorPixel.B;

                                    if (r != 0 & g != 0 & b != 0)
                                    {
                                        edgescount[z]++;
                                    }
                                }
                            }
                            z++;
                        }
                    }

                    for (z = 1; z <= 36; z++)
                    {
                        sum = sum + edgescount[z];
                    }
                    for (z = 1; z <= 36; z++)
                    {
                        norm[z] = (double)edgescount[z] / sum;
                        text    = text + " " + z.ToString() + ":" + norm[z].ToString();
                    }

                    if (training == 1)
                    {
                        File.AppendAllText(@"D:\train.txt", label.ToString() + text + Environment.NewLine);
                        ProgressBar.Value += 1;
                    }
                    else
                    {
                        File.WriteAllText(@"D:\test.txt", label.ToString() + text + Environment.NewLine);
                        ProgressBar.Value += 1;


                        //SVM
                        Problem   train     = Problem.Read(@"D:\train.txt");
                        Problem   test      = Problem.Read(@"D:\test.txt");
                        Parameter parameter = new Parameter()
                        {
                            C     = 32,
                            Gamma = 8
                        };
                        Model model = Training.Train(train, parameter);
                        Prediction.Predict(test, @"D:\result.txt", model, false);
                        int value1 = Convert.ToInt32(File.ReadAllText(@"D:\result.txt"));


                        String alphabet = null;
                        if (value1 == 27)
                        {
                            alphabet += "Welcome  ";
                        }

                        else if (value1 == 28)
                        {
                            alphabet += "Good Morning";
                        }
                        else if (value1 == 29)
                        {
                            alphabet += "Thank You";
                        }
                        else
                        {
                            alphabet += (char)(65 + value1);
                        }


                        OutputText.Text = alphabet;
                        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
                        speechSynthesizer.SetOutputToDefaultAudioDevice();
                        speechSynthesizer.Volume = 100;
                        speechSynthesizer.Rate   = -2;
                        speechSynthesizer.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Child);
                        speechSynthesizer.SpeakAsync(alphabet);

                        if (alphabet == " ")
                        {
                            speechSynthesizer.SpeakAsync(OutputText.Text);
                        }
                        ProgressBar.Value += 1;
                    }
                }
                else
                {
                    this.Show();
                }
                watch.Stop();
                var   time = (watch.ElapsedMilliseconds);
                float secs = (float)time / 1000;
                ExecutionTimeBox.Text = Convert.ToString(secs) + " " + "Seconds";
            }
        }