public void markerBasedDetectorTest()
        {
            MarkerBasedDetectorFactory factory = new MarkerBasedDetectorFactory();
            MarkerBasedDetector sut = (MarkerBasedDetector)factory.CreateDetector();
            sut.ResetSettings();

            ColorDiscriminator discr = new ColorDiscriminator();
            RGB color = new RGB(237, 28, 36);
            discr.RGB_color= color;
            LocationSourceManager.Instance.Shutdown();
            LocationSourceManager.Instance.createLocationSource("foo", discr);

            Bitmap frame = new Bitmap(Properties.Resources.markerBasedDetectorTestFrame);
            sut.Detect(ref frame);
            IntPoint pos = LocationSourceManager.Instance.LocationSources[0].ScreenPos;
            Assert.AreEqual(87, pos.X);
            Assert.AreEqual(92, pos.Y);
        }
Esempio n. 2
0
 override public bool IsSimilar(Discriminator other)
 {
     if (other is ColorDiscriminator)
     {
         ColorDiscriminator otherColorDiscriminator = (ColorDiscriminator)other;
         int diff = otherColorDiscriminator.color.Hue - this.color.Hue;
         if (diff < 0)
         {
             diff = -diff;
         }
         if (diff < this.threshold)
         {
             return(true);
         }
         else
         {
             return(false);
         }
     }
     else
     {
         return(false);
     }
 }
Esempio n. 3
0
        public void Detect(ref Bitmap image)
        {
            List <List <IntPoint> > markers = new List <List <IntPoint> >();
            Bitmap tmp = image;

            BitmapData     bitmapData     = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, image.PixelFormat);
            UnmanagedImage unmanagedImage = new UnmanagedImage(bitmapData);

            UnmanagedImage grayImage = UnmanagedImage.Create(unmanagedImage.Width, unmanagedImage.Height, PixelFormat.Format8bppIndexed);

            Grayscale.CommonAlgorithms.BT709.Apply(unmanagedImage, grayImage);

            DifferenceEdgeDetector edgeDetector = new DifferenceEdgeDetector();
            UnmanagedImage         edgesImage   = edgeDetector.Apply(grayImage);

            image.UnlockBits(bitmapData);

            if (this.edgeImage.Checked)
            {
                tmp = edgesImage.ToManagedImage().Clone(new Rectangle(0, 0, edgesImage.Width, edgesImage.Height), PixelFormat.Format24bppRgb);
            }

            Threshold thresholdFilter = new Threshold(this.binThreshold);

            thresholdFilter.ApplyInPlace(edgesImage);

            if (this.thresholdEdgeImage.Checked)
            {
                tmp = edgesImage.ToManagedImage().Clone(new Rectangle(0, 0, edgesImage.Width, edgesImage.Height), PixelFormat.Format24bppRgb);
            }

            this.blobCounter.ProcessImage(edgesImage);
            Blob[] blobs = blobCounter.GetObjectsInformation();

            for (int i = 0, n = blobs.Length; i < n; i++)
            {
                List <IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);
                List <IntPoint> corners    = null;


                if (this.isSquare(edgePoints, out corners))
                {
                    List <IntPoint> leftEdgePoints, rightEdgePoints;
                    blobCounter.GetBlobsLeftAndRightEdges(blobs[i],
                                                          out leftEdgePoints, out rightEdgePoints);

                    float diff = calculateAverageEdgesBrightnessDifference(
                        leftEdgePoints, rightEdgePoints, grayImage);

                    if (diff > 50)
                    {
                        markers.Add(corners);
                    }
                }
            }

            foreach (List <IntPoint> marker in markers)
            {
                Color    markerColor;
                IntPoint markerOrientation = this.markerOrientation(image, marker, out markerColor);
                IntPoint center            = marker[2] - marker[0];
                center.X = marker[0].X + Convert.ToInt32(center.X * 0.5);
                center.Y = marker[0].Y + Convert.ToInt32(center.Y * 0.5);

                if (this.drawMarkersOnVideo.Checked)
                {
                    if ((this.edgeImage.Checked) || (this.thresholdEdgeImage.Checked))
                    {
                        this.drawMarker(tmp, marker, markerOrientation, markerColor);
                    }
                    else
                    {
                        this.drawMarker(image, marker, markerOrientation, markerColor);
                    }
                }
                ColorDiscriminator discriminator = new ColorDiscriminator();
                discriminator.Color = markerColor;

                LocationSourceManager.Instance.updateLocationSource(discriminator, center);
            }
            image = tmp;
        }
