Features2DToolbox.VoteForUniqueness如何工作?

时间:2014-02-21 11:15:04

标签: emgucv sift

有人可以解释一下Features2DToolbox.VoteForUniqueness是如何工作的吗?

这是使用它的源代码:

BruteForceMatcher<float> matcher = new BruteForceMatcher<float>(DistanceType.L2);
matcher.Add(modelfeature);
indices = new Matrix<int>(destfeature.Rows, 2);
dist = new Matrix<float>(destfeature.Rows, 2);
matcher.KnnMatch(destfeature, indices, dist, 2, null);
mask = new Matrix<byte>(dist.Rows, 1);
mask.SetValue(255);
Features2DToolbox.VoteForUniqueness(dist, 0.8, mask);

我想制作一本手册:

indices = new Matrix<int>(destfeature.Rows, 2);
dist = new Matrix<float>(destfeature.Rows, 2);
for (int i = 0; i < destfeature.Rows; i++)
{
    dist[i, 0] = float.MaxValue;
    dist[i, 1] = float.MaxValue;
    indices[i, 0] = -1;
    indices[i, 1] = -1;
    for (int j = 0; j < modelfeature.Rows; j++)
    {
        float temp = 0;
        for (int k = 0; k < 128; k++)
        {
             temp = temp +(float) Math.Pow(modelfeature[j, k] - destfeature[i, k], 2.0);
        }
        temp =(float) Math.Sqrt(temp);
        if (temp < dist[i, 0])
        {
             dist[i, 1] = dist[i, 0];
             indices[i, 1] = indices[i, 0];
             dist[i, 0] = temp;
             indices[i, 0] = j;
        }
        else if (temp < dist[i, 1])
        {
             dist[i, 1] = temp;
             indices[i, 1] = j;
        }
    }
}
mask = new Matrix<byte>(dist.Rows, 1);
for (int i = 0; i < dist.Rows; i++)
{
    if (dist[i, 0] < dist[i, 1] * 0.8)
    {
        mask[i, 0] = 255;
    }
    else
    {
        mask[i, 0] = 0;
    }
}

已编辑过 在我的错误之前,我将dist [i,1]与dist [i,0]分开,如果它超过0.8,它就是真的。

1 个答案:

答案 0 :(得分:3)

“VoteForUniqueness”的想法是过滤模棱两可的匹配。 假设您想要将图像A的点与图像B的点匹配。

以下是它的工作原理:

  • “KnnMatch”正在为图像B中的每个图像A点寻找2-Nearest Neighbor。
  • 在图像B中,如果第一和第二邻居太相似(距离比小于0.8),我们认为我们不知道哪一个是最佳匹配,因此匹配被过滤(删除)。

在这里,当我们谈到最近邻居和距离时,我们会谈到点的特征(不是位置)之间的距离。