Я пытаюсь реализовать 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)
Мой вопрос:
Дескриптор 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.
Других решений пока нет …