Я надеюсь, что этот вопрос не ОТ.
Я реализую кодировщик VLAD, используя реализация VLFeat и SIFT дескрипторы из разных реализаций для их сравнения (OpenCV, VLFeat, OpenSIFT< /а>).
Это должно быть высокопроизводительное приложение на C++ (я знаю, что SIFT очень неэффективен, я реализую его параллельную версию).
Теперь VLAD хочет получить в качестве входных данных указатель на набор смежных дескрипторов (математических векторов). Дело в том, что обычно эти SIFT-дескрипторы представляются в виде матрицы, поэтому ими проще управлять.
Итак, предположим, что у нас есть матрица из 3 дескрипторов в 3 измерениях (я использую эти числа для простоты, на самом деле это тысячи дескрипторов в 128 измерениях):
1 2 3
4 5 6
7 8 9
Мне нужно сделать фид vl_vlad_encode
с указателем на:
1 2 3 4 5 6 7 8 9
Простое решение — сохранить дескрипторы в объекте cv::Mat m
, а затем передать m.data
в vl_vlad_encode
.
Однако я не знаю, является ли cv::Mat
эффективным матричным представлением. Например, альтернативой является Eigen::Matrix
(я думаю, что легко получить представленное выше представление, используя это объект), но я не знаю, какая реализация быстрее/эффективнее или есть какая-то другая причина, потому что я должен предпочесть одну вместо другой.
Другой возможной альтернативой является использование std::vector<std::vector<float>> v
, но я не знаю, получу ли я с помощью v.data()
приведенное выше представление вместо: 1 2 3 *something* 4 5 6 *something* 7 8 9
Очевидно, что *something*
испортит vl_vlad_encode
.
Любое другое предложение более чем приветствуется!
float [9]
? Согласитесь с соглашением о столбцах или строках, и тогда вы сможете расположить все последовательно, один столбец или одну строку за другой. - person Andon M. Coleman   schedule 14.12.2016std::vector<float> v
, а затемv.resize(dim)
(илиv.reserve(dim)
) может быть лучшим решением, гдеdim=9
в данном случае. - person justHelloWorld   schedule 14.12.2016Mat
непрерывны. Вы можете думать оMat
как о легкой оболочке надfloat*
(или другими типами), которая обеспечивает более легкий доступ к данным. Таким образом, он так же эффективен, как указатель, но с несколькими приятными абстракциями. - person Miki   schedule 14.12.2016Mat
для SIFT и записывать/читать его в файлы (используя xml и yaml). То есть вы говорите, что потерь во времени/памяти нет, но ими легче управлять, да? - person justHelloWorld   schedule 14.12.2016Mat
. Если вы опубликуете это как ответ, и никто не предложит лучшего решения, я выберу его! - person justHelloWorld   schedule 14.12.2016