Следующая строка:
UMat frame
не выделяет значительную память для изображений.Он просто создает заголовок в стеке с пространством для:
- количество строк,
- и столбцов в изображении,
- тип изображения,
- счетчик ссылок и
- указатель, который в конечном итоге будет указывать на пиксели изображения, но на данный момент ничего не указывает.
При входе вцикл, следующая строка:
cap >> frame;
выделит достаточно памяти в куче для пикселей изображения, инициализирует размеры, счетчик ссылок и сделает указатель данных указателем на выделенный фрагмент памяти изображения - очевидно,он также заполняет данные пикселей из видеоисточника.
Когда вы вызываете Canny с:
Canny(frame, frame, 0, 50);
, он увидит, что операция на месте, и перезапуститиспользуйте тот же самый мат, который содержит frame
и переписать его.Никакого выделения или освобождения не требуется.
Второй и последующие раз, когда вы обойдете цикл, строка:
cap >> frame;
увидит, что места уже достаточноВыделил и загрузил данные из видеопотока в тот же Mat
, переписав тем самым результаты предыдущего Canny()
.
При возврате из функции в конце кучаосвобождается память для данных пикселей и выделяется память стека для заголовка.
TLDR ;Не о чем беспокоиться - о выделении и освобождении памяти позаботятся о вас!