Esempio n. 4
0
 private void mainVideo_Click(object sender, EventArgs e)
 {
     if (mainVideo.IsRunning && (this.colorPicker != null))
     {
         Bitmap frame = mainVideo.GetCurrentVideoFrame();
         this.colorPicker.Color = frame.GetPixel(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y);
     }
     this.colorPicker = null;
 }
        public void Detect(ref Bitmap image)
        {
            List<List<IntPoint>> markers = new List<List<IntPoint>>();
            Bitmap tmp = image;

            BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, image.PixelFormat);
            UnmanagedImage unmanagedImage = new UnmanagedImage(bitmapData);

            UnmanagedImage grayImage = UnmanagedImage.Create(unmanagedImage.Width, unmanagedImage.Height, PixelFormat.Format8bppIndexed);
            Grayscale.CommonAlgorithms.BT709.Apply(unmanagedImage, grayImage);

            DifferenceEdgeDetector edgeDetector = new DifferenceEdgeDetector();
            UnmanagedImage edgesImage = edgeDetector.Apply(grayImage);

            image.UnlockBits(bitmapData);

            if (this.edgeImage.Checked)
                tmp = edgesImage.ToManagedImage().Clone(new Rectangle(0,0,edgesImage.Width, edgesImage.Height), PixelFormat.Format24bppRgb);

            Threshold thresholdFilter = new Threshold(this.binThreshold);
            thresholdFilter.ApplyInPlace(edgesImage);

            if (this.thresholdEdgeImage.Checked)
                tmp = edgesImage.ToManagedImage().Clone(new Rectangle(0, 0, edgesImage.Width, edgesImage.Height), PixelFormat.Format24bppRgb);

            this.blobCounter.ProcessImage(edgesImage);
            Blob[] blobs = blobCounter.GetObjectsInformation();

            for (int i = 0, n = blobs.Length; i < n; i++)
            {
                List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);
                List<IntPoint> corners = null;

                if (this.isSquare(edgePoints, out corners))
                {
                    List<IntPoint> leftEdgePoints, rightEdgePoints;
                    blobCounter.GetBlobsLeftAndRightEdges(blobs[i],
                        out leftEdgePoints, out rightEdgePoints);

                    float diff = calculateAverageEdgesBrightnessDifference(
                        leftEdgePoints, rightEdgePoints, grayImage);

                    if (diff > 50)
                    {
                        markers.Add(corners);
                    }
                }
            }

            foreach (List<IntPoint> marker in markers)
            {
                Color markerColor;
                IntPoint markerOrientation = this.markerOrientation(image, marker, out markerColor);
                IntPoint center = marker[2] - marker[0];
                center.X = marker[0].X + Convert.ToInt32(center.X * 0.5);
                center.Y = marker[0].Y + Convert.ToInt32(center.Y * 0.5);

                if (this.drawMarkersOnVideo.Checked)
                {
                    if ((this.edgeImage.Checked) || (this.thresholdEdgeImage.Checked))
                        this.drawMarker(tmp, marker, markerOrientation, markerColor);
                    else
                        this.drawMarker(image, marker, markerOrientation, markerColor);
                }
                ColorDiscriminator discriminator = new ColorDiscriminator();
                discriminator.Color = markerColor;

                LocationSourceManager.Instance.updateLocationSource(discriminator, center);
            }
            image = tmp;
        }