예제 #1
0
        public static Bitmap RGBfilter(Bitmap source)     // rgb 필터
        {
            ///////////// ini 객체 생성 시작 /////////////////////////////////////////////////////
            //현재 프로그램이 실행되고 있는정보 가져오기: 디버깅 모드라면 bin/debug/프로그램명.exe
            FileInfo exefileinfo = new FileInfo(@"C:\Program Files\PLOCR\PLOCR.exe");
            string   pathini     = exefileinfo.Directory.FullName.ToString();      //프로그램 실행되고 있는데 path 가져오기
            string   fileName    = @"\PLOCRconfig.ini";                            // 환경설정 파일명
            string   filePath    = pathini + fileName;                             //ini 파일 경로

            DocumentAnalysis.IniUtil ini = new DocumentAnalysis.IniUtil(filePath); // 만들어 놓았던 iniUtil 객체 생성(생성자 인자로 파일경로 정보 넘겨줌)
            //////////// ini 객체 생성 끝 /////////////////////////////////////////////////////////

            int redMin   = int.Parse(ini.GetIniValue("색상필터값", "RedMin"));
            int redMax   = int.Parse(ini.GetIniValue("색상필터값", "RedMax"));
            int greenMin = int.Parse(ini.GetIniValue("색상필터값", "GreenMin"));
            int greenMax = int.Parse(ini.GetIniValue("색상필터값", "GreenMax"));
            int blueMin  = int.Parse(ini.GetIniValue("색상필터값", "BlueMin"));
            int blueMax  = int.Parse(ini.GetIniValue("색상필터값", "BlueMax"));

            // create filter
            ColorFiltering filter = new ColorFiltering();

            // set color ranges to keep
            filter.Red   = new IntRange(redMin, redMax);
            filter.Green = new IntRange(greenMin, greenMax);
            filter.Blue  = new IntRange(blueMin, blueMax);
            Bitmap processedImage = filter.Apply(source);

            return(processedImage);
        }
        public Bitmap GetNewFrame(Bitmap source)
        {
            var newFrame = _colorFiltering.Apply(source);

            source.Dispose();
            return(newFrame);
        }
예제 #3
0
        private void CameraPanel_NewFrame(System.Drawing.Bitmap oBitmap)
        {
            #region 去除绿色以外其他色、绿色区域绘制边框
            Bitmap     objectImage = colorFilter.Apply(oBitmap);
            BitmapData objectData  = objectImage.LockBits(new Rectangle(0, 0, oBitmap.Width, oBitmap.Height),
                                                          ImageLockMode.ReadOnly, oBitmap.PixelFormat);
            UnmanagedImage grayImage = grayFilter.Apply(new UnmanagedImage(objectData));
            objectImage.UnlockBits(objectData);

            blobCounter1.ProcessImage(grayImage);
            Rectangle[] rects = blobCounter1.GetObjectsRectangles();

            if (rects.Length > 0)
            {
                Rectangle objectRect = rects[0];
                Graphics  g          = Graphics.FromImage(oBitmap);
                using (System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(160, 255, 160), 3))
                {
                    g.DrawRectangle(pen, objectRect);
                }
                g.Dispose();
            }

            UpdateObjectPicture(objectImage);
            #endregion


            //#region 去除绿色以外其他色
            //Bitmap objectImage = colorFilter.Apply(oBitmap);
            //UpdateObjectPicture(objectImage);
            //#endregion

            //Bitmap objectImage = SobelEdgeFilter.Apply(oBitmap);
            //UpdateObjectPicture(objectImage);
        }
예제 #4
0
        private void cam_NewFrame(object sender, EventArgs e)
        {
            curr_c = new Bitmap((Bitmap)source.Frame().Clone(), preBox.Size);
            if (light)
            {
                curr_br = L_brownFilter.Apply(curr_c);
            }
            else
            {
                curr_br = D_brownFilter.Apply(curr_c);
            }
            curr_gs = gs.Apply(curr_c);

            Action action = () =>
            {
                processed       = ProcessCurrentFrame();
                postBox.Image   = processed;
                preBox.Image    = curr_c;
                backBox.Image   = back;
                colourBox.Image = curr_br;
            };

            if (!this.IsDisposed && !this.Disposing)
            {
                this.Invoke(action);
            }
        }
예제 #5
0
        private Image <Gray, Byte> prepareImg3(System.Drawing.Image img, int threshold, bool invertImg)
        {
            // create filter
            ColorFiltering filter = new ColorFiltering();

            // set color ranges to keep
            //filter.Red = new AForge.IntRange(125, 255);
            //filter.Green = new AForge.IntRange(0, 95);
            //filter.Blue = new AForge.IntRange(0, 95);

            filter.Red   = new AForge.IntRange(METState.Current.target_R_min, METState.Current.target_R_max);
            filter.Green = new AForge.IntRange(METState.Current.target_G_min, METState.Current.target_G_max);
            filter.Blue  = new AForge.IntRange(METState.Current.target_B_min, METState.Current.target_B_max);


            // apply the filter
            Bitmap colorChannelImg = filter.Apply((Bitmap)img);


            temp_Image = colorChannelImg;
            Image <Gray, Byte> GrayImg = new Image <Gray, byte>((Bitmap)colorChannelImg);

            EmgImgProcssing = new ImageProcessing_Emgu();
            GrayImg         = EmgImgProcssing.Filter_Threshold2(GrayImg, threshold, invertImg).Erode(1).Dilate(1);

            return(GrayImg);
        }
예제 #6
0
        public void ProcessImage(string urlImage)       //Görüntünün işlendiği metot.
        {
            Stopwatch watch = Stopwatch.StartNew();     //Görüntünün işlenmesi sırasında süre tutulması için süre başlatılmaktadır.

            Bitmap root         = new Bitmap(urlImage); //Root Image (Default Image)
            Bitmap bmp          = new Bitmap(root);     //Resize Image
            Bitmap bmp1         = new Bitmap(root);     //Smoothing Image
            Bitmap bmp2         = new Bitmap(root);     //Color Filtering Image
            string outputstring = "";

            ///Root
            outputstring          = this.Ocr(root);
            txtNumbePlate1.Text   = outputstring;
            ptBNumberPlate1.Image = root;


            //Resize Image to : 1920x1080
            outputstring = "";
            ResizeBilinear filterr = new ResizeBilinear(1920, 1080);

            bmp = filterr.Apply(bmp);

            outputstring          = this.Ocr(bmp);
            txtNumbePlate2.Text   = outputstring;
            ptBNumberPlate2.Image = bmp;


            //Smoothing
            outputstring = "";
            if (BitmapFilter.GaussianBlur(bmp1, 4))
            {
                if (BitmapFilter.GaussianBlur(bmp1, 4))
                {
                    if (BitmapFilter.MeanRemoval(bmp1, 9))
                    {
                    }
                }
            }
            outputstring          = this.Ocr(bmp1);
            txtNumbePlate3.Text   = outputstring;
            ptBNumberPlate3.Image = bmp1;


            //Color Filtering
            outputstring = "";
            ColorFiltering filter = new ColorFiltering();

            filter.Green = new IntRange(175, 255);
            bmp2         = filter.Apply(bmp2);

            outputstring          = this.Ocr(bmp2);
            txtNumbePlate4.Text   = outputstring;
            ptBNumberPlate4.Image = bmp2;

            watch.Stop(); //Stop The Timer
            lblTime.Text  = String.Format("Total Time : {0} Seconds", watch.Elapsed.TotalSeconds);
            lblCount.Text = position.ToString() + "/" + lstimages.Count.ToString();
            System.Threading.Thread.Sleep(5000);
        }
