OpenCV:L1规范化描述矩阵



在本文之后,我将尝试在C++中实现SIFTRoot。

特别是:

    # apply the Hellinger kernel by first L1-normalizing and taking the
    # square-root
    descs /= (descs.sum(axis=1, keepdims=True) + eps)
    descs = np.sqrt(descs)

我的问题是:

  1. 在OpenCV中有没有内置的C++函数可以做到这一点
  2. 所有描述符的值都是正数吗?否则,L1范数应该使用每个元素的abs
  3. 第一行的意思是"对于每一行向量,计算其所有元素的和,然后加eps(以避免被0除),最后用这个和值除每个向量元素"

SIFT描述符基本上是一个直方图,所以它不应该有负值。我认为OpenCV中没有一个函数可以实现你想要实现的目标。但想出几条能完成工作的线路并不难

// For each row
for (int i = 0; i < descs.rows; ++i) {
  // Perform L1 normalization
  cv::normalize(descs.row(i), descs.row(i), 1.0, 0.0, cv::NORM_L1);
}
// Perform sqrt on the whole descriptor matrix
cv::sqrt(descs, descs);

我不知道OpenCV在L1规范化中是如何处理零和的。如果以上代码生成NaN,则可以将cv::normalize替换为descs.rows(i) /= (cv::norm(descs.rows(i), cv::NORM_L1) + eps)

相关内容

  • 没有找到相关文章