Beispiel #1
0
        /// <summary>
        /// Look at the input image and find a suitable blob.
        /// </summary>
        /// <param name="filter">HSL filter to use for image segmentation.</param>
        /// <param name="image">Input image to segment.</param>
        /// <param name="minRect">Minimum size of output blob.</param>
        /// <param name="colourBitmap">Bitmap to write binary image to.</param>
        /// <param name="maxSize">Maximum size of output blob (default value will allow any size).</param>
        /// <returns>A rectangle array of all suitable blobs, or an empty array if no suitable blobs are found.</returns>
        protected System.Drawing.Rectangle[] DetectObstacle(AForge.Imaging.Filters.HSLFiltering filter, Bitmap image, System.Drawing.Point minRect, out Bitmap colourBitmap, System.Drawing.Point maxSize = default(System.Drawing.Point))
        {
            Bitmap filtered;

            filtered = filter.Apply(image);

            //short[,] structuringElement = new short[,] { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } };

            filtered = BinaryImage(filtered);
            //AForge.Imaging.Filters.Opening openingFilter = new AForge.Imaging.Filters.Opening(structuringElement);
            //filtered = openingFilter.Apply(filtered);
            colourBitmap = filtered;

            AForge.Imaging.BlobCounter blobs = new AForge.Imaging.BlobCounter();
            blobs.MinWidth  = (int)minRect.X;
            blobs.MinHeight = (int)minRect.Y;
            if (!maxSize.IsEmpty)
            {
                blobs.MaxWidth  = maxSize.X;
                blobs.MaxHeight = maxSize.Y;
            }
            blobs.FilterBlobs  = true;
            blobs.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            blobs.ProcessImage(filtered);

            System.Drawing.Rectangle[] rectangles = blobs.GetObjectsRectangles();

            return(rectangles);
        }
Beispiel #2
0
 //Filter to find red
 private Bitmap redF(Bitmap image)
 {
     //Create Filter and set value ranges
     AForge.Imaging.Filters.HSLFiltering filter = new AForge.Imaging.Filters.HSLFiltering();
     filter.Hue        = new AForge.IntRange(350, 25);
     filter.Saturation = new AForge.Range(0.5f, 1);
     filter.Luminance  = new AForge.Range(0.15f, 1);
     filter.ApplyInPlace(image);
     //Create a blob counter to search through the image
     AForge.Imaging.BlobCounter extractor = new AForge.Imaging.BlobCounter();
     extractor.MinHeight   = 5;
     extractor.MinWidth    = 5;
     extractor.FilterBlobs = true;
     extractor.ProcessImage(image);
     //Gets the rectangles so that we can draw around them
     Rectangle[] rects = extractor.GetObjectsRectangles();
     if (rects.Length > 0)
     {
         Rectangle objectRect = rects[0];
         Graphics  g          = Graphics.FromImage(image);
         using (Pen pen = new Pen(Color.FromArgb(160, 255, 160), 2))
         {
             g.DrawRectangle(pen, objectRect);
         }
         g.Dispose();
         //Get the direction and change state.
         objDirectionRed(objectRect, image.Width);
         currentState = RoboState.FOLLOW_RED;
     }
     return(image);
 }
Beispiel #3
0
        public void nesnebul(Bitmap image, int index, Bitmap imageson)
        {
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter();
            blobCounter.MinWidth = 3;
            blobCounter.MinHeight = 3;
            blobCounter.FilterBlobs = true;
            blobCounter.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            blobCounter.ProcessImage(image);
            Rectangle[] rects = blobCounter.GetObjectsRectangles();

            foreach (Rectangle recs in rects)
            {
                if (rects.Length > 0)
                {
                    Rectangle objectRect = rects[0];
                    Graphics g = Graphics.FromImage(imageson);
                    using (Pen pen = new Pen(Color.FromArgb(55, 160, 81), 5))
                    {
                        g.DrawEllipse(pen, objectRect);
                    }
                    g.Dispose();
                }//end if
            }//end foreach
            imageson.Save("C:\\Users\\Halil\\Desktop\\newframes\\image" + index + ".jpg");
        }
