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());
            }
        }
示例#2
0
文件: Form1.cs 项目: AriFreyr/Arti-CV
 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;
     }
 }
示例#3
0
        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());
        }