private Tuple <Bitmap, int> CreatePreviewImage(string imgPath, double val) { var q1 = new Image <Bgr, byte>(imgPath); var w3 = ExtensionMethods.FindContours (q1.Copy().Convert <Gray, byte>().GaussBlur().AdaptiveThreshold().Dilate(8).Erode()); var avg = ExtensionMethods.CalculateAvreage(w3.Item1, val); var e4 = new VectorOfVectorOfPoint(); for (var i = 0; i < w3.Item1.Size; i++) { if (CvInvoke.ContourArea(w3.Item1[i]) > avg) { e4.Push(w3.Item1[i]); } } var boundRect = new List <Rectangle>(); for (var i = 0; i < e4.Size; i++) { boundRect.Add(CvInvoke.BoundingRectangle(e4[i])); } var puzzelCounter = 0; var avgX = new int[boundRect.Count]; var avgY = new int[boundRect.Count]; foreach (var r in boundRect) { avgX[puzzelCounter] = r.X; avgY[puzzelCounter] = r.Y; puzzelCounter++; q1 = q1.Rectangle (r, new MCvScalar(250, 0, 250)) .PutText ( puzzelCounter.ToString() , new Point(r.X + r.Width / 2, r.Y + r.Height / 2) , new MCvScalar(255, 0, 255) , FontFace.HersheySimplex , 10 , 20); } var assumedConfiguration = ExtensionMethods.AssumePuzzleConfiguration(avgX, avgY); X_axis.Value = assumedConfiguration[1]; Y_axis.Value = assumedConfiguration[0]; return(new Tuple <Bitmap, int>(q1.ToBitmap(), puzzelCounter)); }
private void Worker_DoWork(object sender, DoWorkEventArgs e) { //Invoke(new Action(delegate { Progress(int, string); })); #region Indentyfikacja puzzli Invoke(new Action(delegate { Progress(0, "Wczytywanie obrazka."); })); var q1 = new Image <Bgr, byte>(ExtensionMethods.ImagePath); Invoke(new Action(delegate { Progress(33, "Wstępna obróbka obrazka."); })); var w3 = ExtensionMethods.FindContours (q1.Copy().Convert <Gray, byte>().GaussBlur().AdaptiveThreshold().Dilate(8).Erode()); var avg = ExtensionMethods.CalculateAvreage(w3.Item1, Prog); var e4 = new VectorOfVectorOfPoint(); for (var i = 0; i < w3.Item1.Size; i++) { if (CvInvoke.ContourArea(w3.Item1[i]) > avg) { e4.Push(w3.Item1[i]); } } var boundRect = new List <Rectangle>(); for (var i = 0; i < e4.Size; i++) { boundRect.Add(CvInvoke.BoundingRectangle(e4[i])); } var puzzels = new List <Image <Bgr, byte> >(); Invoke(new Action(delegate { Progress(50, "Znajdowanie puzzli"); })); var puzzleCount = 0; foreach (var r in boundRect) { puzzleCount++; var img = q1.Copy(); img.ROI = r; puzzels.Add(img.Copy()); q1 = q1.Rectangle(r, new MCvScalar(255, 0, 255)); q1 = q1.PutText ( puzzleCount.ToString() , new Point(r.X + r.Width / 2, r.Y + r.Height / 2) , new MCvScalar(255, 0, 255) , FontFace.HersheySimplex , 10 , 20); } #endregion Indentyfikacja puzzli #region Cechy wspólne Invoke(new Action(delegate { Progress(66, "Detekcja cech wspólnych."); })); var surf = new SURF(920); var puzzelCounter = puzzels.Count; var avgPuzellXPoints = new double[puzzelCounter]; var avgPuzellYPoints = new double[puzzelCounter]; puzzelCounter = 0; Invoke(new Action(delegate { Progress(70, "Znajdowanie puktów charakterystycznych dla orginalnego obrazu."); })); var orginal = new Image <Bgr, byte>(ExtensionMethods.OrginalImagePath); var copyOrginal = orginal.Copy(); var orginalFeatures = ExtensionMethods.DetectAndCompute(surf, copyOrginal, false); var odesc = orginalFeatures.Item1; var orginalKeypoints = orginalFeatures.Item2; #endregion Cechy wspólne #region Dopasowanie Invoke(new Action(delegate { Progress(80, "Próba dopasowania puzzli."); })); var matcher = new BFMatcher(DistanceType.L2); matcher.Add(odesc); foreach (var puzzel in puzzels) { var pdesc = surf.DetectAndCompute(puzzel); var puzzelmatches = matcher.KnnMatch(pdesc, 3); double x = 0; double y = 0; var count = 0; for (var i = 0; i < puzzelmatches.Size; i++) { var arrayOfMatches = puzzelmatches[i].ToArray(); foreach (var match in arrayOfMatches) { if (!(match.Distance > MatchDistance)) { continue; } x += orginalKeypoints[match.TrainIdx].Point.X; y += orginalKeypoints[match.TrainIdx].Point.Y; count++; } } x = x / count; y = y / count; avgPuzellXPoints[puzzelCounter] = x; avgPuzellYPoints[puzzelCounter] = y; puzzelCounter++; } #endregion Dopasowanie #region Układanie puzzli Invoke(new Action(delegate { Progress(90, "Układanie puzzli w właściwej kolejnoścu."); })); var resultTab = ExtensionMethods.PlacePuzzels(XAx, YAx, avgPuzellXPoints, avgPuzellYPoints); Invoke(new Action(delegate { Progress(90, "Tworzenie obrazka końcowego."); })); var fp = ExtensionMethods.GenerateFinalpicture(XAx, YAx, resultTab, puzzels); var finalword = "Puzzle należy ułożyć w kolejności:" + Environment.NewLine; for (var i = 0; i < puzzelCounter; i++) { resultTab[i]++; //przetwarzając przetwarzałem od zera a puzzle są od 1 ..więc finalword += resultTab[i]; finalword += " "; if (i != 0 && (i + 1) % XAx == 0) { finalword += Environment.NewLine; } } var solution = new Bitmap(q1.Width / 2, q1.Height / 2); solution.DrawSymbol (finalword, new SolidBrush(Color.Gray), new Font(FontFamily.GenericSerif, 40), new SolidBrush(Color.Black)); #endregion Układanie puzzli #region Zapisywanie Invoke(new Action(delegate { Progress(99, "Zapisywanie postępów."); })); ExtensionMethods.ImageOut.Add(q1.ToBitmap()); ExtensionMethods.ImageOut.Add(solution); ExtensionMethods.ImageOut.Add(fp.ToBitmap()); Invoke(new Action(delegate { Progress(100, "DONE"); })); Thread.Sleep(100); #endregion Zapisywanie }