Beispiel #4
0
 private Bitmap blueF(Bitmap image)
 {
     //Create Filter and set value ranges
     AForge.Imaging.Filters.HSLFiltering filter = new AForge.Imaging.Filters.HSLFiltering();
     filter.Hue        = new AForge.IntRange(200, 240);
     filter.Saturation = new AForge.Range(0.3f, 1);
     filter.Luminance  = new AForge.Range(0.1f, 1);
     filter.ApplyInPlace(image);
     AForge.Imaging.BlobCounter extractor = new AForge.Imaging.BlobCounter();
     extractor.MinHeight   = 5;
     extractor.MinWidth    = 5;
     extractor.FilterBlobs = true;
     extractor.ProcessImage(image);
     //Create a blob counter to search through the image
     Rectangle[] rects = extractor.GetObjectsRectangles();
     if (rects.Length > 0)
     {
         Rectangle objectRect = rects[0];
         Graphics  g          = Graphics.FromImage(image);
         using (Pen pen = new Pen(Color.FromArgb(160, 255, 160), 2))
         {
             g.DrawRectangle(pen, objectRect);
         }
         g.Dispose();
         //Get the direction and change state.
         if (currentState != RoboState.FOLLOW_RED && currentState != RoboState.FOLLOW_GREEN)
         {
             currentState = RoboState.SEARCH;
         }
     }
     return(image);
 }
Beispiel #5
0
        private void FaceDetect_Click(object sender, EventArgs e)
        {
            if (!sw.IsRunning)
            {
                sw.Reset();
                sw.Start();
            }
            Process.Image = Image.FromFile(filepath, true);
            if (bvis == false)
            {
                bvis = true;
            }
            else
            {
                bvis = false;
            }
            GridOn.GridPaint(bvis, (Bitmap)Process.Image);//绘制网格线
            label3.Text = "网络线划分";
            try {
                Bitmap gray_img  = Knowledge.ToGray(originalimg);    //将原图转化为灰度图
                Bitmap BW        = Knowledge.Thresholding(gray_img); //利用大津法进行二值化处理
                Bitmap detectimg = Knowledge.FaceDetection(BW);      //最后利用算法进行检测
                AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(detectimg);
                Rectangle[] rects       = blobCounter.GetObjectsRectangles();
                Rectangle[] outputrects = new Rectangle[rects.Count()];
                ////object count
                int            minx = 100; int tmp = 0;
                int            rectsCount = rects.Count();
                List <decimal> test       = new List <decimal>();
                for (int c = 0; c < rectsCount; c++)
                {
                    int     p  = rects[c].Width * rects[c].Height;
                    decimal bl = (decimal)rects[c].Height / (decimal)rects[c].Width;

                    int maxx = (gray_img.Width * gray_img.Height) / 2;
                    if (p > minx && (double)bl < 1.8 && (double)bl > 0.8 && p < maxx)
                    {
                        test.Add(bl);
                        outputrects[tmp++] = rects[c];
                    }
                }
                RectanglesMarker marker = new RectanglesMarker(outputrects, Color.Red);
                this.Detected.Image = marker.Apply((Bitmap)Image.FromFile(filepath, true));
                label4.Text         = "检测结果";
                ShowMsg("检测结束!");
            }
            catch (ArgumentException)
            {
                MessageBox.Show("Invalid usage!");
            }

            if (sw.IsRunning)
            {
                sw.Stop();

                string str = sw.Elapsed.ToString();
                timeElpse.Text = string.Empty;
                timeElpse.Text = "运行时间:" + str;
            }
        }
        private Bitmap DisplayAndTrackDrawingTool(Bitmap image)
        {
            //grayscale the image
            AForge.Imaging.Filters.Grayscale grayscaling = new AForge.Imaging.Filters.Grayscale(
                0.2125, 0.7154, 0.0721);
            image = grayscaling.Apply(image);

            //mirror the image
            AForge.Imaging.Filters.Mirror mirrImg = new AForge.Imaging.Filters.Mirror(false, true);
            mirrImg.ApplyInPlace(image);

            //get biggest blob
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(image);
            blobCounter.ProcessImage(image);

            Rectangle[] rectsInImage = blobCounter.GetObjectsRectangles();
            this.txtBoxInfo.Text = rectsInImage.Length + " blobs found.";

            AForge.Imaging.Filters.ExtractBiggestBlob biggestBlob = new AForge.Imaging.Filters.ExtractBiggestBlob();
            Bitmap   bigstBlobImage = biggestBlob.Apply(image);
            IntPoint posBiggBlob    = biggestBlob.BlobPosition;

            this.txtBoxInfo.Text = "Biggest Blob at: " + posBiggBlob.ToString();

            //SetCursor(posBiggBlob);

            GenerateGraphics(posBiggBlob);

            return(image);
        }
