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); }
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); } }
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; }
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; }