c# - 为什么精确的图像没有精确的描述符?

标签 c# opencv image-processing emgucv surf

我正在开发图像识别应用程序,但是有些问题困扰着我。

我正在使用双色调图像(文档)。如果我复制同一图像文件并进行比较(实际上是比较两个[同一子区域]的子区域),则使用SURF不会获得100%的匹配。这是我的代码的一部分:

public double FindPercentMatch(Bitmap obj, Bitmap scene)
{

    // get scene key points
    VectorOfKeyPoint scenePoints = GetKeyPoints((Bitmap)scene.Clone());

    // if no scene points found, no need to go any further
    if (scenePoints == null || scenePoints.Size == 0) { return 0; }

    // get object key points
    VectorOfKeyPoint objectPoints = GetKeyPoints((Bitmap)obj.Clone());            

    // if not enough object key points found vs scene key points, then match can't be close enough (since
    // you can't have more matches than scene points anyway, so don't even try to match
    if (objectPoints == null || objectPoints.Size == 0 || (scenePoints.Size / objectPoints.Size < .15)) { return 0; }

    // we have enough key points, so compute descriptors for scene and object
    Matrix<float> objectDescriptors = GetDescriptors(objectPoints,(Bitmap)obj.Clone());
    Matrix<float> sceneDescriptors = GetDescriptors(scenePoints, (Bitmap)scene.Clone());
    int objectDescriptorCount = objectDescriptors == null ? 0 : objectDescriptors.Size.Height;
    int sceneDescriptorCount = sceneDescriptors == null ? 0 : sceneDescriptors.Size.Height;

    // find matches
    int sim = FindMatches(objectDescriptors, sceneDescriptors);

    // for testing so we know how many were found so we can monitor it
    log.Debug("descriptors1 = " + objectDescriptorCount + ", 2 = " + sceneDescriptorCount + ", matches=" + sim);

    double percent = 0;
    if (sim != 0)
    {
        percent = objectDescriptorCount != 0 ? (double)sim / (double)objectDescriptorCount : 0;
        log.Debug(percent * 100 + "%");
    }
    return percent;

}

public int FindMatches(Matrix<float> dbDescriptors, Matrix<float> queryDescriptors)
{

    double uniquenessThreshold = 0.6;

    if (dbDescriptors == null || queryDescriptors == null)
    {
        return 0;
    }
    var indices = new Matrix<int>(queryDescriptors.Rows, 2); // matrix that will contain indices of the 2-nearest neighbors found
    var dists = new Matrix<float>(queryDescriptors.Rows, 2); // matrix that will contain distances to the 2-nearest neighbors found

    // create FLANN index with 4 kd-trees and perform KNN search over it look for 2 nearest neighbours
    var flannIndex = new Index(dbDescriptors, 4);

    flannIndex.KnnSearch(queryDescriptors, indices, dists, 2, 24);

    // for eatch match over a certain threshold, add +1 to the number of 'good' matches
    int sim = 0;
    for (int i = 0; i < indices.Rows; i++)
    {
        // filter out all inadequate pairs based on distance between pairs
        if (dists.Data[i, 0] < (uniquenessThreshold * dists.Data[i, 1]))
        {
            sim++;
        }
    }
    return sim;
}

在图像的同一子区域上使用FindPercentMatch时,预期结果将为100%,但根据图像的不同,可能为70%,99%,甚至看到了101%。

最佳答案

据我所知,您的过滤不会导致一对一的objectdescriptor-scenedescriptor(匹配某个阈值),这就是为什么您可以获得100%以上的百分比

另一件事是“objectDescriptorCount等于sceneDescriptorCount”这一事实并不总是意味着“objectDescriptor等于sceneDescriptor”。手动检查描述符,如果它们相同,则意味着处理逻辑有误(计数为“sim”)

希望能有所帮助

关于c# - 为什么精确的图像没有精确的描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529451/

相关文章:

c# - (动态规划)如何通过 session 列表最大化房间利用率?

Opencv Python-3.5.2人脸识别

image-processing - 人车识别

image-processing - 绘图机器人的算法-有什么提示吗?

c# - Func<> 和原始代码

C# DateTime.AddMonth 下个月不存在日期

c# - 在 IIS Express 中处理 URL 绑定(bind)失败

python - 卡尔曼滤波器如何在 Opencv python 中跟踪多个对象?

c++ - 运行来自 Learning Opencv 的练习 2-4 的问题,O'Reilly

java.awt.image.BufferedImage.getRBG 未返回预期值