Accord.NET Сравнение двух изображений для определения сходства

Я хотел бы получить ваш совет относительно того, почему код может перестать отвечать на запросы и как это исправить.

Я использую Accord.NET для сравнения изображений. Первый этап моего проекта состоит в том, чтобы сравнить два изображения, наблюдаемое изображение и модельное изображение, и определить, насколько они похожи; во-вторых, сравнить наблюдаемое изображение со всей моей базой данных, чтобы определить, что наблюдаемое изображение, скорее всего, основано на том, как модели были классифицированы. Сейчас я сосредоточился на первом. Сначала я пытался использовать ExhaustiveTemplateMatching.ProcessImage(), но это не соответствовало моим потребностям. Теперь я использую SURF. Вот мой код как есть:

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

Пока я получаю список точек, но затем при сопоставлении код перестает отвечать на запросы.

Я вызываю приведенный выше код с веб-страницы ASP.NET после того, как пользователь публикует растровое изображение. Вот код, если это может помочь:

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

Сама страница довольно простая, скрытое поле, ввод типа файла и отправка.


person Jaquio    schedule 16.10.2016    source источник
comment
Вы должны запустить этот процесс в другом потоке, чтобы не блокировать поток приложения огромной обработкой.   -  person Laurent Lequenne    schedule 17.10.2016
comment
Как вы заставили построить «KNearestNeighborMatching»? Я получаю сообщение «НЕ НАЙТИ», хотя у меня есть ссылка NuGet на Accord.Imaging 3.8.0.   -  person Doug Null    schedule 18.04.2018
comment
Я исправил это: проект C# был поврежден. Просто нужно было создать проект, всплывающее окно в старых файлах .cs и повторно добавить все библиотеки NuGet Accord. Все строится сейчас.   -  person Doug Null    schedule 18.04.2018


Ответы (2)


Проблема была в моем ПК. Через некоторое время обработки расчет завершается.

Спасибо,

person Jaquio    schedule 19.10.2016

Чтобы KNearestNeighborMatching определился, нужно поставить
Accord.Imaging и Accord.Vision.

person Pivo    schedule 03.11.2019