Как использовать 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.
Тем не менее, до тех пор, пока вы не храните огромное количество данных, ничего не произойдет.