有人可以解释一下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,它就是真的。
答案 0 :(得分:3)
“VoteForUniqueness”的想法是过滤模棱两可的匹配。 假设您想要将图像A的点与图像B的点匹配。
以下是它的工作原理:
在这里,当我们谈到最近邻居和距离时,我们会谈到点的特征(不是位置)之间的距离。