To implement FlannBasedMatcher

To implement FlannBasedMatcher

本文关键字:FlannBasedMatcher implement To      更新时间:2023-10-16

我正在从视频images中进行面部识别的项目。.flannbasedMatcher已经在OpENCV中(我正在使用OpenCV),但是喜欢用任何OpenCV帮助自己实施它。请请帮助我找到FlannbasedMatcher中确切发生的事情。任何响应都会非常感谢。

通常使用一些距离指标进行比较,例如在某些多赔偿空间中被认为是点的欧几里得距离;一个人可以使用独立于向量缩放的两个向量(即特征向量)之间的角度。一个人可以使用嗡嗡的距离来比较二进制字符串,等等。最好的方法取决于特征向量的结构和含义。对于面部,它可以是通过点产物表达的两个向量之间的角度。

现在,Flann用于查找最近的邻居,因此与功能比较无直接关系邻居)。因此,您无需搜索所有试图选择具有最高点产品的向量的向量,而是直接将给定的面(向量)与仅几个最接近的面(向量)进行比较。

最后,解决先前的答案,在某些情况下可以使用稀疏阵列而不是KD树。它们也是OpenCV的一部分,但可以通过哈希表或树木植入。在稀疏阵列中,您可以检查与最近邻居相似的相邻元素的索引。当然,稀疏阵列比弗兰恩(Flann)更有限制 - 例如,它们需要在附近进行详尽的搜索才能获得最近的邻居列表,但这仍然比全球搜索更快。这是一个示例:

int dims = 3;
int sz[] = {1000, 1000, 1000}; // memory efficient
SparseMat M3d(dims, sz, CV_32F);
Point3i idx_sparse;
Vec3f p;
//set the element of a sparse 3D Mat
M3d.ref<Vec3f>(idx_sparse.x, idx_sparse.y, idx_sparse.z) = p; 
// iterate
SparseMatIterator it =  M3d.begin();
SparseMatIterator it_end = M3d.end();
for (; it != it_end; ++it) {
    // access existing element through iterator
    Vec3f vec = it.value<Vec3f>();
    // check neighbors if they exist
    int* idx = it.node()->index;
    idx[0]++; idx[1]--; idx[2]+=2;
    if (M3d.find(idx) != M3d.end()) {
        Vec3f vec = M3d.ref<Vec3f>(idx);
    }
}

这并不容易。您必须使用Aproxated最近的邻居搜索实现KD-Tree。在纸上描述了"最接近的最佳算法在固定维度中搜索的邻居" Arya等人

如果您不想从头开始做,而只是想摆脱OpenCV,则可以采用原始的Flann实施。

相关文章:
  • 没有找到相关文章