python — OpenCV: L1 нормализация дескрипторной матрицы

Я пытаюсь реализовать SIFTRoot в C ++ после этот статья.

Особенно:

    # 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. Есть ли встроенная функция C ++, чтобы сделать это в OpenCV?
  2. Все ли значения дескрипторов положительны? В противном случае норма L1 должна использовать abs каждого элемента.
  3. Первая строка означает «для каждого вектора строки вычислить сумму всех его элементов, затем добавить eps (чтобы избежать деления на 0) и, наконец, разделить каждый элемент вектора на это значение суммы».

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. Вы можете заменить cv::normalize с descs.rows(i) /= (cv::norm(descs.rows(i), cv::NORM_L1) + eps) если приведенный выше код генерирует NaN.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]