EmguCV — получить количество совпадений для определения сходства изображений

В настоящее время я использую алгоритм SURF (на EmguCV 3.1), чтобы проверить, могут ли два изображения соответствовать одному и тому же местоположению Изображение 1 и его очень темная версия, что вызывает у меня следующие 2 вопроса:

1-Считаете ли вы, что подсчет количества хороших совпадений между двумя изображениями является хорошей идеей для определения сходства изображений? Если нет, какие еще предложения?

2-Предполагая, что подсчет количества совпадений является хорошим подходом. Как получить количество совпадений? В некоторых статьях говорится о подсчете количества NonZeros . Однако результаты не совпадают, как на на этом рисунке , где показано только 2 совпадения. , но возвращает значение 30 (переменная noZeroCount). Код, который я использую, таков:

public static void FindMatch(Mat modelImage, Mat observedImage, out long matchTime, out VectorOfKeyPoint modelKeyPoints, out VectorOfKeyPoint observedKeyPoints, VectorOfVectorOfDMatch matches, out Mat mask, out Mat homography)
    {
        int k = 2;
        double uniquenessThreshold = 0.8;
        double hessianThresh = 300;

        Stopwatch watch;
        homography = null;

        modelKeyPoints = new VectorOfKeyPoint();
        observedKeyPoints = new VectorOfKeyPoint();
        using (UMat uModelImage = modelImage.ToUMat(AccessType.Read))
        using (UMat uObservedImage = observedImage.ToUMat(AccessType.Read))
        {
            SURF surfCPU = new SURF(hessianThresh, 4 , 2, true, true);

            //extract features from the object image
            UMat modelDescriptors = new UMat();
            surfCPU.DetectAndCompute(uModelImage, null, modelKeyPoints, modelDescriptors, false);

            watch = Stopwatch.StartNew();

            // extract features from the observed image
            UMat observedDescriptors = new UMat();
            surfCPU.DetectAndCompute(uObservedImage, null, observedKeyPoints, observedDescriptors, false);
            BFMatcher matcher = new BFMatcher(DistanceType.L2);
            matcher.Add(modelDescriptors);

            matcher.KnnMatch(observedDescriptors, matches, k, null);
            mask = new Mat(matches.Size, 1, DepthType.Cv8U, 1);
            mask.SetTo(new MCvScalar(255));
            Features2DToolbox.VoteForUniqueness(matches, uniquenessThreshold, mask);

            int nonZeroCount = CvInvoke.CountNonZero(mask);
            if (nonZeroCount >= 4)
            {
                nonZeroCount = Features2DToolbox.VoteForSizeAndOrientation(modelKeyPoints, observedKeyPoints,
                   matches, mask, 1.5, 20);
                if (nonZeroCount >= 4)
                    homography = Features2DToolbox.GetHomographyMatrixFromMatchedFeatures(modelKeyPoints,
                       observedKeyPoints, matches, mask, 2);
            }

            watch.Stop();
            matchTime = watch.ElapsedMilliseconds;
        }
    }

Очень признателен за любые ваши усилия.


person rugby2312    schedule 30.11.2016    source источник
comment
Изображение 1 кажется мало поддающимся точной идентификации, так как это, по сути, текстура листвы с небольшими заметными особенностями. Можем ли мы увидеть темное изображение?   -  person Yves Daoust    schedule 30.11.2016
comment
Дело этой картины кажется безнадежным, там не на что смотреть. В любом случае, выравнивание гистограммы может улучшить ситуацию.   -  person Yves Daoust    schedule 30.11.2016
comment
@Yves, это более темная версия изображения: imgur.com/jGDdl2G, та же сцена, но менее ярко . Это реальные результаты, imgur.com/24wwjHf при сравнении двух изображений.   -  person rugby2312    schedule 01.12.2016
comment
Если известно, что изображения сделаны с одной и той же точки зрения, какой смысл сравнивать их на предмет сходства? Если они взяты с разных точек зрения, ожидайте получить совершенно разные результаты. Сравнительное изображение совершенно нечитаемо.   -  person Yves Daoust    schedule 01.12.2016
comment
Изображения поступают с веб-камеры в реальном времени, при этом изображения снимаются через регулярные промежутки времени, цель сравнения изображений состоит в том, чтобы проверить, блокирует ли что-то (например, птицы, пауки и т. д.) или нет вид камеры.   -  person rugby2312    schedule 01.12.2016


Ответы (1)


Используя nonZeroCount, чем больше это значение, тем больше сходство между двумя изображениями.

person Rene Zhang    schedule 21.03.2018
comment
Пожалуйста, добавьте более подробную информацию о теме, по которой вы хотите получить помощь: технология, фреймворк/язык, сообщение об ошибке, пример кода. - person KimKulling; 21.03.2018