opencv 3.4.2 некоторые вопросы относительно cv :: mat - PullRequest
0 голосов
/ 02 января 2019
UMat frame,gray;
VideoCapture cap(0);

if(!cap.isOpened()) 
    return -1;

for(i=0;i<10;i++) 
{
 cap >> frame; 
 Canny(frame, frame, 0, 50);     
 imshow("canny", frame);
}
 return 0;

здесь я сомневаюсь, что если цикл работает 10 раз и в line-11 Я применяю фильтр canny, но src и dst одинаковы (frame), поэтому это будет операция на месте, поэтому на каждой итерации, что будет происходить в случае с памятью Распределение и освобождение !!

  • будет 9 областей памяти без заголовка, указывающего на него,
  • или в каждом цикле память, занятая данными матрицы кадра, будет перераспределена,
  • или в каждом цикле мне нужно вызывать release (), чтобы вручную освободить матрица

Когда применяется фильтр Canny, данные результата заменят старые данные матрицы, или он выделит новый набор памяти для данных результата и будет указывать на него, и если так, что будет со старыми данными матрицы?

1 Ответ

0 голосов
/ 03 января 2019

Следующая строка:

UMat frame

не выделяет значительную память для изображений.Он просто создает заголовок в стеке с пространством для:

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

При входе вцикл, следующая строка:

cap >> frame; 

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


Когда вы вызываете Canny с:

Canny(frame, frame, 0, 50);

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


Второй и последующие раз, когда вы обойдете цикл, строка:

cap >> frame; 

увидит, что места уже достаточноВыделил и загрузил данные из видеопотока в тот же Mat, переписав тем самым результаты предыдущего Canny().


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


TLDR ;Не о чем беспокоиться - о выделении и освобождении памяти позаботятся о вас!

...