private void button1_Click(object sender, EventArgs e) { IOHelper.DeletePictures(); MinValueHarris = Convert.ToDouble(txb_minValue.Text); WindowSize = Convert.ToInt32(txb_WindowSize.Text); int maxPoints = Convert.ToInt32(txb_Filter.Text); int gridSize = Convert.ToInt32(txb_gridSize.Text); int cellSize = Convert.ToInt32(txb_cellSize.Text); int binsCount = Convert.ToInt32(txb_binsCount.Text); if (filter_checkBox.Checked == true) { maxPoints = Convert.ToInt32(txb_Filter.Text); } else { maxPoints = 5000; } List <ForDescriptor.Descriptor> descriptorsA = BlobsFinder.FindBlobs(imageA, maxPoints); List <ForDescriptor.Descriptor> descriptorsB = BlobsFinder.FindBlobs(imageB, maxPoints); List <ValueTuple <ForDescriptor.Descriptor, ForDescriptor.Descriptor> > match; if (rbt_usual.Checked == true) { match = DescriptorMatcher.Match(descriptorsA, descriptorsB); } else if (rbt_NNDR.Checked == true) { match = DescriptorMatcher.Nndr(descriptorsA, descriptorsB); } else { match = DescriptorMatcher.Match(descriptorsA, descriptorsB); } lbl_findPoints1.Text = "Найдено интересных точек(1): " + descriptorsA.Count; lbl_findPoints2.Text = "Найдено интересных точек(2): " + descriptorsB.Count; lbl_PairCount.Text = "Найдено пар точек: " + match.Count; var image = DrawHelper.DrawTwoImages( DrawHelper.DrawPoints(imageA, descriptorsA), DrawHelper.DrawPoints(imageB, descriptorsB), match); // var image = DrawHelper.DrawPoints(imageA, descriptorsA); IOHelper.WriteImageToFile(image, "..\\..\\..\\..\\Output\\OutputPicture.png"); pictureBox1.Image = image; }
private void button2_Click(object sender, EventArgs e) { int maxPoints = Convert.ToInt32(txb_Filter.Text); string name = PathToWriteImage + "resultPicture.jpg"; Bitmap bmp1 = new Bitmap(PathToReadImage + "bridge1.jpg"); Bitmap bmp2 = new Bitmap(PathToReadImage + "bridge2.jpg"); var descriptorsABlobs = BlobsFinder.FindBlobs(IOHelper.ImageToMat(bmp1), maxPoints); var descriptorsBBlobs = BlobsFinder.FindBlobs(IOHelper.ImageToMat(bmp2), maxPoints); var match = DescriptorMatcher.Nndr(descriptorsABlobs, descriptorsBBlobs); lbl_findPoints1.Text = "Найдено интересных точек(1): " + descriptorsABlobs.Count; lbl_findPoints2.Text = "Найдено интересных точек(2): " + descriptorsBBlobs.Count; lbl_PairCount.Text = "Найдено пар точек: " + match.Count; var(matrixA, matrixB) = Ransac.CalculateTransform(match); var result = Transformer.Transform(bmp1, bmp2, matrixA, matrixB); result.Save(name, ImageFormat.Jpeg); pictureBox1.Image = result; }
public List <Point[]> Find() { CoordinateStep = Math.Min(image.Width, image.Height) / 5; var cellsX = (int)Math.Ceiling(image.Width * 1D / CoordinateStep); var cellsY = (int)Math.Ceiling(image.Height * 1D / CoordinateStep); VotesImage = IOHelper.MatToImage(image); for (var i = 1; i < cellsX; i++) { var x = CoordinateStep * i; DrawHelper.DrawLine(VotesImage, x, 0, x, image.Height - 1); } for (var i = 1; i < cellsY; i++) { var y = CoordinateStep * i; DrawHelper.DrawLine(VotesImage, 0, y, image.Width - 1, y); } var descriptors1 = BlobsFinder.FindBlobs(sample, 500); var descriptors2 = BlobsFinder.FindBlobs(image, 500); var matches = DescriptorMatcher.Nndr(descriptors2, descriptors1); ReverseMatches = matches.Select(x => new Match(x.Item2, x.Item1)).ToList(); var sampleCenterX = sample.Width / 2.0; var sampleCenterY = sample.Height / 2.0; votes = new double[cellsX, cellsY, AngleCells, CellsScale]; voters = new List <Match> [cellsX, cellsY, AngleCells, CellsScale]; foreach (var match in matches) { var samplePoint = match.Item2.Point; var imagePoint = match.Item1.Point; var scale = imagePoint.Radius / samplePoint.Radius; var angle = match.Item2.Angle - match.Item1.Angle; var vectorX = scale * (sampleCenterX - samplePoint.getX()); var vectorY = scale * (sampleCenterY - samplePoint.getY()); var centerX = imagePoint.getX() + vectorX * Math.Cos(angle) - vectorY * Math.Sin(angle); var centerY = imagePoint.getY() + vectorX * Math.Sin(angle) + vectorY * Math.Cos(angle); Vote(match, centerX, centerY, scale, angle); DrawHelper.DrawLine(VotesImage, imagePoint.getX(), imagePoint.getY(), (int)Math.Round(centerX), (int)Math.Round(centerY)); } for (var x = 0; x < cellsX; x++) { for (var y = 0; y < cellsY; y++) { for (var a = 0; a < AngleCells; a++) { for (var s = 0; s < CellsScale; s++) { if (IsVotesLocalMaximum(x, y, a, s) && voters[x, y, a, s].Count > VotersThreshold) { // DrawHelper.DrawPolygon(VotesImage, GetPreliminary(x, y, a, s), true); objects.Add(GetLocation(Ransac.CalculateTransform(voters[x, y, a, s]))); } } } } } return(objects); }