Beispiel #7
0
        private void ProcessBlobs(Bitmap image)
        {
            //erode unwanted pixels. Note - erosion is time consuming
            //AForge.Imaging.Filters.Erosion3x3 erode = new AForge.Imaging.Filters.Erosion3x3();
            //erode.ApplyInPlace(image);

            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(image);
            blobCounter.ProcessImage(image);

            Rectangle[] rectsInImage = blobCounter.GetObjectsRectangles();
            this.lblInfotext.Text = rectsInImage.Length + " blobs found.";

            /*
             * foreach (Rectangle rect in rectsInImage)
             * {
             *  //Use this piece of code to filter out blobs based on size. Very heavy
             *  //piece of code! Use caution!
             *  bf.ApplyInPlace(image);
             * }
             * */

            //get the biggest blob
            AForge.Imaging.Filters.ExtractBiggestBlob biggestBlob = new AForge.Imaging.Filters.ExtractBiggestBlob();
            Bitmap   bigstBlobImage = biggestBlob.Apply(image);
            IntPoint posBiggBlob    = biggestBlob.BlobPosition;

            this.lblInfotext.Text += "  Biggest blob's coordinates: " + posBiggBlob.ToString();

            //pnlMagicCursor.Location = new Point(posBiggBlob.X, posBiggBlob.Y);
            pnlMagicCursor.Location = new System.Drawing.Point(posBiggBlob.X, posBiggBlob.Y);

            GetBlobsPanel(posBiggBlob);
        }
Beispiel #8
0
        public void nesnebul(Bitmap image, int index, Bitmap imageson)
        {
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter();
            blobCounter.MinWidth     = 3;
            blobCounter.MinHeight    = 3;
            blobCounter.FilterBlobs  = true;
            blobCounter.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            blobCounter.ProcessImage(image);
            Rectangle[] rects = blobCounter.GetObjectsRectangles();

            foreach (Rectangle recs in rects)
            {
                if (rects.Length > 0)
                {
                    Rectangle objectRect = rects[0];
                    Graphics  g          = Graphics.FromImage(imageson);
                    using (Pen pen = new Pen(Color.FromArgb(55, 160, 81), 5))
                    {
                        g.DrawEllipse(pen, objectRect);
                    }
                    g.Dispose();
                } //end if
            }     //end foreach
            imageson.Save("C:\\Users\\Halil\\Desktop\\newframes\\image" + index + ".jpg");
        }         //end nesnebul
Beispiel #9
0
        private void videoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
        {
            i++;
            Bitmap objectsImage = null;

            AForge.Imaging.Filters.EuclideanColorFiltering filter = new AForge.Imaging.Filters.EuclideanColorFiltering();
            // set center colol and radius
            AForge.Imaging.RGB f = new AForge.Imaging.RGB(Color.Red);
            filter.CenterColor = f;// AForge.Imaging.RGB..Blue;
            filter.Radius      = (short)100;
            // apply the filter
            objectsImage = image;
            filter.ApplyInPlace(image);

            // lock image for further processing
            System.Drawing.Imaging.BitmapData objectsData = objectsImage.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                                                                                  System.Drawing.Imaging.ImageLockMode.ReadOnly, image.PixelFormat);
            //  AForge.Imaging.Filters.Grayscale.
            // grayscaling
            AForge.Imaging.UnmanagedImage grayImage = AForge.Imaging.Filters.Grayscale.CommonAlgorithms.BT709.Apply(new AForge.Imaging.UnmanagedImage(objectsData));

            // unlock image
            objectsImage.UnlockBits(objectsData);
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter();
            // locate blobs
            //   blobCounter.MinHeight = 100;
            // blobCounter.MinWidth = 60;
            blobCounter.ProcessImage(grayImage);
            blobCounter.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            Rectangle[] rects = blobCounter.GetObjectsRectangles();

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

                // draw rectangle around derected object
                Graphics g = Graphics.FromImage(image);
                s = s + "\n" + i + " - top =  " + objectRect.Top + " bottom  " + objectRect.Bottom + " left " + objectRect.Left + "  right " + objectRect.Right + "  " + objectRect.X + "   " + objectRect.Location.X + "  " + objectRect.Location.Y;
                using (Pen pen = new Pen(Color.FromArgb(160, 255, 160), 5))
                {
                    g.DrawRectangle(pen, objectRect);
                }
                g.Dispose();
                int objectX = objectRect.X + objectRect.Width / 2 - image.Width / 2;
                int objectY = image.Height / 2 - (objectRect.Y + objectRect.Height / 2);
                // System.Console.Out.
                // label1.Text = label1.Text+objectRect.X;
                //    ParameterizedThreadStart t = new ParameterizedThreadStart(p);
                //    Thread aa = new Thread(t);
                //      aa.Start(rects[0]);
            }
            Graphics g1   = Graphics.FromImage(image);
            Pen      pen1 = new Pen(Color.FromArgb(160, 255, 160), 3);

            g1.DrawLine(pen1, image.Width / 2, 0, image.Width / 2, image.Width);
            g1.DrawLine(pen1, image.Width, image.Height / 2, 0, image.Height / 2);
            g1.Dispose();
        }
        /// <returns>Extract Blobs from image</returns>
        public static AForge.Imaging.Blob[] ExtractBlobs(this Bitmap image)
        {
            if (image.PixelFormat != PixelFormat.Format8bppIndexed)
            {
                throw new NotSupportedException("Blob extractor can be applied to binary 8bpp images only");
            }

            AForge.Imaging.BlobCounter bc = new AForge.Imaging.BlobCounter(image);

            return(bc.GetObjects(image, true));
        }
