private void timerTick(object sender, EventArgs e) { Console.WriteLine("TICK!"); var image = new Bitmap(videoCapture.QueryFrame().Bitmap); var undistoredImage = UndistorImage(image); var resultAfterStep1 = (MyImage)undistoredImage; resultAfterStep1 = GrayScaleFilter.Convert(resultAfterStep1); var resultAfterStep2 = BinarizationConverter.Convert(resultAfterStep1); var resultAfterStep3 = SobelFilter.Convert(resultAfterStep2); var candidateCorners = CornerDetector.FindCorners(resultAfterStep3); var markerCorners = MarkersRecognizer.SelectMarkers(candidateCorners, undistoredImage); var miniImage = new Bitmap(undistoredImage, new Size(undistoredImage.Width / sizer, undistoredImage.Height / sizer)); g.DrawImage(miniImage, 0, 0, miniImage.Width, miniImage.Height); foreach (var corners in markerCorners) { g.DrawPolygon(pen, corners.Select(p => new Point(p.X / sizer, p.Y / sizer)).ToArray()); } }
private void comboBoxCornerDetector_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxCornerDetector.SelectedIndex.Equals(0)) { selectedCornerDetector = CornerDetector.FAST; } else if (comboBoxCornerDetector.SelectedIndex.Equals(1)) { selectedCornerDetector = CornerDetector.SURF; } else if (comboBoxCornerDetector.SelectedIndex.Equals(2)) { selectedCornerDetector = CornerDetector.HCD; } }
public static List <Point[]> SelectMarkers(List <Point[]> candidateCorners, Bitmap undistoredImage) { return(candidateCorners.Where(corners => { int minX = int.MaxValue; int maxX = int.MinValue; int minY = int.MaxValue; int maxY = int.MinValue; double perimeter = 0; for (int i = 0; i < corners.Length; i++) { perimeter += Math.Sqrt(Math.Pow(corners[i].X - corners[(i + 1) % corners.Length].X, 2) + Math.Pow(corners[i].Y - corners[(i + 1) % corners.Length].Y, 2)); minX = Math.Min(minX, corners[i].X); maxX = Math.Max(maxX, corners[i].X); minY = Math.Min(minY, corners[i].Y); maxY = Math.Max(maxY, corners[i].Y); } var side = perimeter / 4; var total_cnt = 0; var border_cnt = 0; double border_sum = 0; for (int x = minX; x <= maxX; x++) { for (int y = minY; y <= maxY; y++) { if (CornerDetector.checkPointInPolygon(new Point(x, y), corners.ToList())) { total_cnt++; var dist = Douglas_Peucker.CalcDistFromPointToPolygon(new Point(x, y), corners); var pixel = undistoredImage.GetPixel(x, y); var res = 0.21 * pixel.R + 0.72 * pixel.G + 0.07 * pixel.B; if (dist < side * borderRate) { border_cnt++; border_sum += res; } } } } var average = border_sum / border_cnt; return average <= blackThreshold; }).ToList()); }