예제 #7
0
        //rgb
        private void RGB()
        {
            //crop();
            Bitmap     a          = new Bitmap(Original_Image.Image);
            Bitmap     bim        = (Bitmap)a.Clone();
            BitmapData bitmapData = bim.LockBits(
                new Rectangle(0, 0, bim.Width, bim.Height),
                ImageLockMode.ReadWrite, bim.PixelFormat);

            // step 1 - turn background to black
            ColorFiltering colorFilter = new ColorFiltering();

            colorFilter.Red              = new IntRange(130, 195);
            colorFilter.Green            = new IntRange(130, 195);
            colorFilter.Blue             = new IntRange(130, 195);
            colorFilter.FillOutsideRange = false;

            bm_crop = colorFilter.Apply(bitmapData);
            //  crop_image.Image = bm_crop;
            //pictureBox2.Image = bm_crop;
            //crop_image.Image = Original_Image.Image;
            //rgb
            Bitmap bm = (Bitmap)bm_crop; // crop_image.Image;
            //deklarasi variable
            double redColors   = 0;
            double greencolors = 0;
            double blueColor   = 0;
            double pixelColor  = 0;

            for (int y = 0; y < bm.Height; y++)
            {
                for (int x = 0; x < bm.Width; x++)
                {
                    Color c = bm.GetPixel(x, y);
                    if (c.R != 0 && c.G != 0 && c.B != 0)
                    {
                        pixelColor++;//jumlahpixel
                        //mengambil nilai rgb
                        redColors   += c.R;
                        greencolors += c.G;
                        blueColor   += c.B;
                    }
                }
            }
            //rata-rata nilai rgb
            double red   = (redColors / pixelColor);
            double green = (greencolors / pixelColor);
            double blue  = (blueColor / pixelColor);

            red   = Math.Round(red, 2);
            green = Math.Round(green, 2);
            blue  = Math.Round(blue, 2);
            //textbox
            txt_R.Text = red.ToString();
            txt_G.Text = green.ToString();
            txt_B.Text = blue.ToString();
        }
예제 #8
0
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            pictureBox1.Image = new Bitmap(Bitmap.FromFile("C:\\testimg\\" + comboBox1.SelectedIndex + ".png"), pictureBox1.Size);
            Bitmap channel = selected.Apply((Bitmap)pictureBox1.Image);

            thresholdFilter = new Threshold(Int32.Parse(textBox1.Text));
            thresholdFilter.ApplyInPlace(channel);
            pictureBox2.Image = channel;
            pictureBox3.Image = brownFilter.Apply((Bitmap)pictureBox1.Image);
        }
예제 #9
0
        //For RGB Filtering
        private void RGBFiltering(Bitmap srcImage)
        {
            //Create filter
            ColorFiltering filter = new ColorFiltering();

            //Set color ranges to keep
            filter.Red   = new IntRange(Rmin, Rmax);
            filter.Green = new IntRange(Gmin, Gmax);
            filter.Blue  = new IntRange(Bmin, Bmax);

            //Apply the filter
            RGBImage          = filter.Apply(sourceImage);
            pictureBox2.Image = RGBImage;
        }
예제 #10
0
        private void AnaliseMap(Bitmap mapImage)
        {
            mapData.Clear();
            ColorFiltering filter = new ColorFiltering();

            Trace.WriteLine("Analysing color map " + mapLocation + "...");

            var sortedList = colorMap.SortedActions();

            foreach (String action in sortedList)
            {
                Color actionColor = colorMap.GetColorFor(action);

                filter.Red   = new IntRange(actionColor.R, actionColor.R);
                filter.Green = new IntRange(actionColor.G, actionColor.G);
                filter.Blue  = new IntRange(actionColor.B, actionColor.B);

                using (Bitmap colorFilteredMapImage = filter.Apply(mapImage))
                {
                    // Once we have isolated the action color on the map image
                    // we need to find the biggest rectangle left in the map (as there could be noise)

                    BlobCounter bc = new BlobCounter();
                    bc.ProcessImage(colorFilteredMapImage);
                    Rectangle[] rects = bc.GetObjectsRectangles();
                    if (rects.Count <Rectangle>() == 0)
                    {
                        Trace.WriteLine("Warning: No rectangles were found for " + actionColor.ToString());
                    }

                    Rectangle biggestRect = Rectangle.Empty;
                    foreach (Rectangle rect in rects)
                    {
                        // Compare areas
                        if (rect.Width * rect.Height > biggestRect.Width * biggestRect.Height)
                        {
                            biggestRect = rect;
                        }
                    }

                    // Did we find a rectangle?
                    if (!biggestRect.Equals(Rectangle.Empty) && (biggestRect.Width * biggestRect.Height > MIN_AREA_THRESHOLD))
                    {
                        Trace.WriteLine("Found rectangle for " + action + ": " + biggestRect.ToString());
                        mapData[action] = biggestRect;
                    }
                }
            }
        }
예제 #11
0
        public static Bitmap RGBFilter(Bitmap img, Interval R, Interval G, Interval B, Color C, Boolean Dir)
        {
            img = ImageUtil.convert(img, PixelFormat.Format32bppArgb);

            ColorFiltering colorFilter = new ColorFiltering();

            colorFilter.Red   = new IntRange((int)R.Min, (int)R.Max);
            colorFilter.Green = new IntRange((int)G.Min, (int)G.Max);
            colorFilter.Blue  = new IntRange((int)B.Min, (int)B.Max);

            colorFilter.FillOutsideRange = Dir;
            colorFilter.FillColor        = new RGB(C);
            Bitmap filteredImage = colorFilter.Apply(img);

            return(filteredImage);
        }
예제 #12
0
        private void process_button_Click(object sender, EventArgs e)
        {
            //changes are made here

            //COLOUR PIXEL FILTERING
            //if the image is withing the range else discard
            //point based application
            var colourPixelFilter = new ColorFiltering();

            colourPixelFilter.Red   = new AForge.IntRange(90, 238);
            colourPixelFilter.Green = new AForge.IntRange(60, 180);
            colourPixelFilter.Blue  = new AForge.IntRange(30, 200);
            var colourPixelOutput = colourPixelFilter.Apply(_inputImage);

            pictureBoxOutput.Image = colourPixelOutput;
        }
예제 #13
0
        public static void ColorFilter()
        {
            try
            {
                Bitmap         bmp    = Image.FromFile(PATH + @"\test.png") as Bitmap;
                ColorFiltering filter = new ColorFiltering();
                filter.Red   = new IntRange(100, 255);
                filter.Green = new IntRange(0, 75);
                filter.Green = new IntRange(0, 75);

                Bitmap newBmp = filter.Apply(bmp);

                newBmp.Save(PATH + @"\outtest.png");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.StackTrace);
            }
        }
예제 #14
0
        public static Image FilterImage(this Image imageZ, decimal r1, decimal r2, decimal g1, decimal g2, decimal b1,
                                        decimal b2)
        {
            var imageX = new Bitmap(imageZ);
            var image  = AForge.Imaging.Image.Clone(imageX, PixelFormat.Format24bppRgb);

            var filter = new ColorFiltering {
                FillOutsideRange = true
            };
            var red1   = Convert.ToInt32(r1);
            var red2   = Convert.ToInt32(r2);
            var green1 = Convert.ToInt32(g1);
            var green2 = Convert.ToInt32(g2);
            var blue1  = Convert.ToInt32(b1);
            var blue2  = Convert.ToInt32(b2);

            filter.Red   = new IntRange(red1, red2);
            filter.Green = new IntRange(green1, green2);
            filter.Blue  = new IntRange(blue1, blue2);

            return(filter.Apply(image));
        }