Beispiel #11
0
        //functions
        public void process()
        {
            while (true)
            {
                FeatureExtracting.Notifier.WaitOne();
                foreach (Bitmap image in queue.GetConsumingEnumerable())
                {
                    AForge.Imaging.BlobCounter bc = new AForge.Imaging.BlobCounter(image);
                    Rectangle[] rects = bc.GetObjectsRectangles();
                    Rectangle biggest = new Rectangle(0, 0, 0, 0);
                    Graphics g = Graphics.FromImage(image);
                    double ratio = 0;

                    foreach (Rectangle r in rects)
                    {
                        ratio = (r.Height + 1.0) / (r.Width + 1.0);
                        if (biggest.Width * biggest.Height < r.Width * r.Height)
                        {
                            //check ratio
                            if ((ratio < 1.1) && (ratio > 0.45))
                            {
                                if (r.Width * r.Height > 200)
                                {
                                    biggest = r;
                                }
                            }
                        }
                    }

                    int imageCenter = (biggest.Width / 2) + biggest.X;
                    int screenCenter = image.Width / 2;

                    g.DrawRectangle(new Pen(Color.FromArgb(255, 0, 0)), biggest);
                    string drawString = biggest.Height + " <-Height   Width-> " + biggest.Width + "\nratio = " + ratio + "\n Image Center = " + imageCenter + "\nScreen Center = " + screenCenter;
                    System.Drawing.Font drawFont = new System.Drawing.Font("Arial", 11);
                    System.Drawing.SolidBrush drawBrush = new System.Drawing.SolidBrush(System.Drawing.Color.White);
                    float x = 10.0F;
                    float y = 10.0F;
                    System.Drawing.StringFormat drawFormat = new System.Drawing.StringFormat();
                    g.DrawString(drawString, drawFont, drawBrush, x, y, drawFormat);
                    drawFont.Dispose();
                    drawBrush.Dispose();

                    Stats a = new Stats();
                    a.blobCount = 0;
                    ActionPlanning.queue.Add(a);
                    ActionPlanning.Notifier.Set();

                    #if DEBUG
                    Program.mainForm.VideoViewer.Image = image;
                    #endif
                }
            }
        }
Beispiel #12
0
        // //////////////////////////////ObjectPanoramaToSTL
        private void ObjectPanoramaToSTL()
        {
            // create instance of blob counter
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter();
            // process input image
            blobCounter.ProcessImage((Bitmap)tempImages[3]);
            // get information about detected objects
            AForge.Imaging.Blob[] blobs = blobCounter.GetObjectsInformation();

            // apply the filter
            // filter.ApplyInPlace((Bitmap)filteredImages[3]);
            imgSTL = filteredImages[3];
        }
 public Camera()
 {
     grayFilter     = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
     scaleFilter    = new AForge.Imaging.Filters.ResizeBilinear(300, 300);
     threshldFilter = new AForge.Imaging.Filters.BradleyLocalThresholding();
     InvertFilter   = new AForge.Imaging.Filters.Invert();
     Blober         = new AForge.Imaging.BlobCounter();
     original       = new Bitmap(300, 300);
     g = Graphics.FromImage(original);
     Blober.FilterBlobs  = true;
     Blober.MinWidth     = 5;
     Blober.MinHeight    = 5;
     Blober.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
 }
