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); }
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); }