Пример #1
0
        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;
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
        }