Beispiel #14
0
        private int GetOptimizedThreshold(int count, Bitmap image, int minSize, int maxSize)
        {
            var blobCounter = new AForge.Imaging.BlobCounter();

            AForge.Imaging.Blob[] blobs;
            int thresholdMax = 255;
            int thresholdMin = 0;

            blobCounter.FilterBlobs = true;
            blobCounter.MaxHeight   = maxSize;
            blobCounter.MaxWidth    = maxSize;
            blobCounter.MinHeight   = minSize;
            blobCounter.MinWidth    = minSize;
            for (var i = 255; i >= 0; i--)
            {
                if (i % 10 == 0)
                {
                    DetectShapesProgress?.Invoke(0.5f / 255f * (255 - i));
                }
                blobCounter.BackgroundThreshold = Color.FromArgb(255, i, i, i);
                blobCounter.ProcessImage(image);
                blobs = blobCounter.GetObjectsInformation();
                if (blobs.Length == count)
                {
                    thresholdMax = i;
                    break;
                }
            }
            DetectShapesProgress?.Invoke(0.5f);
            for (var i = 0; i <= 255; i++)
            {
                if (i % 10 == 0)
                {
                    DetectShapesProgress?.Invoke(0.5f + 0.5f / 255f * i);
                }
                blobCounter.BackgroundThreshold = Color.FromArgb(255, i, i, i);
                blobCounter.ProcessImage(image);
                blobs = blobCounter.GetObjectsInformation();
                if (blobs.Length == count)
                {
                    thresholdMin = i;
                    break;
                }
            }
            DetectShapesProgress?.Invoke(1f);
            var thr = (thresholdMax + thresholdMin) / 2;

            return(thr);
        }
Beispiel #15
0
        private List <Shape> DetectShapes(int count, Bitmap image, int minSize, int maxSize)
        {
            var blobCounter = new AForge.Imaging.BlobCounter();

            AForge.Imaging.Blob[] blobs;
            blobCounter.FilterBlobs = true;
            blobCounter.MaxHeight   = maxSize;
            blobCounter.MaxWidth    = maxSize;
            blobCounter.MinHeight   = minSize;
            blobCounter.MinWidth    = minSize;
            var threshold = Recognition.GetThreshold(image);

            blobCounter.BackgroundThreshold = Color.FromArgb(255, threshold, threshold, threshold);
            blobCounter.ProcessImage(image);
            blobs = blobCounter.GetObjectsInformation();

            if (blobs.Length == count)
            {
                DetectShapesProgress?.Invoke(1f);
            }
            else
            {
                threshold = GetOptimizedThreshold(count, image, minSize, maxSize);
                blobCounter.BackgroundThreshold = Color.FromArgb(255, threshold, threshold, threshold);
                blobCounter.ProcessImage(image);
                blobs = blobCounter.GetObjectsInformation();
            }

            var shapes = new List <Shape>();

            foreach (var blob in blobs)
            {
                var edgePoints = blobCounter.GetBlobsEdgePoints(blob);
                // FindQuadrilateralCorners:
                // The first point in the list is the point with lowest X coordinate
                // (and with lowest Y if there are several points with the same X value).
                // The corners are provided in counter clockwise order
                var corners = PointsCloud.FindQuadrilateralCorners(edgePoints);

                shapes.Add(new Shape(corners.ToArray(), blob));
            }

            return(shapes);
        }
        private void skindetect_Click(object sender, EventArgs e)
        {
            sw.Reset();
            sw.Start();
            Bitmap img           = (Bitmap)Image.FromFile(filepath, true); //将原图进行导入并进行格式转化
            Bitmap normalizedImg = YCbCr.Lightingconpensate(img);
            Bitmap skin          = YCbCr.SkinDetect1(normalizedImg);       //肤色检测
            Bitmap BWskin        = Knowledge.Thresholding(skin);           //图片二值化
            Bitmap gray_img      = Knowledge.ToGray(img);

            AForge.Imaging.SusanCornersDetector scd = new AForge.Imaging.SusanCornersDetector(); //susan检测子
                                                                                                 //检测人眼部分

            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(BWskin);     //对图片进行检测联通区域
            Rectangle[] rects       = blobCounter.GetObjectsRectangles();
            Rectangle[] outputrects = new Rectangle[rects.Count()];
            ////object count
            int            minx = 150; int tmp = 0;
            int            rectsCount = rects.Count();
            List <decimal> test       = new List <decimal>();

            for (int c = 0; c < rectsCount; c++)
            {
                int     p  = rects[c].Width * rects[c].Height;
                decimal bl = (decimal)rects[c].Height / (decimal)rects[c].Width;

                int maxx = (img.Width * img.Height) / 2;
                if (p > minx && (double)bl < 1.8 && (double)bl > 0.9 && p < maxx)
                {
                    test.Add(bl);
                    outputrects[tmp++] = rects[c];
                }
            }
            RectanglesMarker marker = new RectanglesMarker(outputrects, Color.Red);

            Process2.Image = img;
            Detected.Image = marker.Apply((Bitmap)Image.FromFile(filepath, true));
            sw.Stop();
            string str = sw.Elapsed.ToString();

            timeElpsed.Text = string.Empty;
            timeElpsed.Text = "运行时间:" + str;
        }
