Exemplo n.º 1
0
        private static void CompareImages(Mat scene, Mat toolbarObject, Mat wordbrainObject)
        {
            SURFData toolbarSurfResults   = ExecuteSurfDetection(toolbarObject);
            SURFData wordbrainSurfResults = ExecuteSurfDetection(wordbrainObject);
            SURFData sceneSurfResults     = ExecuteSurfDetection(scene);

            Mat drawnMatches = new Mat();

            VectorOfVectorOfDMatch toolbarMatchResults   = GetSceneMatchesForModel(sceneSurfResults, toolbarSurfResults);
            VectorOfVectorOfDMatch wordbrainMatchResults = GetSceneMatchesForModel(sceneSurfResults, wordbrainSurfResults);

            MKeyPoint[] sceneKeyPoints = sceneSurfResults.KeyPoints.ToArray();

            Point highestKeyPoint = toolbarMatchResults.ToArrayOfArray()
                                    .Select(m => Point.Round(sceneKeyPoints[m[0].QueryIdx].Point))
                                    .OrderBy(kp => kp.Y)
                                    .FirstOrDefault();

            Point lowestKeyPoint = wordbrainMatchResults.ToArrayOfArray()
                                   .Select(m => Point.Round(sceneKeyPoints[m[0].QueryIdx].Point))
                                   .OrderByDescending(kp => kp.Y)
                                   .FirstOrDefault();

            int rectangleHeight = highestKeyPoint.Y - lowestKeyPoint.Y;

            Image <Gray, byte> sceneImage = scene.ToImage <Gray, Byte>();

            Console.WriteLine(sceneImage.Width);
            Console.WriteLine(sceneImage.Height);

            Rectangle rectangle = new Rectangle(0, lowestKeyPoint.Y, scene.Width, rectangleHeight);

            //sceneImage.Draw("X", highestKeyPoint, FontFace.HersheyPlain, 5, new Gray(255), thickness: 2);
            //sceneImage.Draw("X", lowestKeyPoint, FontFace.HersheyPlain, 5, new Gray(255), thickness: 2);
            //sceneImage.Draw(rectangle, new Gray(10), 5);
            //ImageViewer.Show(sceneImage);
            //Features2DToolbox.DrawMatches(toolbarObject, toolbarSurfResults.KeyPoints, scene,
            //    sceneSurfResults.KeyPoints, limitMatches, drawnMatches, new MCvScalar(255), new MCvScalar(255), null, Features2DToolbox.KeypointDrawType.NotDrawSinglePoints);

            Image <Gray, byte> sliced = sceneImage.Copy(rectangle);

            sliced.Save("../../../characters/characters-and-clues-result.jpg");
            ImageViewer.Show(sliced);
        }
Exemplo n.º 2
0
        private static VectorOfVectorOfDMatch GetSceneMatchesForModel(SURFData sceneData, SURFData modelData)
        {
            FlannBasedMatcher matcher =
                new FlannBasedMatcher(new HierarchicalClusteringIndexParams(), new SearchParams());

            matcher.Add(modelData.Descriptors);

            VectorOfVectorOfDMatch matches = new VectorOfVectorOfDMatch();

            matcher.KnnMatch(sceneData.Descriptors, matches, 1, null);

            MDMatch[][] newMatches = matches
                                     .ToArrayOfArray()
                                     .OrderBy(m => m[0].Distance)
                                     .Take(8)
                                     .ToArray();

            VectorOfVectorOfDMatch limitMatches = new VectorOfVectorOfDMatch(newMatches);

            matches.Dispose();
            return(limitMatches);
        }