Accord.NET Comparing two images to determine simil

2020-02-01 15:47发布

问题:

I would like your advice as to why the code might be becoming unresponsive and how to fix it.

I am using Accord.NET to compare images. The first stage of my project is to compare two images, an observed image and a model image, and determine how similar they are; the second, is to compare an observed image against my whole database to determine what the observed image most likely is based on how the models have been categorized. Right now I am focusing on the first. I initially tried using ExhaustiveTemplateMatching.ProcessImage() but it didn't fit my need. Now, I am using SURF. Here is my code as is:

public class ProcessImage
{
    public static void Similarity(System.IO.Stream model, System.IO.Stream observed,
        out float similPercent)
    {
        Bitmap bitModel = new Bitmap(model);
        Bitmap bitObserved = new Bitmap(observed);

        // For method Difference, see http://www.aforgenet.com/framework/docs/html/673023f7-799a-2ef6-7933-31ef09974dde.htm

        // Inspiration for this process: https://www.youtube.com/watch?v=YHT46f2244E
        // Greyscale class http://www.aforgenet.com/framework/docs/html/d7196dc6-8176-4344-a505-e7ade35c1741.htm
        // Convert model and observed to greyscale
        Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721);
        // apply the filter to the model
        Bitmap greyModel = filter.Apply(bitModel);
        // Apply the filter to the observed image
        Bitmap greyObserved = filter.Apply(bitObserved);
        int modelPoints = 0, matchingPoints = 0;

        /*
         * This doesn't work. Images can have different sizes
        // For an example, https://thecsharper.com/?p=94
        // Match
        var tm = new ExhaustiveTemplateMatching(similarityThreshold); 
        // Process the images
        var results = tm.ProcessImage(greyModel, greyObserved);
        */

        using (SpeededUpRobustFeaturesDetector detector = new SpeededUpRobustFeaturesDetector())
        {
            List<SpeededUpRobustFeaturePoint> surfModel = detector.ProcessImage(greyModel);
            modelPoints = surfModel.Count();
          List<SpeededUpRobustFeaturePoint> surfObserved = detector.ProcessImage(greyObserved);

            KNearestNeighborMatching matcher = new KNearestNeighborMatching(5);
            var results = matcher.Match(surfModel, surfObserved);
            matchingPoints = results.Length;
        }
        // Determine if they represent the same points
        // Obtain the pairs of associated points, we determine the homography matching all these pairs


        // Compare the results, 0 indicates no match so return false
        if (matchingPoints <= 0)
        {
            similPercent = 0.0f;
        }

        similPercent = (matchingPoints * 100) / modelPoints;
    }
}

So far I get to obtain the list of points but then when matching the code seems to become unresponsive.

I am calling the above code from an ASP.NET web page after the user posts a bitmap. Here is the code if it may help:

public ActionResult Compare(int id)
    {
        ViewData["SampleID"] = id;

        return View();
    }

    [HttpPost]
    public ActionResult Compare(int id, HttpPostedFileBase uploadFile)
    {
        Sample model = _db.Sample_Read(id);
        System.IO.Stream modelStream = null;
        float result = 0;

        _db.Sample_Stream(model.FileId, out modelStream);

        ImgProc.ProcessImage.Similarity(modelStream, uploadFile.InputStream,
                out result);

        ViewData["SampleID"] = id;
        ViewData["match"] = result;

        return View();
    }

The page itself is rather simple, a hidden field, an file type input and a submit.

回答1:

Problem was my PC. After some time processing the calculation finishes.

Thanks,



回答2:

For KNearestNeighborMatching to decide, it is necessary to put
Accord.Imaging and Accord.Vision.