EmguCV - 获取用于确定图像相似性的匹配数

时间:2016-11-30 13:24:11

标签: c# opencv image-processing emgucv surf

我目前正在使用SURF算法(在EmguCV 3.1上)测试两个图像是否可能对应于同一位置Image 1及其非常暗的版本,这带来了以下两个问题:

1 - 您认为计算两张图片之间良好匹配的数量是确定图像相似性的好主意吗?如果没有,还有其他建议吗?

2 - 假设计算比赛数是一个很好的方法。怎么得到比赛的数量?有些文章谈到counting the number of NonZeros。但是,结果似乎与this picture不匹配,后者仅显示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;
        }
    }

非常感谢您的任何努力。

1 个答案:

答案 0 :(得分:-2)

使用nonZeroCount,此值越大,两个图像之间的相似性就越大。