Использование C ++ STL без копирования данных - PullRequest
0 голосов
/ 06 ноября 2018

Я использую контейнер Opencv Mat для чтения кадров из видео steam. Мне нужны как текущие, так и предыдущие кадры.

Пока я копирую текущий кадр в предыдущий кадр в конце каждой итерации. Можно ли избежать этой копии deep , используя один из контейнеров STL?

std::string VidPath;
VideoCapture VidStream;
cv::Mat Prev,Curr;

if (!VidStream.open(VidPath))
{
    cout << "Cant open video" << endl;
    return 1;
}

VidStream.read(Prev);

while(VidStream.read(Curr))
{
   //do some operations between Curr and Prev 
   Curr.copyTo(Prev)// is it possible to avoid this copy?
}

1 Ответ

0 голосов
/ 06 ноября 2018

Да, это называется обмен.

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

Другой вариант - использовать два std::vector, которые предоставляют метод swap, что означает отсутствие копирования.
Другие контейнеры, такие как std::list или std::dequeu, также предоставляют метод swap.

Дополнительную информацию можно найти при поиске двойной буферизации, которая представляет собой метод отображения контента без мерцания.

...