this文章之后,我正在尝试在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)

我的问题是:
  • 在OpenCV中是否有内置的C++函数可以执行此操作?
  • 所有描述符的值都为正吗?否则,L1范数应使用每个元素的绝对值。
  • 第一行的意思是“对于每个行 vector ,计算其所有元素的总和,然后加上eps(以避免除以0),最后将每个 vector 元素除以该总和值”。
  • 最佳答案

    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)

    关于python - OpenCV:描述符矩阵的L1归一化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38517401/

    10-11 18:33