Emgu CV: cómo puedo obtener todas las apariciones de patrones en la imagen

Hola, ya tengo una solución de función, pero un problema:

            // 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();

el resultado es:

enter image description here

Y mi problema es que, función homography.ProjectPoints(pts); Obtenga solo la primera aparición del patrón (rectángulo blanco en la imagen de arriba)

¿Cómo puedo proyectar todas las ocurrencias de la plantilla, respectivamente, cómo puedo obtener la ocurrencia del rectángulo de la plantilla en la imagen?

preguntado el 08 de noviembre de 11 a las 13:11

1 Respuestas

Enfrento un problema similar al tuyo en mi tesis de maestría. Básicamente tienes dos opciones:

  1. Utilice una agrupación como K-medias jerárquicas o una densidad de puntos como DBSCAN (Depende de dos parámetros, pero puede hacerlo sin umbral en el espacio bidimensional R ^ 2)
  2. Utilice varias técnicas de estimación de ajuste de modelo robusto, como JLinkage. En esta técnica más avanzada, agrupa puntos que comparten una homografía en lugar de agrupar puntos que se acercan entre sí en el espacio euclidiano.

Una vez que divide sus coincidencias en "grupos", puede estimar las homografías entre las coincidencias que pertenecen a los grupos correspondientes.

respondido 09 nov., 11:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.