예제 #15
0
        private void Detect(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                bool forced = capture.WaitOne(TimeSpan.FromSeconds(3));
                using (Graphics g = Graphics.FromImage(current))
                {
                    //WriteLog(String.Format("Detect, forced={0}", forced));
                    Mouse.Click(new Point(bounds.Location.X, bounds.Location.Y + 120), new[] { Mouse.MouseEvent.LeftDown, Mouse.MouseEvent.LeftUp });
                    g.CopyFromScreen(bounds.Location, Point.Empty, bounds.Size);

                    lock (locker)
                    {
                        tasks.Clear();
                    }

                    ExhaustiveTemplateMatching actionMatching = new ExhaustiveTemplateMatching {
                        SimilarityThreshold = 0.88f
                    };
                    ExhaustiveTemplateMatching buttonMatching = new ExhaustiveTemplateMatching {
                        SimilarityThreshold = 0.90f
                    };
                    BlobCounter actions = new BlobCounter {
                        FilterBlobs = true, MinWidth = 25, MinHeight = 25, MaxWidth = 42, MaxHeight = 42
                    };
                    BlobCounter buttons = new BlobCounter {
                        FilterBlobs = true, MinWidth = 60, MinHeight = 25, MaxWidth = 175, MaxHeight = 50
                    };
                    Bitmap yellowOnly = keepYellowOnly.Apply(current);
                    //keepYellowOnly.ApplyInPlace(current); Bitmap yellowOnly = current;
                    actions.ProcessImage(yellowOnly);
                    buttons.ProcessImage(yellowOnly);

                    //int n = 0;
                    ////keepYellowOnly.ApplyInPlace(current);   // output image with color filter applied
                    ////foreach (Blob blob in buttons.GetObjectsInformation().Concat(actions.GetObjectsInformation()))
                    ////    if (!templates.Where(t => t.Icon.Height <= blob.Rectangle.Height && t.Icon.Width <= blob.Rectangle.Width)
                    ////                    .Any(t => exhaustive.ProcessImage(current, t.Icon, blob.Rectangle).Length == 0))
                    //foreach (Blob blob in buttons.GetObjectsInformation().Concat(actions.GetObjectsInformation()))
                    //{
                    //    //if (blob.Rectangle.ToString().StartsWith("{X=1291,Y=406"))
                    //    //{
                    //    //    i += 0;
                    //    //    var x = actionMatching.ProcessImage(current, templates[11].Icon, blob.Rectangle);
                    //    //}
                    //    using (Bitmap icon = new Bitmap(blob.Rectangle.Width, blob.Rectangle.Height))
                    //    using (Graphics g1 = Graphics.FromImage(icon))
                    //    {
                    //        icon.SetResolution(current.HorizontalResolution, current.VerticalResolution);
                    //        g1.DrawImage(current, 0, 0, blob.Rectangle, GraphicsUnit.Pixel);
                    //        //g.DrawString(String.Format("{0}", blob.Rectangle),
                    //        //    new Font("Arial", 10, FontStyle.Bold), Brushes.Black, blob.Rectangle.Location);
                    //        icon.Save(String.Format(@"C:\Users\Rubens\Desktop\simcity\{0}.jpg", ++n), ImageFormat.Jpeg);
                    //    }
                    //    g.FillRectangle(new SolidBrush(Color.FromArgb(128, Color.Yellow)), blob.Rectangle);
                    //}
                    ////current.Save(@"C:\Users\Rubens\Desktop\newIconXXX.png");

                    #region Identify actions and buttons

                    var items =
                        actions.GetObjectsInformation()
                        .SelectMany(a => templates.Where(t => t.Icon.Height <= a.Rectangle.Height &&
                                                         t.Icon.Width <= a.Rectangle.Width)
                                    .Select(t => new
                    {
                        Template = t,
                        Blob     = a,
                        Match    = actionMatching.ProcessImage(current, t.Icon, a.Rectangle)
                                   .OrderBy(i => i.Similarity).FirstOrDefault()
                    })).Concat(
                            buttons.GetObjectsInformation()
                            .SelectMany(a => templates.Where(t => t.Icon.Height <= a.Rectangle.Height &&
                                                             t.Icon.Width <= a.Rectangle.Width)
                                        .Select(t => new
                    {
                        Template = t,
                        Blob     = a,
                        Match    = buttonMatching.ProcessImage(current, t.Icon, a.Rectangle)
                                   .OrderBy(i => i.Similarity).FirstOrDefault()
                    })))
                        .Where(i => i != null)
                        .Where(i => i.Match != null)
                        .OrderByDescending(i => i.Match.Similarity);

                    foreach (var item in items)
                    {
                        Rectangle target = CalculateOffset(item.Match.Rectangle, item.Template.Offset);
                        g.FillRectangle(new SolidBrush(Color.FromArgb(128, item.Template.Color)), item.Match.Rectangle);
                        g.FillRectangle(Brushes.HotPink, target);   // click point
                        //g.DrawString(String.Format("{0},{1},{2} ({3:0.00})", target.Location, template.Priority, template.Name, match.Similarity),
                        //    new Font("Arial", 10, FontStyle.Bold), Brushes.Black, target.Location);

                        if (!item.Template.AutoClick)
                        {
                            continue;   // Auto level up?
                        }
                        Point location = TranslateScreenCoordinates(target);
                        Task  task     = new Task
                        {
                            Priority    = item.Template.Priority,
                            Location    = location,
                            MouseEvents = new[] { Mouse.MouseEvent.LeftDown, Mouse.MouseEvent.LeftUp },
                            Type        = item.Template.Name,
                            LastClick   = tracker.ContainsKey(location) ? tracker[location]: DateTime.MinValue,
                            Cost        = item.Template.Cost,
                            Delay       = item.Template.Delay,
                            Refresh     = item.Template.Refresh,
                            Similarity  = item.Match.Similarity
                        };

                        lock (locker)
                        {
                            // no existing task on same location
                            if (tasks.All(t => t.Location != task.Location))
                            {
                                tasks.Add(task);
                            }
                        }
                    }

                    lock (locker)
                    {   // Acumular as tarefas antes de executar
                        System.Threading.Monitor.Pulse(locker);
                    }

                    #endregion

                    Refresh();
                }
            }
        }
예제 #16
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++;
        }
예제 #17
0
 public Bitmap Apply(Bitmap input)
 {
     return(_filter.Apply(input));
 }
예제 #18
0
        public Bitmap DetectRed(Bitmap image)
        {
            ColorFiltering cf = new ColorFiltering(new IntRange(150, 255), new IntRange(120, 160), new IntRange(60, 90));

            return(cf.Apply(image));
        }
예제 #19
0
        private void PlayerNewFrame(object sender, ref Bitmap image)
        {
            BrightnessCorrection brightnessFilter = new BrightnessCorrection(brightnessCorrection);

            brightnessFilter.ApplyInPlace(image);



            ColorFiltering colorFilter = new ColorFiltering();

            colorFilter.Red   = new IntRange(rL, rU);
            colorFilter.Green = new IntRange(gL, gU);
            colorFilter.Blue  = new IntRange(bL, bU);

            Bitmap objectImage = colorFilter.Apply(image);

            if (debugTrackingCB.Checked)
            {
                image = objectImage;
            }

            BlobCounter blobCounter = new BlobCounter();

            blobCounter.MinWidth     = (int)blobWidth.Value;
            blobCounter.MinHeight    = (int)blobHeight.Value;
            blobCounter.FilterBlobs  = true;
            blobCounter.ObjectsOrder = ObjectsOrder.Size;

            Bitmap grayScale = Grayscale.CommonAlgorithms.BT709.Apply(objectImage);

            blobCounter.ProcessImage(grayScale);

            Rectangle[] rectangles = blobCounter.GetObjectsRectangles();

            if (rectangles.Length > 0)
            {
                Rectangle objectRect = rectangles[0];

                System.Drawing.Point center = new System.Drawing.Point();
                center.X = objectRect.X + (objectRect.Width / 2) - 3;
                center.Y = objectRect.Y + (objectRect.Height / 2) - 3;

                Graphics g = Graphics.FromImage(image);

                using (Pen p = new Pen(Color.Red, 3))
                {
                    g.DrawEllipse(p, center.X, center.Y, 6, 6);
                }

                g.Dispose();

                currentButton = GetButton(center);
            }
            else
            {
                currentButton = "WAIT";
            }

            Console.WriteLine(currentButton);



            using (Graphics g = Graphics.FromImage(image))
            {
                using (Pen p = new Pen(Color.Black))
                {
                    foreach (ScreenButton s in screenButtons)
                    {
                        Rectangle destRect = new Rectangle(s.location, s.size);
                        Rectangle srcRect  = new Rectangle(0, 0, s.image.image.Width, s.image.image.Height);


                        g.DrawImage(s.image.image, destRect, srcRect, GraphicsUnit.Pixel);

                        g.DrawRectangle(p, destRect);
                    }
                }

                g.DrawArc(clockPen, clockPosition, -90, 360f * ((float)currentTime / randomizerTimer.Interval));
                g.DrawString("Randomize\nTimer", clockTextFont, clockTextBrush, 45, 10);
            }
        }