Beispiel #17
0
        /// <summary>
        /// Apply rectangle to image
        /// </summary>
        /// <param name="image">Bitmap, any suitable image</param>
        /// <returns>Rectangle</returns>
        public Rectangle DrawRectangle(Bitmap image)
        {
	    //Instantiate new blob counter
            AForge.Imaging.BlobCounter detectBlob = new AForge.Imaging.BlobCounter();

            //Get object by size
            detectBlob.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
			
	    //Apply BlobCounter
            detectBlob.ProcessImage(image);

            //objects in an array.0
            Rectangle[] rects = detectBlob.GetObjectsRectangles();
			
	    //Create graphics from image
            Graphics g = Graphics.FromImage(image);

            try
            {
		//Draw rectangle around largest rectangle (default colour is red)
                g.DrawRectangle(new Pen(Color.Red), rects[0]);
				
		//Optional to save the result image to the startup directory
                //string startupPath = System.IO.Directory.GetCurrentDirectory();
                //image.Save(startupPath + @"\nameyourfile.jpg");
				
		//Return the rantngla
                return rects[0];

            }
            catch (IndexOutOfRangeException e)
            {
		//If no blobs return empty rectangle
                Rectangle rrr = new Rectangle(0, 0, 0, 0);
                return rrr;
            }


        }
Beispiel #18
0
        void theCamera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            Bitmap theFrame = eventArgs.Frame;

            AForge.Imaging.Filters.ColorFiltering colorFilter = new AForge.Imaging.Filters.ColorFiltering(new AForge.IntRange(200, 255),
                                                                                                          new AForge.IntRange(200, 255),
                                                                                                          new AForge.IntRange(200, 255));
            colorFilter.ApplyInPlace(theFrame);
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(theFrame);
            var    ledLOCs = blobCounter.GetObjectsRectangles();
            string ledpos  = "not there";

            if (ledLOCs.Length > 0)
            {
                //should probably find out which one is actually the LED... later though.
                var pos       = getLEDLocCenter(ledLOCs[0]);
                var centerPos = new AForge.Math.Vector3(theFrame.Width / 2, theFrame.Height / 2, 0);
                var ledVector = pos - centerPos;
                ledVector.Normalize();
                var ledAngle = Math.Acos(ledVector.X);
                if (ledVector.Y < 0)
                {
                    ledAngle = -ledAngle;
                }
                double deltaLEDAngle = 0;
                if (ledAngleInit)
                {
                    deltaLEDAngle = ledAngle - lastLEDAngle;
                    if (deltaLEDAngle > Math.PI * 2)
                    {
                        deltaLEDAngle -= Math.PI * 2;
                    }
                    if (deltaLEDAngle < -Math.PI * 2)
                    {
                        deltaLEDAngle += Math.PI * 2;
                    }
                    lastLEDAngle = ledAngle;
                }
                else
                {
                    ledAngleInit = true;
                    lastLEDAngle = ledAngle;
                }
                deltaLEDAngle = ledAngle * 180 / Math.PI;
                bool canTransmit = false;
                vrconnectMutex.WaitOne();
                if (VRapp != null)
                {
                    canTransmit = true;
                }
                vrconnectMutex.ReleaseMutex();
                if (canTransmit)
                {
                    byte [] deltaAngleBytes = BitConverter.GetBytes(deltaLEDAngle); //note: in degrees per frame
                    try
                    {
                        if (VRapp.Connected)
                        {
                            VRapp.GetStream().Write(deltaAngleBytes, 0, deltaAngleBytes.Length);
                        }
                    }
                    catch
                    {
                        VRapp       = null;
                        canTransmit = false;
                    }
                }
                double displayLEDAngle = deltaLEDAngle;

                ledpos = displayLEDAngle.ToString();

                var triVec = ledPoints(ledLOCs);
                if (triVec != new Vector4(0, 0, 0, 0))
                {
                    ledpos = triVec.ToString();
                    Graphics g = Graphics.FromImage(theFrame);
                    g.DrawLine(Pens.Red, triVec.X, triVec.Y, triVec.Z, triVec.W);
                    g.Flush();
                    g.Dispose();
                }

                //if we're connected to the VR app, this is where we send the delta angle.
            }
            updateTheFrame(theFrame, ledpos);
        }
