Accord.NET Comparación de dos imágenes para determinar la similitud

Me gustaría su consejo sobre por qué el código puede dejar de responder y cómo solucionarlo.

Estoy usando Accord.NET para comparar imágenes. La primera etapa de mi proyecto es comparar dos imágenes, una imagen observada y una imagen modelo, y determinar qué tan similares son; el segundo es comparar una imagen observada con toda mi base de datos para determinar cuál es la imagen observada más probable en función de cómo se han categorizado los modelos. Ahora mismo me estoy centrando en el primero. Inicialmente intenté usar ExhaustiveTemplateMatching.ProcessImage () pero no se ajustaba a mi necesidad. Ahora estoy usando SURF. Aquí está mi código tal como está:

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;
    }
}

Hasta ahora puedo obtener la lista de puntos, pero luego, al hacer coincidir el código, parece no responder.

Llamo al código anterior desde una página web ASP.NET después de que el usuario publique un mapa de bits. Aquí está el código si puede ayudar:

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();
    }

La página en sí es bastante simple, un campo oculto, una entrada de tipo de archivo y un envío.

Respuestas a la pregunta(1)

Su respuesta a la pregunta