예제 #20
0
        public Bitmap edgeDetection()
        {
            Bitmap          colorImg      = (Bitmap)videoSourcePlayer1.GetCurrentVideoFrame();
            Grayscale       grayfilter    = new Grayscale(cr, cg, cb);
            GaussianBlur    blurFilter    = new GaussianBlur();
            GaussianSharpen sharpenFilter = new GaussianSharpen();
            Bitmap          originalImage;

            if (gausianToggle == 0)
            {
                originalImage = (Bitmap)grayfilter.Apply(colorImg);
            }
            else if (gausianToggle == 1)
            {
                originalImage = sharpenFilter.Apply((Bitmap)colorImg);
                originalImage = (Bitmap)grayfilter.Apply(originalImage);
            }
            else
            {
                originalImage = blurFilter.Apply((Bitmap)colorImg);
                originalImage = (Bitmap)grayfilter.Apply(originalImage);
            }
            switch (caseValue)
            {
            case 1:
                //canny
                scrollableImagePanel1.Image = originalImage;
                CannyEdgeDetector edgeDectector = new CannyEdgeDetector();
                edgeDectector.HighThreshold = (byte)cannyUpperThresholdSlider.Value;
                edgeDectector.LowThreshold  = (byte)cannyLowerThresholdSlider.Value;
                edgeDectector.ApplyInPlace(scrollableImagePanel1.Image);
                return((Bitmap)scrollableImagePanel1.Image);

            case 2:
                //gray scale
                scrollableImagePanel3.Image = originalImage;
                Grayscale customGrayScale = new Grayscale((cr * (graySlider.Value / 100)), (cb * (graySlider.Value / 100)), (cg * (graySlider.Value / 100)));
                originalImage = customGrayScale.Apply(colorImg);
                return(originalImage);

            case 3:
                //Black and White
                scrollableImagePanel2.Image = originalImage;
                Threshold thresholdFilter = new Threshold();
                thresholdFilter.ThresholdValue = hScrollBar1.Value;
                thresholdFilter.ApplyInPlace(scrollableImagePanel2.Image);
                return((Bitmap)scrollableImagePanel2.Image);

            case 4:
                //Mixed Color Edits
                scrollableImagePanel5.Image = colorImg;
                ChannelFiltering colorChannelFilter = new ChannelFiltering();
                colorChannelFilter.Red   = new IntRange(0, redSlider.Value);
                colorChannelFilter.Blue  = new IntRange(0, blueSlider.Value);
                colorChannelFilter.Green = new IntRange(0, greenSlider.Value);
                colorChannelFilter.ApplyInPlace((Bitmap)scrollableImagePanel5.Image);
                return((Bitmap)scrollableImagePanel5.Image);

            case 5:
                //Specific Color edits
                ColorFiltering colorFilter = new ColorFiltering();
                if (colorToggle == 1)
                {
                    Console.WriteLine("Red disabled");
                    colorFilter.Red   = new IntRange(0, 0);
                    colorFilter.Blue  = new IntRange(0, 255);
                    colorFilter.Green = new IntRange(0, 255);
                    colorFilter.Apply(colorImg);
                    originalImage = colorImg;
                    return(originalImage);
                }
                else if (colorToggle == 2)
                {
                    Console.WriteLine("Blue disabled");
                    colorFilter.Red   = new IntRange(0, 255);
                    colorFilter.Blue  = new IntRange(0, 0);
                    colorFilter.Green = new IntRange(0, 255);
                    colorFilter.Apply(colorImg);
                    originalImage = colorImg;
                    return(originalImage);
                }
                else if (colorToggle == 3)
                {
                    Console.WriteLine("Green disabled");
                    colorFilter.Red   = new IntRange(0, 255);
                    colorFilter.Blue  = new IntRange(0, 255);
                    colorFilter.Green = new IntRange(0, 0);
                    colorFilter.Apply(colorImg);
                    originalImage = colorImg;
                    return(originalImage);
                }
                else
                {
                    return(colorImg);
                }
            }
            return(originalImage);
        }