Beispiel #19
0
        /// <summary>
        /// Обработка одного сэмпла
        /// </summary>
        /// <param name="index"></param>
        private int processSample(int r, int c)
        {
            ///  Инвертируем изображение
            AForge.Imaging.Filters.Invert InvertFilter = new AForge.Imaging.Filters.Invert();
            InvertFilter.ApplyInPlace(arrayPics[r, c]);

            ///    Создаём BlobCounter, выдёргиваем самый большой кусок, масштабируем, пересечение и сохраняем
            ///    изображение в эксклюзивном использовании
            AForge.Imaging.BlobCounterBase bc = new AForge.Imaging.BlobCounter();

            bc.FilterBlobs = true;
            bc.MinWidth    = 3;
            bc.MinHeight   = 3;
            // Упорядочиваем по размеру
            bc.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            // Обрабатываем картинку

            bc.ProcessImage(arrayPics[r, c]);

            Rectangle[] rects = bc.GetObjectsRectangles();
            if (rects.Length == 0)
            {
                finalPics[r, c] = AForge.Imaging.UnmanagedImage.FromManagedImage(new Bitmap(100, 100));
                return(0);
            }

            // К сожалению, код с использованием подсчёта blob'ов не работает, поэтому просто высчитываем максимальное покрытие
            // для всех блобов - для нескольких цифр, к примеру, 16, можем получить две области - отдельно для 1, и отдельно для 6.
            // Строим оболочку, включающую все блоки. Решение плохое, требуется доработка
            int lx = arrayPics[r, c].Width;
            int ly = arrayPics[r, c].Height;
            int rx = 0;
            int ry = 0;

            for (int i = 0; i < rects.Length; ++i)
            {
                if (lx > rects[i].X)
                {
                    lx = rects[i].X;
                }
                if (ly > rects[i].Y)
                {
                    ly = rects[i].Y;
                }
                if (rx < rects[i].X + rects[i].Width)
                {
                    rx = rects[i].X + rects[i].Width;
                }
                if (ry < rects[i].Y + rects[i].Height)
                {
                    ry = rects[i].Y + rects[i].Height;
                }
            }

            // Обрезаем края, оставляя только центральные блобчики
            AForge.Imaging.Filters.Crop cropFilter = new AForge.Imaging.Filters.Crop(new Rectangle(lx, ly, rx - lx, ry - ly));
            finalPics[r, c] = cropFilter.Apply(arrayPics[r, c]);

            //  Масштабируем до 100x100
            AForge.Imaging.Filters.ResizeBilinear scaleFilter = new AForge.Imaging.Filters.ResizeBilinear(100, 100);
            finalPics[r, c] = scaleFilter.Apply(finalPics[r, c]);

            //  Ну и распознаём
            currentDeskState[r * 4 + c] = patternMatch(r, c);

            return(0);
        }
Beispiel #20
0
        public System.Drawing.Rectangle DetectObstacle(AForge.Imaging.Filters.HSLFiltering filter, Bitmap image, Vector2 minRect, ref Bitmap colourBitmap)
        {
            Bitmap filtered = filter.Apply(image);
            short[,] structuringElement = new short[,] { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } };

            filtered = Threshold(filtered, 1);
            AForge.Imaging.Filters.Opening openingFilter = new AForge.Imaging.Filters.Opening(structuringElement);
            //filtered = openingFilter.Apply(filtered);

            colourBitmap = filtered;

            AForge.Imaging.BlobCounter blobs = new AForge.Imaging.BlobCounter(filtered);
            System.Drawing.Rectangle[] rectangles = blobs.GetObjectsRectangles();

            int size = 0;
            int chosen = 0;
            int newSize = 0;
            for (int i = 0; i < rectangles.Length; i++)
            {
                newSize = rectangles[i].Height * rectangles[i].Width;

                if (size < newSize)
                {
                    chosen = i;
                    size = newSize;
                }
            }

            if (rectangles.Length != 0)
            {
                if (rectangles[chosen].Width > minRect.X && rectangles[chosen].Height > minRect.Y)
                {
                    return rectangles[chosen];
                }
            }
            return new System.Drawing.Rectangle(0, 0, 0, 0);
        }
