Как использовать OpenCV Mat Reserve? с push_back

Я хочу использовать OpenCV cv::Mat функция push_back добавить новые строки в матрицу, но я хочу предварительно кэшировать размер матрицы, чтобы данные не нуждались в постоянном перераспределении. cv::mat::reserve Функция имеет параметр количества строк, но это означает, что вы должны указать количество столбцов (и размер данных в первую очередь). Поэтому приведенный ниже код даст мне одну пустую строку в начале, которая мне не нужна. Есть ли правильный способ сделать это с помощью reserve а также push_back??

cv::Mat M(1, size_cols, CV_32FC1);
M.reserve(size_rows);
for (int i = 0; i < size_rows; i++)
{
  GetInputMatrix(A);
  M.push_back(A.row(i));
}

Примечание: хотя пример кода не показывает его, я не уверен в точном размере окончательной матрицы, но я могу получить максимальный размер значения для резервирования.

2 ответа

Использовать пустой коврик в начале будет просто замечательно. Номер и тип столбца будут определены через первый push_back,

cv::Mat M;  // empty mat in the beginning
M.reserve(size_rows);
for (int i = 0; i < size_rows; i++) {
    GetInputMatrix(A);
    M.push_back(A.row(i));
}

Ну, согласно документации,

резерв делает:

Метод резервирует место для sz строк. Если в матрице уже достаточно места для хранения sz-строк, ничего не происходит. Если матрица перераспределена, первые строки Mat:: columns сохраняются. Метод эмулирует соответствующий метод векторного класса STL.

Тем не менее, до тех пор, пока вы не храните огромное количество данных, ничего не произойдет.

Другие вопросы по тегам