예제 #21
0
        public void picback()
        {
            Bitmap temp1;
            Bitmap temp2;
            Bitmap temp3;
            Bitmap temp4;
            Bitmap temp5;
            Bitmap temp6;
            Bitmap temp7;
            Bitmap temp8;
            Bitmap temp9;
            Bitmap temp10;

            Bitmap sourceImage;


            //新建轮廓过滤器
            CannyEdgeDetector filter = new CannyEdgeDetector();

            //生成颜色过滤器
            ColorFiltering colorFilter = new ColorFiltering();

            //将颜色过滤器设置为白色
            colorFilter.Red   = new IntRange(50, 255);
            colorFilter.Green = new IntRange(50, 255);
            colorFilter.Blue  = new IntRange(50, 255);

            //从摄像头中截取图像
            sourceImage = videoSourcePlayer1.GetCurrentVideoFrame();

            //将原图格式化复制
            temp1 = AForge.Imaging.Image.Clone(sourceImage, sourceImage.PixelFormat);
            //清除sourceImage占用
            sourceImage.Dispose();
            //sourceImage = temp1;

            int Height = temp1.Size.Height;
            int Width  = temp1.Size.Width;

            //pictureBox1是原图
            //pictureBox1.Image = temp1;

            //从temp1提取颜色
            temp2 = filter.Apply(temp1.PixelFormat != PixelFormat.Format8bppIndexed ?
                                 Grayscale.CommonAlgorithms.BT709.Apply(temp1) : temp1);
            //pictureBox2原图轮廓
            //pictureBox2.Image = temp2;


            //从temp1进行颜色过滤
            temp5 = colorFilter.Apply(temp1);
            //pictureBox5原图轮廓
            //pictureBox5.Image = temp5;

            //从temp5进行灰度转化
            temp3 = new Grayscale(0.2125, 0.7154, 0.0721).Apply(temp5);

            //pictureBox3灰度转化
            //pictureBox3.Image = temp3;

            //从temp3进行二值化
            temp4 = new Threshold(10).Apply(temp3);
            //pictureBox4是二值化后的图
            //pictureBox4.Image = temp4;

            //temp7去噪点后的图
            temp7 = new BlobsFiltering(40, 40, temp4.Width, temp4.Height).Apply(temp4);

            //pictureBox7.Image = temp7;

            //temp6先原图格式化复制
            temp6 = AForge.Imaging.Image.Clone(temp7, temp1.PixelFormat);
            temp8 = temp6;

            try
            {
                QuadrilateralFinder qf      = new QuadrilateralFinder();//获取三角形、四边形角点
                List <IntPoint>     corners = qf.ProcessImage(temp6);
                //进行角点转换
                corners = CornersChange(corners, temp6.Size.Width, temp6.Size.Height);
                //生成四角变换过滤器
                QuadrilateralTransformation filter2 = new QuadrilateralTransformation(corners, 1920, 1040);
                //对原图temp1进行四角型变换
                temp8 = filter2.Apply(temp1);
            }
            catch
            {
            }
            //temp9为temp8的复制
            temp9 = AForge.Imaging.Image.Clone(temp8, temp1.PixelFormat);
            //pictureBox8.Image = temp8;

            //生成一个新的过滤器
            ColorFiltering colorFilter2 = new ColorFiltering();

            colorFilter2.Red   = new IntRange(100, 255);
            colorFilter2.Green = new IntRange(100, 255);
            colorFilter2.Blue  = new IntRange(0, 90);

            //提取颜色
            temp5 = colorFilter2.Apply(temp9);

            //灰度转化
            temp3 = new Grayscale(0.2125, 0.7154, 0.0721).Apply(temp5);

            //二值化
            temp4 = new Threshold(10).Apply(temp3);

            //去噪点
            temp7 = new BlobsFiltering(40, 40, temp4.Width, temp4.Height).Apply(temp4);

            temp6             = AForge.Imaging.Image.Clone(temp7, temp9.PixelFormat);
            temp10            = AForge.Imaging.Image.Clone(temp6, temp6.PixelFormat);
            pictureBox8.Image = temp10;
            try
            {
                QuadrilateralFinder qf      = new QuadrilateralFinder();//获取三角形、四边形角点
                List <IntPoint>     corners = qf.ProcessImage(temp6);

                corners = CornersChange(corners, temp6.Size.Width, temp6.Size.Height);



                Rectangle rect = new Rectangle();
                rect = Screen.GetWorkingArea(this);



                string path = OriPath + "\\SourceInputImage.jpg";

                Bitmap bt = new Bitmap(path);
                //初始化一个和屏幕面积一样大小的bitmap且格式和bt一样
                DisplayBitmap = new Bitmap(rect.Width, rect.Height, bt.PixelFormat);

                Graphics g = Graphics.FromImage(DisplayBitmap);

                g.FillRectangle(Brushes.White, new Rectangle(0, 0, rect.Width, rect.Height));//这句实现填充矩形的功能

                AForge.Imaging.Filters.BackwardQuadrilateralTransformation Bfilter = new AForge.Imaging.Filters.BackwardQuadrilateralTransformation(bt, corners);

                temp10 = Bfilter.Apply(DisplayBitmap);


                //string testsavepath = OriPath + "\\SourcePic.bmp";
                //DisplayBitmap.Save(testsavepath);

                /*
                 * BitmapData data = temp6.LockBits(new Rectangle(0, 0, temp6.Width, temp6.Height),
                 *  ImageLockMode.ReadWrite, temp6.PixelFormat);
                 * Drawing.Polygon(data, corners, Color.Red);
                 * for (int i = 0; i < corners.Count; i++)
                 * {
                 *  Drawing.FillRectangle(data,
                 *      new Rectangle(corners[i].X - 2, corners[i].Y - 2, 10, 10),
                 *      Color.Red);
                 * }
                 *
                 * temp6.UnlockBits(data);
                 */
            }
            catch
            {
            }



            pictureBox9.Image = temp10;
        }
        private async Task CalibThread(FrameReadyEventArgs e)
        {
            Debug.WriteLine("Calibrating " + _calibrationStep + " " + _drawing);
            e.Frame.Bitmap.Save(@"C:\temp\daforge\src\img" + (_calibrationStep < 10?"0":"") + _calibrationStep + "-" + (_drawing?"1":"0") + "-" + _errors + ".jpg", ImageFormat.Jpeg);
            if (_errors > 100)
            {
                //calibration not possible
                return;
            }
            if (_calibrationStep == CalibrationFrames && !_drawing)
            {
                _cc.FrameReady -= BaseCalibration; // TODO
                //Grid.Calculate();
                _vs.Close();
                CalibrationCompleted(this, new EventArgs());
            }
            else
            {
                if (_calibrationStep > 2)
                {
                    if (_drawing)
                    {
                        // draw diffimage
                        _drawing = false;
                        _vs.Clear();
                        FillRects();
                        diffFilter.OverlayImage = e.Frame.Bitmap;
                    }
                    else
                    {
                        // analyse diffimage
                        _calibrationStep++;
                        _drawing = true;
                        _vs.Clear();
                        FillRects();
                        _calibrationStep--;
                        var gbm = diffFilter.Apply(e.Frame.Bitmap);
                        gbm.Save(@"C:\temp\daforge\diff\img" + _calibrationStep + ".jpg", ImageFormat.Jpeg);
#if DEBUG
                        actImg = (Bitmap)gbm.Clone();
#endif
                        var d     = UnmanagedImage.FromManagedImage(gbm);
                        var stats = new ImageStatistics(d);
                        var gcf   = new ColorFiltering(new IntRange(0, 255),
                                                       new IntRange((int)(stats.GreenWithoutBlack.Mean + stats.GreenWithoutBlack.StdDev + 5), 255),
                                                       new IntRange(0, 255));
                        var bcf = new ColorFiltering(new IntRange(0, 255),
                                                     new IntRange(0, 255),
                                                     new IntRange((int)(stats.BlueWithoutBlack.Mean + stats.BlueWithoutBlack.StdDev), 255));
                        //Debug.WriteLine("Green: " + stats.GreenWithoutBlack.Median + " Blue: " + stats.BlueWithoutBlack.Median);
                        //Debug.WriteLine("Green: " + stats.GreenWithoutBlack.Mean + " Blue: " + stats.BlueWithoutBlack.Mean);
                        var bf = new Difference(gcf.Apply(d));
                        bcf.ApplyInPlace(d);
                        bf.ApplyInPlace(d);
                        d.ToManagedImage().Save(@"C:\temp\daforge\diff\img" + _calibrationStep + ".jpg", ImageFormat.Jpeg);
                        stats = new ImageStatistics(d);
                        gcf   = new ColorFiltering(new IntRange(0, 255),
                                                   new IntRange((int)stats.GreenWithoutBlack.Mean, 255),
                                                   new IntRange(0, 255));
                        bcf = new ColorFiltering(new IntRange(0, 255),
                                                 new IntRange(0, 255),
                                                 new IntRange((int)stats.BlueWithoutBlack.Mean, 255));
                        // split channels
                        var bbm = bcf.Apply(d);
                        bbm.ToManagedImage().Save(@"C:\temp\daforge\bimg\img" + _calibrationStep + ".jpg", ImageFormat.Bmp);
                        gcf.ApplyInPlace(d);
                        d.ToManagedImage().Save(@"C:\temp\daforge\gimg\img" + _calibrationStep + ".jpg", ImageFormat.Bmp);
                        var gblobCounter = new BlobCounter
                        {
                            ObjectsOrder         = ObjectsOrder.YX,
                            MaxHeight            = 60,
                            MinHeight            = 15,
                            MaxWidth             = 60,
                            MinWidth             = 15,
                            FilterBlobs          = true,
                            CoupledSizeFiltering = false
                        };
                        gblobCounter.ProcessImage(d);
                        var bblobCounter = new BlobCounter
                        {
                            ObjectsOrder         = ObjectsOrder.YX,
                            MaxHeight            = 60,
                            MinHeight            = 15,
                            MaxWidth             = 60,
                            MinWidth             = 15,
                            FilterBlobs          = true,
                            CoupledSizeFiltering = false
                        };
                        bblobCounter.ProcessImage(bbm);
                        ProcessBlobs(gblobCounter, 0);
                        ProcessBlobs(bblobCounter, 1);
#if DEBUG
                        actImg.Save(@"C:\temp\daforge\squares\img" + _calibrationStep + ".jpg", ImageFormat.Jpeg);
#endif
                        _calibrationStep++;
                    }
                }
                else
                {
                    switch (_calibrationStep)
                    {
                    case 2:
                        var bm = UnmanagedImage.FromManagedImage(e.Frame.Bitmap);
                        //diffFilter.OverlayImage.Save(@"C:\temp\daforge\diff\src" + _errors + ".jpg", ImageFormat.Jpeg);
                        bm = diffFilter.Apply(bm);
                        var gf = new GaussianBlur(9.0, 3);
                        gf.ApplyInPlace(bm);
                        var cf = new ColorFiltering(new IntRange(10, 255), new IntRange(20, 255),
                                                    new IntRange(20, 255));
                        cf.ApplyInPlace(bm);
                        var blobCounter = new BlobCounter {
                            ObjectsOrder = ObjectsOrder.Size, BackgroundThreshold = Color.FromArgb(255, 15, 20, 20), FilterBlobs = true
                        };
                        blobCounter.ProcessImage(bm);
                        bm.ToManagedImage().Save(@"C:\temp\daforge\diff\img" + _calibrationStep + "-" + _errors + ".jpg", ImageFormat.Jpeg);
                        var blobs = blobCounter.GetObjectsInformation();
                        if (blobs.Any())
                        {
                            int             i = 0;
                            List <IntPoint> corners;
                            do
                            {
                                corners =
                                    PointsCloud.FindQuadrilateralCorners(blobCounter.GetBlobsEdgePoints(blobs[i++]));
                            } while (corners.Count != 4);
                            RecursiveAForgeCalibrator.GridBlobs.InPlaceSort(corners);
                            Grid.TopLeft     = new Point(corners[0].X, corners[0].Y);
                            Grid.TopRight    = new Point(corners[1].X, corners[1].Y);
                            Grid.BottomLeft  = new Point(corners[2].X, corners[2].Y);
                            Grid.BottomRight = new Point(corners[3].X, corners[3].Y);
                            if (Grid.TopLeft.X > 10 && Grid.TopRight.X < _vs.Width - 5 && Grid.BottomLeft.X > 5 &&
                                Grid.BottomRight.X < _vs.Width - 5 && Grid.TopLeft.Y > 10 && Grid.TopRight.Y > 5 &&
                                Grid.BottomLeft.Y < _vs.Height - 5 && Grid.BottomRight.Y < _vs.Height - 5 &&
                                Grid.TopLeft.X < Grid.BottomRight.X && blobs[i - 1].Area > 60000 &&
                                Grid.BottomLeft.X < Grid.TopRight.X && Grid.BottomLeft.X < Grid.BottomRight.X &&
                                Grid.TopLeft.Y < Grid.BottomLeft.Y && Grid.TopLeft.Y < Grid.BottomRight.Y &&
                                Grid.TopRight.Y < Grid.BottomLeft.Y && Grid.TopRight.Y < Grid.BottomRight.Y)
                            {
                                _calibrationStep++;
                                _drawing = true;
                                _vs.Clear();
                                FillRects();
                                Grid.AddPoint(new Point(), new Point(corners[0].X, corners[0].Y));
                                Grid.AddPoint(new Point(0, _vs.Height), new Point(corners[1].X, corners[1].Y));
                                Grid.AddPoint(new Point(_vs.Width, 0), new Point(corners[2].X, corners[2].Y));
                                Grid.AddPoint(new Point(_vs.Width, _vs.Height),
                                              new Point(corners[3].X, corners[3].Y));
                                //_mapper.PredictFromCorners();
                            }
                            else
                            {
                                _calibrationStep = 0;
                                _errors++;
                            }
                        }
                        else
                        {
                            _calibrationStep = 0;
                            _errors++;
                            _vs.Draw();
                        }
                        break;

                    case 1:
                        diffFilter.OverlayImage = e.Frame.Bitmap;
                        //diffFilter.OverlayImage.Save(@"C:\temp\daforge\diff\srcf" + _errors + ".jpg", ImageFormat.Jpeg);
                        //_vs.AddRect(0, 0, (int) _vs.Width, (int) _vs.Height, Color.FromArgb(255, 255, 255, 255));
                        _vs.Clear();
                        for (int y = 0; y < Columncount; y++)
                        {
                            for (int x = 0; x < Rowcount; x++)
                            {
                                if (!(y % 2 == 0 && x % 2 == 0 || y % 2 == 1 && x % 2 == 1))
                                {
                                    _vs.AddRect((int)(x * _sqrwidth), (int)(y * _sqrheight),
                                                (int)_sqrwidth, (int)_sqrheight,
                                                Color.FromArgb(255, 255, 255, 255));
                                }
                            }
                        }
                        _vs.Draw();
                        _calibrationStep++;
                        break;

                    case 0:
                        Grid            = new Grid(e.Frame.Bitmap.Width, e.Frame.Bitmap.Height);
                        Grid.ScreenSize = new Rectangle(0, 0, _vs.Width, _vs.Height);
                        _mapper         = new CornerBarycentricMapper(Grid);
                        var thread = new Thread(() =>
                        {
                            _vs.Show();
                            _vs.AddRect(0, 0, _vs.Width, _vs.Height, Color.FromArgb(255, 0, 0, 0));
                        });
                        thread.SetApartmentState(ApartmentState.STA);
                        thread.Start();
                        thread.Join();
                        for (int y = 0; y < Columncount; y++)
                        {
                            for (int x = 0; x < Rowcount; x++)
                            {
                                if (y % 2 == 0 && x % 2 == 0 || y % 2 == 1 && x % 2 == 1)
                                {
                                    _vs.AddRect((int)(x * _sqrwidth), (int)(y * _sqrheight),
                                                (int)_sqrwidth, (int)_sqrheight,
                                                Color.FromArgb(255, 255, 255, 255));
                                }
                            }
                        }
                        _vs.Draw();
                        _calibrationStep++;
                        break;
                    }
                }
            }
            Debug.WriteLine("Releasing");
            await Task.Delay(500);

            _sem.Release();
        }
