OpenCV:描述符矩阵的L1归一化
OpenCV: L1 normalization of descriptor matrix
我正在按照 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范数应该使用每个元素的abs。
- 第一行表示"for each row vector, compute the sum of all its elements, then add eps (in order to avoid to divide by 0) and finally divide each vector element by this sum value".
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)
。
我正在按照 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范数应该使用每个元素的abs。
- 第一行表示"for each row vector, compute the sum of all its elements, then add eps (in order to avoid to divide by 0) and finally divide each vector element by this sum value".
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)
。