private Task InitCells(IImageFeatureExtractor featureExtractor) { return(Task.Run(() => { _completedCells = new Image[GridSize.Height, GridSize.Width]; _targetCellFeatures = new IImageFeatureSet[GridSize.Height, GridSize.Width]; // subdivide the target image into grid of (rows x cols) cells and extract features for each var resizedTarget = ImageUtils.MakeGrayscale(new Bitmap(2, 2, PixelFormat.Format24bppRgb), TargetImageSize); using (var g = Graphics.FromImage(resizedTarget)) { g.DrawImage(TargetImage, 0, 0, TargetImageSize.Width, TargetImageSize.Height); } for (int r = 0; r < GridSize.Height; r++) { for (int c = 0; c < GridSize.Width; c++) { var imageRect = new Rectangle(new Point(CellSize.Width * c, CellSize.Height * r), CellSize); var cellImage = resizedTarget.Clone(imageRect, PixelFormat.Format24bppRgb); _targetCellFeatures[r, c] = featureExtractor.ExtractFeatures(cellImage); } } resizedTarget.Dispose(); })); }
private Task AssignImagesToCells(IImageSource imageSource, IImageFeatureExtractor featureExtractor, CancellationToken cancelToken) { var remainingCells = (from R in Enumerable.Range(0, GridSize.Height) from C in Enumerable.Range(0, GridSize.Width) select new { R, C, Target = GetTargetCell(R, C) }).ToArray(); return(Task.Run(async() => { while (!cancelToken.IsCancellationRequested) { if (IsComplete) { System.Console.WriteLine("Mosaic is complete!"); break; } var nextImage = await imageSource.GetNextImage(cancelToken); if (nextImage != null) { System.Console.WriteLine($"Attempting to match image {nextImage.Id} with remaining {remainingCells.Count()} cells..."); var nextImageReduced = ImageUtils.MakeGrayscale(nextImage.RawImage, CellSize); var features = featureExtractor.ExtractFeatures(nextImageReduced); remainingCells = remainingCells.Where(c => GetCompletedCell(c.R, c.C) == null).ToArray(); foreach (var cell in remainingCells.Where(c => features.IsMatch(c.Target))) { SetCompletedCell(cell.R, cell.C, nextImageReduced); System.Console.WriteLine($" MATCH: '{nextImage.Id}' --> cell r:{cell.R}, c:{cell.C}"); } nextImage.RawImage.Dispose(); } else { // hacky, fix this up System.Console.WriteLine("ERROR: Failed to retreive any images, quitting..."); break; } } })); }