Эмгу CV - Как я могу получить все вхождения шаблона в изображении - PullRequest
2 голосов
/ 08 ноября 2011

Привет уже есть решение функции, но одна проблема:

            // The screenshot will be stored in this bitmap.
            Bitmap capture = new Bitmap(rec.Width, rec.Height, PixelFormat.Format24bppRgb);
            using (Graphics g = Graphics.FromImage(capture))
            {
                g.CopyFromScreen(rec.Location, new System.Drawing.Point(0, 0), rec.Size);
            }

            MCvSURFParams surfParam = new MCvSURFParams(500, false);
            SURFDetector surfDetector = new SURFDetector(surfParam);

            // Template image 
            Image<Gray, Byte> modelImage = new Image<Gray, byte>("template.jpg");
            // Extract features from the object image
            ImageFeature[] modelFeatures = surfDetector.DetectFeatures(modelImage, null);

            // Prepare current frame
            Image<Gray, Byte> observedImage = new Image<Gray, byte>(capture);
            ImageFeature[] imageFeatures = surfDetector.DetectFeatures(observedImage, null);


            // Create a SURF Tracker using k-d Tree
            Features2DTracker tracker = new Features2DTracker(modelFeatures);

            Features2DTracker.MatchedImageFeature[] matchedFeatures = tracker.MatchFeature(imageFeatures, 2);
            matchedFeatures = Features2DTracker.VoteForUniqueness(matchedFeatures, 0.8);
            matchedFeatures = Features2DTracker.VoteForSizeAndOrientation(matchedFeatures, 1.5, 20);
            HomographyMatrix homography = Features2DTracker.GetHomographyMatrixFromMatchedFeatures(matchedFeatures);

            // Merge the object image and the observed image into one image for display
            Image<Gray, Byte> res = modelImage.ConcateVertical(observedImage);

            #region draw lines between the matched features

            foreach (Features2DTracker.MatchedImageFeature matchedFeature in matchedFeatures)
            {
                PointF p = matchedFeature.ObservedFeature.KeyPoint.Point;
                p.Y += modelImage.Height;
                res.Draw(new LineSegment2DF(matchedFeature.SimilarFeatures[0].Feature.KeyPoint.Point, p), new Gray(0), 1);
            }

            #endregion

            #region draw the project region on the image

            if (homography != null)
            {
                // draw a rectangle along the projected model
                Rectangle rect = modelImage.ROI;
                PointF[] pts = new PointF[] { 
                    new PointF(rect.Left, rect.Bottom),
                    new PointF(rect.Right, rect.Bottom),
                    new PointF(rect.Right, rect.Top),
                    new PointF(rect.Left, rect.Top)
                };

                homography.ProjectPoints(pts);

                for (int i = 0; i < pts.Length; i++)
                    pts[i].Y += modelImage.Height;

                res.DrawPolyline(Array.ConvertAll<PointF, Point>(pts, Point.Round), true, new Gray(255.0), 2);
            }

            #endregion

            pictureBoxScreen.Image = res.ToBitmap();

результат:

enter image description here

И моя проблема в том, что функция homography.ProjectPoints(pts);Получить только первое вхождение шаблона (белый прямоугольник на рисунке выше)

Как я могу спроецировать все вхождения шаблона, соответственно, как я могу получить вхождение шаблона прямоугольника в изображение

1 Ответ

1 голос
/ 09 ноября 2011

Я столкнулся с проблемой, аналогичной вашей в моей магистерской диссертации.В основном у вас есть два варианта:

  1. Использовать кластеризацию, такую ​​как Иерархическое k-среднее или плотность точек, такую ​​как DBSCAN (зависит от двух параметровно вы можете сделать его свободным от порогов в двумерном пространстве R ^ 2)
  2. Использовать методики оценки подбора нескольких надежных моделей, такие как JLinkage .В этом более продвинутом методе вы группируете точки, которые разделяют гомографию, а не точки кластеров, которые близки друг к другу в евклидовом пространстве.

Разделяя свои совпадения на «кластеры», вы можете оценить гомографии между совпадениями, принадлежащимив соответствующие кластеры.

...