Beispiel #21
0
        /// <summary>
        /// Обработка одного сэмпла
        /// </summary>
        /// <param name="index"></param>
        public static string processSample(ref Imaging.UnmanagedImage unmanaged)
        {
            string rez = "Обработка";

            ///  Инвертируем изображение
            AForge.Imaging.Filters.Invert InvertFilter = new AForge.Imaging.Filters.Invert();
            InvertFilter.ApplyInPlace(unmanaged);

            ///    Создаём BlobCounter, выдёргиваем самый большой кусок, масштабируем, пересечение и сохраняем
            ///    изображение в эксклюзивном использовании
            AForge.Imaging.BlobCounterBase bc = new AForge.Imaging.BlobCounter();

            bc.FilterBlobs = true;
            bc.MinWidth    = 10;
            bc.MinHeight   = 10;
            // Упорядочиваем по размеру
            bc.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            // Обрабатываем картинку

            bc.ProcessImage(unmanaged);

            Rectangle[] rects = bc.GetObjectsRectangles();
            rez = "Насчитали " + rects.Length.ToString() + " прямоугольников!";
            //if (rects.Length == 0)
            //{
            //    finalPics[r, c] = AForge.Imaging.UnmanagedImage.FromManagedImage(new Bitmap(100, 100));
            //    return 0;
            //}

            // К сожалению, код с использованием подсчёта blob'ов не работает, поэтому просто высчитываем максимальное покрытие
            // для всех блобов - для нескольких цифр, к примеру, 16, можем получить две области - отдельно для 1, и отдельно для 6.
            // Строим оболочку, включающую все блоки. Решение плохое, требуется доработка
            int lx = unmanaged.Width;
            int ly = unmanaged.Height;
            int rx = 0;
            int ry = 0;

            for (int i = 0; i < rects.Length; ++i)
            {
                if (lx > rects[i].X)
                {
                    lx = rects[i].X;
                }
                if (ly > rects[i].Y)
                {
                    ly = rects[i].Y;
                }
                if (rx < rects[i].X + rects[i].Width)
                {
                    rx = rects[i].X + rects[i].Width;
                }
                if (ry < rects[i].Y + rects[i].Height)
                {
                    ry = rects[i].Y + rects[i].Height;
                }
            }

            // Обрезаем края, оставляя только центральные блобчики
            AForge.Imaging.Filters.Crop cropFilter = new AForge.Imaging.Filters.Crop(new Rectangle(lx, ly, rx - lx, ry - ly));
            unmanaged = cropFilter.Apply(unmanaged);

            //  Масштабируем до 100x100
            AForge.Imaging.Filters.ResizeBilinear scaleFilter = new AForge.Imaging.Filters.ResizeBilinear(100, 100);
            unmanaged = scaleFilter.Apply(unmanaged);

            return(rez);
        }
Beispiel #22
0
        // //////////////////////////////ObjectPanoramaToSTL
        private void ObjectPanoramaToSTL()
        {
            // create instance of blob counter
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter();
            // process input image
            blobCounter.ProcessImage((Bitmap)tempImages[3]);
            // get information about detected objects
            AForge.Imaging.Blob[] blobs = blobCounter.GetObjectsInformation();

            // apply the filter
            // filter.ApplyInPlace((Bitmap)filteredImages[3]);
            imgSTL = filteredImages[3];
        }
Beispiel #23
0
        /// <summary>
        /// Look at the input image and find a suitable blob.
        /// </summary>
        /// <param name="filter">HSL filter to use for image segmentation.</param>
        /// <param name="image">Input image to segment.</param>
        /// <param name="minRect">Minimum size of output blob.</param>
        /// <param name="colourBitmap">Bitmap to write binary image to.</param>
        /// <param name="maxSize">Maximum size of output blob (default value will allow any size).</param>
        /// <returns>A rectangle array of all suitable blobs, or an empty array if no suitable blobs are found.</returns>
        protected System.Drawing.Rectangle[] DetectObstacle(AForge.Imaging.Filters.HSLFiltering filter, Bitmap image, System.Drawing.Point minRect, out Bitmap colourBitmap, System.Drawing.Point maxSize = default(System.Drawing.Point))
        {
            Bitmap filtered;

                filtered = filter.Apply(image);

            //short[,] structuringElement = new short[,] { { 0, 1, 0 }, { 1, 1, 1 }, { 0, 1, 0 } };

            filtered = BinaryImage(filtered);
            //AForge.Imaging.Filters.Opening openingFilter = new AForge.Imaging.Filters.Opening(structuringElement);
            //filtered = openingFilter.Apply(filtered);
            colourBitmap = filtered;

            AForge.Imaging.BlobCounter blobs = new AForge.Imaging.BlobCounter();
            blobs.MinWidth = (int)minRect.X;
            blobs.MinHeight = (int)minRect.Y;
            if (!maxSize.IsEmpty)
            {
                blobs.MaxWidth = maxSize.X;
                blobs.MaxHeight = maxSize.Y;
            }
            blobs.FilterBlobs = true;
            blobs.ObjectsOrder = AForge.Imaging.ObjectsOrder.Size;
            blobs.ProcessImage(filtered);

            System.Drawing.Rectangle[] rectangles = blobs.GetObjectsRectangles();

            return rectangles;
        }