예제 #23
0
        static void OnNewGameState(GameState gs)
        {
            try
            {
                bool DEBUGING = true;

                if (gs.Map.GameState == DOTA_GameState.Undefined)
                {
                    return;
                }

                if (gs.Previously.Map.GameState == GS_WAITING && gs.Map.GameState == GS_DRAFTING)
                {
                    var client   = new HGV.Basilius.MetaClient();
                    var heroKeys = client.GetADHeroes().ToDictionary(_ => _.Key, _ => _.Id);

                    Console.WriteLine("Drafting");
                    Console.WriteLine("Hero {0}:{1}", gs.Hero.ID, gs.Hero.Name);

                    Thread.Sleep(4000); // Wait for ability draft screen to load.

                    var captureImage = ScreenCapture.CaptureApplication();

                    if (DEBUGING == true)
                    {
                        captureImage.Save(".//output//capture.png");
                    }

                    Bitmap overlay;
                    Bitmap source;
                    {
                        // create filter
                        var colorFiltering = new ColorFiltering();
                        // set channels' ranges to keep
                        colorFiltering.Red   = new IntRange(50, 52);
                        colorFiltering.Green = new IntRange(50, 52);
                        colorFiltering.Blue  = new IntRange(50, 52);
                        // apply the filter
                        var image = colorFiltering.Apply(captureImage);

                        var gfilter = Grayscale.CommonAlgorithms.BT709;
                        source = gfilter.Apply(image);
                    }

                    {
                        // create filter
                        var colorFiltering = new ColorFiltering();
                        // set channels' ranges to keep
                        colorFiltering.Red   = new IntRange(194, 204);
                        colorFiltering.Green = new IntRange(211, 221);
                        colorFiltering.Blue  = new IntRange(165, 170);
                        // apply the filter
                        var image = colorFiltering.Apply(captureImage);

                        var gfilter = Grayscale.CommonAlgorithms.BT709;
                        overlay = gfilter.Apply(image);
                    }

                    // create filter
                    var mergeFilter = new Merge(overlay);
                    var resultImage = mergeFilter.Apply(source);

                    if (DEBUGING == true)
                    {
                        resultImage.Save("./output/bounds.png");
                    }

                    var shapeChecker = new SimpleShapeChecker();

                    var bc = new BlobCounter();
                    bc.FilterBlobs = true;
                    bc.MinHeight   = 5;
                    bc.MinWidth    = 5;
                    bc.ProcessImage(resultImage);

                    var blobs = bc.GetObjectsInformation();

                    var size = new Size();

                    var left   = 0;
                    var top    = 0;
                    var right  = 0;
                    var height = 0;

                    foreach (var blob in blobs)
                    {
                        var points = bc.GetBlobsEdgePoints(blob);
                        if (shapeChecker.IsCircle(points))
                        {
                            right = blob.Rectangle.Left;
                        }
                        else if (shapeChecker.IsQuadrilateral(points))
                        {
                            left   = blob.Rectangle.Right;
                            top    = blob.Rectangle.Top;
                            height = blob.Rectangle.Height;

                            const double HERO_RATIO = 0.76;
                            size.Width  = (int)Math.Round(height * HERO_RATIO);
                            size.Height = height;
                        }
                    }

                    var bounds  = new Rectangle(left, top, right - left, height);
                    var spacing = (bounds.Width - (size.Width * 10)) / 11;
                    bounds.X     += spacing;
                    bounds.Width -= (spacing * 2);

                    if (DEBUGING == true)
                    {
                        Crop filter      = new Crop(bounds);
                        var  imageHeader = filter.Apply(captureImage);
                        imageHeader.Save("./output/header.png");
                    }

                    var collection = new List <Bitmap>();
                    for (int i = 0; i < 10; i++)
                    {
                        var x = (spacing * i) + (size.Width * i) + bounds.X;

                        Crop cropFilter  = new Crop(new Rectangle(x, bounds.Y, size.Width, size.Height));
                        var  cropedImage = cropFilter.Apply(captureImage);
                        collection.Add(cropedImage);

                        if (DEBUGING == true)
                        {
                            cropedImage.Save($"./output/hero[{i}].png");
                        }
                    }

                    var templates    = new List <TemplatePackage>();
                    var resizeFilter = new ResizeBicubic(size.Width, size.Height);
                    var files        = Directory.GetFiles(".//heroes");
                    foreach (var file in files)
                    {
                        var key    = Path.GetFileNameWithoutExtension(file);
                        var heroId = 0;
                        heroKeys.TryGetValue(key, out heroId);

                        var template        = Bitmap.FromFile(file) as Bitmap;
                        var resizedTemplate = resizeFilter.Apply(template);
                        var package         = new TemplatePackage()
                        {
                            Key   = key,
                            Hero  = heroId,
                            Image = resizedTemplate,
                        };
                        templates.Add(package);
                    }

                    var tm   = new ExhaustiveTemplateMatching(0.8f);
                    var data = new List <DataPackage>();
                    for (int i = 0; i < collection.Count; i++)
                    {
                        var image = collection[i];

                        foreach (var template in templates)
                        {
                            var matchings = tm.ProcessImage(image, template.Image);
                            foreach (var match in matchings)
                            {
                                var package = new DataPackage()
                                {
                                    Similarity = match.Similarity,
                                    Bounds     = match.Rectangle,
                                    Key        = template.Key,
                                    Hero       = template.Hero,
                                    Index      = i,
                                };
                                data.Add(package);
                            }
                        }
                    }

                    var heroes = new List <int>();
                    var groups = data.GroupBy(_ => _.Index).OrderBy(_ => _.Key).ToList();
                    foreach (var group in groups)
                    {
                        var item = group.OrderByDescending(_ => _.Similarity).Take(1).FirstOrDefault();

                        heroes.Add(item.Hero);

                        if (DEBUGING == true)
                        {
                            Console.WriteLine("{0}:{1} ({2})", item.Hero, item.Key, item.Similarity);
                        }
                    }

                    Console.WriteLine("Launching Drafter");

                    var roster = string.Join(",", heroes.ToArray());
                    Process.Start("https://hgv-desolator.azurewebsites.net/#/draft?roster=" + roster);

                    Console.WriteLine("");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error");
                // Next Time Gadget. NEXT TIME!
            }
        }
예제 #24
0
        void SensorFrameReady(AllFramesReadyEventArgs e)
        {
            // if the window is displayed, show the depth buffer image
            Bitmap mask = null;

            using (DepthImageFrame frame = e.OpenDepthImageFrame())
            {
                if (frame != null)
                {
                    _depthBitmap = CreateBitMapFromDepthFrame(frame);
                    ColorFiltering filter = new ColorFiltering();
                    filter.Red   = new IntRange(50, 150);
                    filter.Green = new IntRange(200, 255);
                    filter.Blue  = new IntRange(150, 255);
                    // apply the filter
                    _depthBitmap = AForge.Imaging.Image.Clone(_depthBitmap, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    mask         = filter.Apply(_depthBitmap);


                    Grayscale gray = new Grayscale(0.7, 0.3, 0.1);
                    mask = gray.Apply(mask);

                    Threshold threshold = new Threshold(100);
                    threshold.ApplyInPlace(mask);

                    Invert invert = new Invert();
                    invert.ApplyInPlace(mask);
                }
            }

            using (ColorImageFrame frame = e.OpenColorImageFrame())
            {
                if (frame != null)
                {
                    _bitmap = _drawBitmap = ImageToBitmap(frame);
                    if (mask != null)
                    {
                        ApplyMask subtract = new ApplyMask(mask);
                        _bitmap = subtract.Apply(_bitmap);
                    }

                    HSLFiltering hsl = new HSLFiltering(new IntRange(330, 30), new Range(0.5f, 1), new Range(0.1f, 1));
                    hsl.ApplyInPlace(_bitmap);

                    Grayscale gray = new Grayscale(1, 0.8, 0.8);
                    _bitmap = gray.Apply(_bitmap);


                    Mean meanFilter = new Mean();
                    meanFilter.ApplyInPlace(_bitmap);


                    BlobsFiltering blob = new BlobsFiltering();
                    blob.CoupledSizeFiltering = false;
                    blob.MinHeight            = 15;
                    blob.MinWidth             = blob.MinHeight;
                    blob.MaxHeight            = blob.MaxWidth = 300;
                    blob.ApplyInPlace(_bitmap);

                    // locate objects using blob counter
                    BlobCounter blobCounter = new BlobCounter();
                    blobCounter.ProcessImage(_bitmap);
                    Blob[] blobs = blobCounter.GetObjectsInformation();

                    Pen redPen    = new Pen(Color.Red, 2);
                    Pen greenPen  = new Pen(Color.Green, 2);
                    Pen purplePen = new Pen(Color.OrangeRed, 3);
                    Pen pen;
                    // check each object and draw circle around objects, which
                    // are recognized as circles
                    int    maxBlob     = -1;
                    double maxFullness = -1;
                    for (int i = 0, n = blobs.Length; i < n; i++)
                    {
                        float hw_ratio = (float)(blobs[i].Rectangle.Height) / blobs[i].Rectangle.Width;

                        if (hw_ratio > 0.65 && hw_ratio < 1.5 && blobs[i].Area > 200 && blobs[i].Fullness > 0.35)
                        {
                            if (blobs[i].Area > maxFullness)
                            {
                                maxBlob     = i;
                                maxFullness = blobs[i].Area;
                            }
                        }
                    }

                    System.Console.WriteLine("MAX BLOB: " + maxBlob.ToString());


                    //draw to screen!
                    Grayscale gray2 = new Grayscale(0.2125, 0.7154, 0.072);
                    _drawBitmap = gray2.Apply(_drawBitmap);
                    _drawBitmap = AForge.Imaging.Image.Clone(_drawBitmap, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    Graphics g = Graphics.FromImage(_drawBitmap);

                    AForge.Point ballPos = new AForge.Point(-1, -1);
                    if (maxBlob >= 0)
                    {
                        ballPos = blobs[maxBlob].CenterOfGravity;
                    }
                    game.DrawGridAndScore(g, ballPos);

                    for (int i = 0, n = blobs.Length; i < n; i++)
                    {
                        float hw_ratio = (float)(blobs[i].Rectangle.Height) / blobs[i].Rectangle.Width;

                        if (hw_ratio > 0.65 && hw_ratio < 1.5 && blobs[i].Area > 200 && blobs[i].Fullness > 0.35)
                        {
                            AForge.Point center = blobs[i].CenterOfGravity;
                            if (maxBlob == i)
                            {
                                pen = purplePen;
                            }
                            else if (blobs[i].Fullness > 0.35)
                            {
                                continue;//pen = greenPen;
                            }
                            else
                            {
                                continue;// pen = redPen;
                            }
                            float radius = blobs[i].Rectangle.Width / 2;
                            g.DrawEllipse(pen,
                                          (int)(center.X - radius),
                                          (int)(center.Y - radius),
                                          (int)(radius * 2),
                                          (int)(radius * 2));
                            //g.DrawString(hw_ratio.ToString(), new Font("Arial", 16), new SolidBrush(Color.Yellow),
                            //   new System.Drawing.Point((int)center.X, (int)center.Y));
                        }
                    }

                    redPen.Dispose();
                    greenPen.Dispose();
                    purplePen.Dispose();
                    g.Dispose();

                    if (game.hasWon)
                    {
                        if (player == game.winningPlayer)
                        {
                            label1.Text = "You Won!!! Congrats :)";
                        }
                        else
                        {
                            label1.Text = "You Lost... :(";
                        }
                    }

                    this.Refresh();
                }
            }
        }
        private void vspMain_NewFrame(object sender, ref Bitmap image)
        {
            cntFrame++;
            if (cntFrame < 80)
            {
                return;
            }
            colorFiltering.Red   = new Accord.IntRange(230, 245);
            colorFiltering.Green = new Accord.IntRange(200, 220);
            colorFiltering.Blue  = new Accord.IntRange(150, 180);

            var filteringFrame = colorFiltering.Apply(image);
            var afterGray      = grayscaleBT709.Apply(filteringFrame);

            var thersholdedFrame = threshold.Apply(afterGray);

            pbThreshold.Image = afterGray;

            var dilatedFrame = dilation.Apply(thersholdedFrame);

            ApplyMask applyMask   = new ApplyMask(dilatedFrame);
            var       maskedFrame = applyMask.Apply(image);
            var       blobFrame   = maskedFrame.Clone() as Bitmap;

            pbMasked.Image = maskedFrame;

            blobCounter.ProcessImage(blobFrame);
            var info       = blobCounter.GetObjectsInformation();
            var rectangles = info.Where(w => w.Area >= 200).Select(s => s.Rectangle).ToList();

            //var rectangles = blobCounter.GetObjectsRectangles();
            if (rectangles.Count == 0)
            {
                missFrame++;
                return;
            }
            var rectangle = rectangles[0];

            lstHeight.Add(rectangle.Y);

            if (lstHeight.Count >= 2)
            {
                lstHeight.Remove(0);
            }

            //if(cntFrame >=130)
            //    lastRect = rectangle;
            //rectangle = rectangles.Where(w => Math.Abs(lastRect.X - w.X) < 20).FirstOrDefault();
            if (rectangle == null)
            {
                return;
            }
            Graphics g = Graphics.FromImage(image);

            rectangle.Width  = 50;
            rectangle.Height = 100;
            //rectangle.Y = lstHeight.Sum(s => s) / lstHeight.Count;
            g.DrawRectangle(new Pen(Color.Yellow, 3), rectangle);

            var img = UnmanagedImage.FromManagedImage(blobFrame);

            camshift.SearchWindow = rectangle;
            camshift.ProcessFrame(img);
            var trackRect = camshift.TrackingObject.Rectangle;

            if (trackRect == null)
            {
                return;
            }
            trackRect.Inflate(30, 30);
            g.DrawRectangle(new Pen(Color.Aqua, 3), trackRect);
        }
예제 #26
0
        /// <summary>
        /// Find all traffic signs in the specified bitmap.
        /// </summary>
        /// <param name="bitmap">The bitmap in which to search for traffic signs</param>
        /// <returns>A Rectangle[] array of found traffic signs</returns>
        private Rectangle[] FindTrafficSigns(Bitmap bitmap)
        {
            // set up a color filter for 'traffic sign yellow'
            var yellowFilter = new ColorFiltering(
                new IntRange(127, 255),
                new IntRange(127, 255),
                new IntRange(0, 127));

            // filter the frame so only yellow remains
            var yellowFrame = yellowFilter.Apply(bitmap);

            // convert the image to grayscale
            var grayFrame = Grayscale.CommonAlgorithms.BT709.Apply(yellowFrame);

            // use a sobel edge detector to find color edges
            var edgeDetector = new SobelEdgeDetector();
            var edgeFrame    = edgeDetector.Apply(grayFrame);

            // threshold the edges
            var thresholdConverter = new Threshold(200);

            thresholdConverter.ApplyInPlace(edgeFrame);

            // show the thresholded image in the pip window
            edgeBox.Image = (Bitmap)edgeFrame.Clone();

            // use a blobcounter to find all shapes
            var detector = new BlobCounter()
            {
                FilterBlobs          = true,
                CoupledSizeFiltering = true,
                MinWidth             = 10,
                MinHeight            = 10,
                MaxWidth             = 200,
                MaxHeight            = 150,
            };

            detector.ProcessImage(edgeFrame);
            var blobs = detector.GetObjectsInformation();

            // we're going to look for signs above the road and in the right curb,
            // so let's set up two search areas
            var searchArea1 = new Rectangle(
                (int)(edgeFrame.Width * 0.3),
                (int)(edgeFrame.Height * 0.1),
                (int)(edgeFrame.Width * 0.5),
                (int)(edgeFrame.Height * 0.54));
            var searchArea2 = new Rectangle(
                (int)(edgeFrame.Width * 0.6),
                (int)(edgeFrame.Height * 0.5),
                (int)(edgeFrame.Width * 0.4),
                (int)(edgeFrame.Height * 0.14));

            // let's draw the search areas into the main window
            // for easy reference
            DrawRectangles(new[] { searchArea1, searchArea2 }, bitmap, Color.Red);

            // look for signs in both search areas
            var candidates =
                from shape in blobs
                where searchArea1.Contains(shape.Rectangle) ||
                searchArea2.Contains(shape.Rectangle)
                select shape;

            // build a list of all matches
            return((from shape in candidates
                    select shape.Rectangle).ToArray());
        }
예제 #27
0
        public void picshow()
        {
            Bitmap temp1;

            Bitmap temp2;
            Bitmap temp3;
            Bitmap temp4;
            Bitmap temp5;

            Bitmap temp7;
            Bitmap temp8;
            Bitmap temp9;

            Bitmap sourceImage;


            //新建轮廓过滤器
            CannyEdgeDetector filter = new CannyEdgeDetector();

            //生成颜色过滤器
            ColorFiltering colorFilter = new ColorFiltering();

            //白色

            colorFilter.Red   = new IntRange(50, 255);
            colorFilter.Green = new IntRange(50, 255);
            colorFilter.Blue  = new IntRange(50, 255);


            //从摄像头中截取图像
            sourceImage = videoSourcePlayer1.GetCurrentVideoFrame();

            //将原图格式化复制
            temp1 = AForge.Imaging.Image.Clone(sourceImage, sourceImage.PixelFormat);
            sourceImage.Dispose();
            sourceImage = temp1;

            int Height = sourceImage.Size.Height;
            int Width  = sourceImage.Size.Width;

            //pictureBox1是原图
            pictureBox1.Image = temp1;


            //pictureBox2原图轮廓
            temp2 = filter.Apply(sourceImage.PixelFormat != PixelFormat.Format8bppIndexed ?
                                 Grayscale.CommonAlgorithms.BT709.Apply(sourceImage) : sourceImage);

            pictureBox2.Image = temp2;


            //pictureBox5提取颜色后的图

            temp5 = colorFilter.Apply(temp1);

            pictureBox5.Image = temp5;

            //pictureBox3灰度转化后的图
            temp3 = new Grayscale(0.2125, 0.7154, 0.0721).Apply(temp5);


            pictureBox3.Image = temp3;

            //pictureBox4二值化后的图

            temp4 = new Threshold(10).Apply(temp3);

            pictureBox4.Image = temp4;
            //pictureBox7去噪点后的图
            temp7 = new BlobsFiltering(40, 40, temp4.Width, temp4.Height).Apply(temp4);

            pictureBox7.Image = temp7;
            Bitmap temp6 = AForge.Imaging.Image.Clone(temp7, temp1.PixelFormat);

            temp8 = temp6;

            try
            {
                QuadrilateralFinder qf      = new QuadrilateralFinder();//获取三角形、四边形角点
                List <IntPoint>     corners = qf.ProcessImage(temp6);

                /*
                 * BlobCounter extractor = new BlobCounter();
                 * extractor.FilterBlobs = true;
                 * extractor.MinWidth = extractor.MinHeight = 150;
                 * extractor.MaxWidth = extractor.MaxHeight = 350;
                 * extractor.ProcessImage(temp6);
                 *
                 * foreach (Blob blob in extractor.GetObjectsInformation())
                 * {
                 *  // 获取边缘点
                 *  List<IntPoint> edgePoints = extractor.GetBlobsEdgePoints(blob);
                 *  // 利用边缘点,在原始图像上找到四角
                 *  corners = PointsCloud.FindQuadrilateralCorners(edgePoints);
                 * }
                 */
                corners = CornersChange(corners, temp6.Size.Width, temp6.Size.Height);

                QuadrilateralTransformation filter2 = new QuadrilateralTransformation(corners, 384, 216);

                temp8 = filter2.Apply(temp1);
            }
            catch
            {
            }
            //pictureBox8原图中的投影经过四边形转换后的图
            temp9             = AForge.Imaging.Image.Clone(temp8, temp1.PixelFormat);
            pictureBox8.Image = temp8;

            //亮黄
            ColorFiltering colorFilter2 = new ColorFiltering();

            colorFilter2.Red   = new IntRange(100, 255);
            colorFilter2.Green = new IntRange(100, 255);
            colorFilter2.Blue  = new IntRange(0, 90);

            //提取颜色

            temp5 = colorFilter2.Apply(temp9);

            pictureBox5.Image = temp5;

            //灰度转化
            temp3 = new Grayscale(0.2125, 0.7154, 0.0721).Apply(temp5);


            pictureBox3.Image = temp3;

            //二值化

            temp4 = new Threshold(10).Apply(temp3);

            //去噪点
            temp7 = new BlobsFiltering(40, 40, temp4.Width, temp4.Height).Apply(temp4);

            temp6 = AForge.Imaging.Image.Clone(temp7, temp9.PixelFormat);
            temp9 = temp6;

            try
            {
                QuadrilateralFinder qf      = new QuadrilateralFinder();//获取三角形、四边形角点
                List <IntPoint>     corners = qf.ProcessImage(temp6);

                corners = CornersChange(corners, temp6.Size.Width, temp6.Size.Height);

                QuadrilateralTransformation filter2 = new QuadrilateralTransformation(corners, 384, 216);


                BitmapData data = temp6.LockBits(new Rectangle(0, 0, temp6.Width, temp6.Height),
                                                 ImageLockMode.ReadWrite, temp6.PixelFormat);
                Drawing.Polygon(data, corners, Color.Red);
                for (int i = 0; i < corners.Count; i++)
                {
                    Drawing.FillRectangle(data,
                                          new Rectangle(corners[i].X - 2, corners[i].Y - 2, 10, 10),
                                          Color.Red);
                }
                float juli = (corners[0].Y + corners[3].Y - corners[1].Y - corners[2].Y) / 2;

                label1.Text = ((int)((400 - juli) / 7.5)).ToString();
                temp6.UnlockBits(data);
            }
            catch
            {
            }

            pictureBox9.Image = temp9;
        }