private void btnRansac_Click(object sender, EventArgs e) { if (correlationPoints1 == null) { MessageBox.Show("Please, click Nearest Neighbor button first! :-)"); return; } if (correlationPoints1.Length < 4 || correlationPoints2.Length < 4) { MessageBox.Show("Insufficient points to attempt a fit."); return; } // Step 3: Create the homography matrix using a robust estimator RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99); homography = ransac.Estimate(correlationPoints1, correlationPoints2); // Plot RANSAC results against correlation results IntPoint[] inliers1 = correlationPoints1.Get(ransac.Inliers); IntPoint[] inliers2 = correlationPoints2.Get(ransac.Inliers); // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(img1); Bitmap img3 = concat.Apply(img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( inliers1, // Add image1's width to the X points to show the markings correctly inliers2.Apply(p => new IntPoint(p.X + img1.Width, p.Y))); pictureBox.Image = pairs.Apply(img3); }
private void btnCorrelation_Click(object sender, EventArgs e) { if (surfPoints1 == null) { MessageBox.Show("Please, click SURF button first! :-)"); return; } // Step 2: Match feature points using a k-NN KNearestNeighborMatching matcher = new KNearestNeighborMatching(5); IntPoint[][] matches = matcher.Match(surfPoints1, surfPoints2); // Get the two sets of points correlationPoints1 = matches[0]; correlationPoints2 = matches[1]; // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(img1); Bitmap img3 = concat.Apply(img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( correlationPoints1, // Add image1's width to the X points to show the markings correctly correlationPoints2.Apply(p => new IntPoint(p.X + img1.Width, p.Y))); pictureBox.Image = pairs.Apply(img3); }
private void knn() { KNearestNeighborMatching matcher = new KNearestNeighborMatching(5); IntPoint[][] matches = matcher.Match(surfPoints1, surfPoints2); // Get the two sets of points correlationPoints1 = matches[0]; correlationPoints2 = matches[1]; // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(img1); Bitmap img3 = concat.Apply(img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( correlationPoints1, // Add image1's width to the X points to show the markings correctly correlationPoints2.Apply(p => new IntPoint(p.X + img1.Width, p.Y))); img3 = img3.Clone(new Rectangle(0, 0, img3.Width, img3.Height), PixelFormat.Format24bppRgb); var pic = pairs.Apply(img3); pictureBox1.Image = pic; }
private void button2_Click(object sender, EventArgs e) { // Step 3: Create the homography matrix using a robust estimator RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99); homography = ransac.Estimate(correlationPoints1, correlationPoints2); // Plot RANSAC results against correlation results IntPoint[] inliers1 = correlationPoints1.Submatrix(ransac.Inliers); IntPoint[] inliers2 = correlationPoints2.Submatrix(ransac.Inliers); // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(img1); Bitmap img3 = concat.Apply(img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( inliers1, // Add image1's width to the X points to show the markings correctly inliers2.Apply(p => new IntPoint(p.X + img1.Width, p.Y))); pictureBox1.Image = pairs.Apply(img3); numA.Value = (decimal)homography.Elements[0]; numB.Value = (decimal)homography.Elements[1]; numC.Value = (decimal)homography.Elements[2]; numD.Value = (decimal)homography.Elements[3]; numE.Value = (decimal)homography.Elements[4]; numF.Value = (decimal)homography.Elements[5]; numG.Value = (decimal)homography.Elements[6]; numH.Value = (decimal)homography.Elements[7]; }
protected void drawFastHarrisFeaturesCorrelations(List <Bitmap> imgs) { List <IntPoint[]> harrisPoints = new List <IntPoint[]>(); MatrixH homography; //Calculate all the Harris Points HarrisCornersDetector harris = new HarrisCornersDetector(0.03f, 10000f); foreach (Bitmap img in imgs) { harrisPoints.Add(harris.ProcessImage(img).ToArray()); } //Map them and draw them! Bitmap harrisImg = imgs[0]; for (int i = 0; i < imgs.Count - 1; i++) { //Correlate the Harris pts between imgs CorrelationMatching matcher = new CorrelationMatching(5, imgs[i], imgs[i + 1]); IntPoint[][] matches = matcher.Match(harrisPoints[i], harrisPoints[i + 1]); //Create the homography matrix using ransac RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.025, 0.99); homography = ransac.Estimate(matches[0], matches[1]); Concatenate concat = new Concatenate(harrisImg); Bitmap img = concat.Apply(imgs[i + 1]); Color color = Color.White; if (i % 3 == 1) { color = Color.OrangeRed; } if (i % 3 == 2) { color = Color.Blue; } PairsMarker pairs = new PairsMarker(matches[0].Apply(p => new IntPoint(p.X + harrisImg.Width - imgs[0].Width, p.Y)), matches[1].Apply(p => new IntPoint(p.X + harrisImg.Width, p.Y)), color); harrisImg = pairs.Apply(img); } showImage(harrisImg); }
/// <summary> /// </summary> /// <param name="sender"> /// </param> /// <param name="e"> /// </param> private void BtnCorrelation_OnClick(object sender, RoutedEventArgs e) { // Step 2: Match feature points using a correlation measure var matcher = new CorrelationMatching(9, this.img1, this.img2); var matches = matcher.Match(this.harrisPoints1, this.harrisPoints2); // Get the two sets of points this.correlationPoints1 = matches[0]; this.correlationPoints2 = matches[1]; // Concatenate the two images in a single image (just to show on screen) var concat = new Concatenate(this.img1); var img3 = concat.Apply(this.img2); // Show the marked correlations in the concatenated image var pairs = new PairsMarker(this.correlationPoints1, // Add image1's width to the X points to show the markings correctly this.correlationPoints2.Apply(p => new IntPoint(p.X + this.img1.Width, p.Y))); this.PictureBox.Source = (ImageSource)pairs.Apply(img3); }
private void btnCorrelation_Click(object sender, EventArgs e) { // Step 2: Match feature points using a correlation measure CorrelationMatching matcher = new CorrelationMatching(9); IntPoint[][] matches = matcher.Match(img1, img2, harrisPoints1, harrisPoints2); // Get the two sets of points correlationPoints1 = matches[0]; correlationPoints2 = matches[1]; // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(img1); Bitmap img3 = concat.Apply(img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( correlationPoints1, // Add image1's width to the X points to show the markings correctly correlationPoints2.Apply(p => new IntPoint(p.X + img1.Width, p.Y))); pictureBox.Image = pairs.Apply(img3); }
// Robust homography estimation private void RansacRobustHomographer() { // Step 3: Create the homography matrix using a robust estimator RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99); homography = ransac.Estimate(correlationPoints1, correlationPoints2); // Plot RANSAC results against correlation results IntPoint[] inliers1 = correlationPoints1.Submatrix(ransac.Inliers); IntPoint[] inliers2 = correlationPoints2.Submatrix(ransac.Inliers); // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(_img1); Bitmap img3 = concat.Apply(_img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( inliers1, // Add image1's width to the X points to show the markings correctly inliers2.Apply(p => new IntPoint(p.X + _img1.Width, p.Y))); _processImage3 = pairs.Apply(img3); }
/// <summary> /// </summary> /// <param name="sender"> /// </param> /// <param name="e"> /// </param> private void BtnRansac_OnClick(object sender, RoutedEventArgs e) { // Step 3: Create the homography matrix using a robust estimator var ransac = new RansacHomographyEstimator(0.001, 0.99); this.homography = ransac.Estimate(this.correlationPoints1, this.correlationPoints2); // Plot RANSAC results against correlation results var inliers1 = this.correlationPoints1.Submatrix(ransac.Inliers); var inliers2 = this.correlationPoints2.Submatrix(ransac.Inliers); // Concatenate the two images in a single image (just to show on screen) var concat = new Concatenate(this.img1); var img3 = concat.Apply(this.img2); // Show the marked correlations in the concatenated image var pairs = new PairsMarker( inliers1, // Add image1's width to the X points to show the markings correctly inliers2.Apply(p => new IntPoint(p.X + this.img1.Width, p.Y))); this.PictureBox.Source = (ImageSource)pairs.Apply(img3); }
protected void drawFreakFeaturesCorrelations(List <Bitmap> imgs) { List <FastRetinaKeypoint[]> freakPoints = new List <FastRetinaKeypoint[]>(); //Calculate all the FREAK Points FastRetinaKeypointDetector freak = new FastRetinaKeypointDetector(); foreach (Bitmap img in imgs) { freakPoints.Add(freak.ProcessImage(img).ToArray()); } //Map them and draw them! Bitmap img2 = imgs[0]; for (int i = 0; i < imgs.Count - 1; i++) { KNearestNeighborMatching matcher = new KNearestNeighborMatching(200); matcher.Threshold = 0.015; IntPoint[][] matches = matcher.Match(freakPoints[i], freakPoints[i + 1]); Concatenate concat = new Concatenate(img2); Bitmap img3 = concat.Apply(imgs[i + 1]); Color color = Color.White; if (i % 3 == 1) { color = Color.OrangeRed; } if (i % 3 == 2) { color = Color.Blue; } PairsMarker pairs = new PairsMarker(matches[0].Apply(p => new IntPoint(p.X + img2.Width - imgs[0].Width, p.Y)), matches[1].Apply(p => new IntPoint(p.X + img2.Width, p.Y)), color); img2 = pairs.Apply(img3); } showImage(img2); }
protected void drawSurfFeaturesCorrelations(List <Bitmap> imgs) { List <SpeededUpRobustFeaturePoint[]> surfPoints = new List <SpeededUpRobustFeaturePoint[]>(); //Calculate all the Surf Points SpeededUpRobustFeaturesDetector surf = new SpeededUpRobustFeaturesDetector(); foreach (Bitmap img in imgs) { surfPoints.Add(surf.ProcessImage(img).ToArray()); } //Map them and draw them! Bitmap surfImg = imgs[0]; for (int i = 0; i < imgs.Count - 1; i++) { KNearestNeighborMatching matcher = new KNearestNeighborMatching(5); matcher.Threshold = 0.005; IntPoint[][] matches = matcher.Match(surfPoints[i], surfPoints[i + 1]); Concatenate concat = new Concatenate(surfImg); Bitmap img = concat.Apply(imgs[i + 1]); Color color = Color.White; if (i % 3 == 1) { color = Color.OrangeRed; } if (i % 3 == 2) { color = Color.Blue; } PairsMarker pairs = new PairsMarker(matches[0].Apply(p => new IntPoint(p.X + surfImg.Width - imgs[0].Width, p.Y)), matches[1].Apply(p => new IntPoint(p.X + surfImg.Width, p.Y)), color); surfImg = pairs.Apply(img); } showImage(surfImg); }
// Correlation Matching private void Correlator() { // Step 2: Match feature points using a correlation measure CorrelationMatching matcher = new CorrelationMatching(9); IntPoint[][] matches = matcher.Match(_img1, _img2, harrisPoints1, harrisPoints2); // Get the two sets of points correlationPoints1 = matches[0]; correlationPoints2 = matches[1]; // Concatenate the two images in a single image (just to show on screen) Concatenate concat = new Concatenate(_img1); Bitmap img3 = concat.Apply(_img2); // Show the marked correlations in the concatenated image PairsMarker pairs = new PairsMarker( correlationPoints1, // Add image1's width to the X points // to show the markings correctly correlationPoints2.Apply(p => new IntPoint(p.X + _img1.Width, p.Y))); _processImage2 = pairs.Apply(img3); }
public static Geometry AutoAlign(Bitmap needle, Bitmap haystack, double retryThreshold = 1, int retryLimit = 10) { IntPoint[] harrisPoints1; IntPoint[] harrisPoints2; IntPoint[] correlationPoints1; IntPoint[] correlationPoints2; MatrixH homography; var mi1 = new MagickImage(needle); mi1.Equalize(); needle = mi1.ToBitmap(); var mi2 = new MagickImage(haystack); mi2.Equalize(); haystack = mi2.ToBitmap(); HarrisCornersDetector harris = new HarrisCornersDetector(0.04f, 20000f); harrisPoints1 = harris.ProcessImage(needle).ToArray(); harrisPoints2 = harris.ProcessImage(haystack).ToArray(); CorrelationMatching matcher = new CorrelationMatching(9, needle, haystack); IntPoint[][] matches = matcher.Match(harrisPoints1, harrisPoints2); correlationPoints1 = matches[0]; correlationPoints2 = matches[1]; RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.999); homography = ransac.Estimate(correlationPoints1, correlationPoints2); IntPoint[] inliers1 = correlationPoints1.Get(ransac.Inliers); IntPoint[] inliers2 = correlationPoints2.Get(ransac.Inliers); Concatenate concat = new Concatenate(needle); Bitmap img3 = concat.Apply(haystack); PairsMarker pairs = new PairsMarker( inliers1, inliers2.Apply(p => new IntPoint(p.X + needle.Width, p.Y))); var Image = pairs.Apply(img3); Image.Save(@"C:\AutoAlignDebug.png"); var pointCount = inliers1.Length; int[] xList1 = new int[pointCount]; int[] yList1 = new int[pointCount]; int[] xList2 = new int[pointCount]; int[] yList2 = new int[pointCount]; for (int n = 0; n < pointCount; n++) { xList1[n] = inliers1[n].X; yList1[n] = inliers1[n].Y; xList2[n] = inliers2[n].X; yList2[n] = inliers2[n].Y; } var f = new double[8] { xList1.Min(), yList1.Min(), xList1.Max(), yList1.Max(), xList2.Min(), yList2.Min(), xList2.Max(), yList2.Max() }; double distFromX1 = f[0] / needle.Width; double distFromX2 = f[2] / needle.Width; double leftRatio = f[0] / (f[2] - f[0]); double rightRatio = (needle.Width - f[2]) / (f[2] - f[0]); double distFromY1 = f[1] / needle.Height; double distFromY2 = f[3] / needle.Height; double topRatio = f[1] / (f[3] - f[1]); double bottomRatio = (needle.Height - f[3]) / (f[3] - f[1]); double leftDist = (f[6] - f[4]) * leftRatio; double rightDist = (f[6] - f[4]) * rightRatio; double topDist = (f[7] - f[5]) * topRatio; double bottomDist = (f[7] - f[5]) * bottomRatio; double x = f[4] - leftDist; double y = f[5] - topDist; double width = leftDist + (f[6] - f[4]) + rightDist; double height = topDist + (f[7] - f[5]) + bottomDist; mi1.Resize(new MagickGeometry((int)Math.Round(width), (int)Math.Round(height)) { IgnoreAspectRatio = true }); var mg = new MagickGeometry((int)Math.Round(x), (int)Math.Round(y), (int)Math.Round(width), (int)Math.Round(height)) { IgnoreAspectRatio = true }; mi2.Extent(mg, Gravity.Northwest, MagickColor.FromRgba(0, 0, 0, 0)); double delta = mi1.Compare(mi2, ErrorMetric.NormalizedCrossCorrelation); Geometry outGeo = new Geometry(x, y, width, height); if (delta < retryThreshold && retryLimit > 0) { retryLimit--; outGeo = AutoAlign(needle, haystack, delta, retryLimit); } return(outGeo); }
private Bitmap CompareAndDrawImage(Bitmap modelImage, Bitmap observedImage, SurfSettings setting) { Stopwatch watch1 = new Stopwatch(); Stopwatch watch2 = new Stopwatch(); Bitmap returnBitmap; watch2.Start(); watch1.Reset(); watch1.Start(); double hessianThreshold = setting.HessianThresh.HasValue ? setting.HessianThresh.Value : 500; float hessianThreshold2 = (float)hessianThreshold / 1000000; Debug.WriteLine("hessianThreshold2: {0}", hessianThreshold2); SpeededUpRobustFeaturesDetector surf = new SpeededUpRobustFeaturesDetector(hessianThreshold2); List <SpeededUpRobustFeaturePoint> surfPoints1 = surf.ProcessImage(modelImage); List <SpeededUpRobustFeaturePoint> surfPoints2 = surf.ProcessImage(observedImage); Debug.WriteLine("Surf points count: {0}", surfPoints1.Count); Debug.WriteLine("Surf points count: {0}", surfPoints2.Count); //long memoryFootprint = MemorySize.GetBlobSizeinKb(surfPoints2); //Debug.WriteLine("Surf extractor: {0} kb", memoryFootprint); watch1.Stop(); Debug.WriteLine("Surf Detection tooked {0} ms", watch1.ElapsedMilliseconds); watch1.Reset(); watch1.Start(); // Show the marked points in the original images Bitmap img1mark = new FeaturesMarker(surfPoints1, 2).Apply(modelImage); Bitmap img2mark = new FeaturesMarker(surfPoints2, 2).Apply(observedImage); // Concatenate the two images together in a single image (just to show on screen) Concatenate concatenate = new Concatenate(img1mark); returnBitmap = concatenate.Apply(img2mark); watch1.Stop(); Debug.WriteLine("Surf point plotting tooked {0} ms", watch1.ElapsedMilliseconds); //watch1.Reset(); watch1.Start(); //List<IntPoint>[] coretionalMatches = getMatches(surfPoints1, surfPoints2); //watch1.Stop(); //Debug.WriteLine("Correctional Match tooked {0} ms", watch1.ElapsedMilliseconds); //// Get the two sets of points //IntPoint[] correlationPoints11 = coretionalMatches[0].ToArray(); //IntPoint[] correlationPoints22 = coretionalMatches[1].ToArray(); //Debug.WriteLine("Correclation points count: {0}", correlationPoints11.Length); //Debug.WriteLine("Correclation points count: {0}", correlationPoints22.Length); Debug.WriteLine("Threshold: {0}", setting.UniquenessThreshold.Value); watch1.Reset(); watch1.Start(); // Step 2: Match feature points using a k-NN KNearestNeighborMatching matcher = new KNearestNeighborMatching(2); matcher.Threshold = setting.UniquenessThreshold.Value; IntPoint[][] matches = matcher.Match(surfPoints1, surfPoints2); watch1.Stop(); Debug.WriteLine("Knn Match tooked {0} ms", watch1.ElapsedMilliseconds); // Get the two sets of points IntPoint[] correlationPoints1 = matches[0]; IntPoint[] correlationPoints2 = matches[1]; Debug.WriteLine("Knn points count: {0}", correlationPoints1.Length); Debug.WriteLine("Knn points count: {0}", correlationPoints2.Length); //watch1.Reset(); watch1.Start(); //// Show the marked correlations in the concatenated image //PairsMarker pairs = new PairsMarker( // correlationPoints1, // Add image1's width to the X points to show the markings correctly // correlationPoints2.Apply(p => new IntPoint(p.X + modelImage.Width, p.Y)), Color.Blue); //returnBitmap = pairs.Apply(returnBitmap); //watch1.Stop(); //Debug.WriteLine("Match pair marking tooked {0} ms", watch1.ElapsedMilliseconds); if (correlationPoints1.Length < 4 || correlationPoints2.Length < 4) { MessageBox.Show("Insufficient points to attempt a fit."); return(null); } watch1.Reset(); watch1.Start(); // Step 3: Create the homography matrix using a robust estimator //RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99); RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99); MatrixH homography = ransac.Estimate(correlationPoints1, correlationPoints2); watch1.Stop(); Debug.WriteLine("Ransac tooked {0} ms", watch1.ElapsedMilliseconds); watch1.Reset(); watch1.Start(); // Plot RANSAC results against correlation results IntPoint[] inliers1 = correlationPoints1.Submatrix(ransac.Inliers); IntPoint[] inliers2 = correlationPoints2.Submatrix(ransac.Inliers); watch1.Stop(); Debug.WriteLine("Ransac SubMatrix {0} ms", watch1.ElapsedMilliseconds); Debug.WriteLine("Ransac points count: {0}", inliers1.Length); Debug.WriteLine("Ransac points count: {0}", inliers2.Length); watch1.Reset(); watch1.Start(); PairsMarker inlierPairs = new PairsMarker( inliers1, // Add image1's width to the X points to show the markings correctly inliers2.Apply(p => new IntPoint(p.X + modelImage.Width, p.Y)), Color.Red); returnBitmap = inlierPairs.Apply(returnBitmap); watch1.Stop(); Debug.WriteLine("Ransac plotting tooked {0} ms", watch1.ElapsedMilliseconds); watch2.Stop(); return(returnBitmap); }