OpenCV:描述符矩阵的L1归一化

时间:2016-07-22 02:52:47

标签: python c++ opencv normalization norm

我试图在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)

我的问题是:

  1. OpenCV中是否有内置的C ++函数?
  2. 所有描述符都是正值吗?否则L1范数应该使用每个元素的abs。
  3. 第一行表示"对于每个行向量,计算其所有元素的总和,然后添加eps(以避免除以0)并最终将每个向量元素除以该和值"

1 个答案:

答案 0 :(得分:1)

SIFT描述符基本上是一个直方图,所以它不应该有负值。我不认为OpenCV中存在一个能够实现您想要实现的功能。但要想完成这项任务的几条线路并不难,

cv::normalize

我不确切知道OpenCV如何处理L1归一化中的零和。如果以上代码生成NaN,则可以将descs.rows(i) /= (cv::norm(descs.rows(i), cv::NORM_L1) + eps)替换为<canvas id="snakeCanvas" width="350" height="350"></canvas>