我正在使用Opencv Mat容器从视频流读取帧。我需要当前和以前的帧。
现在,我将在每次迭代结束时将当前帧复制到上一帧。是否可以使用一个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?
}
答案 0 :(得分:3)
是的,这称为交换。
一种选择是在您的类中保留两个指针。一个用于当前帧,一个用于前一帧。
完成当前帧的处理后,只需交换指针并再次开始处理下一帧(然后可以覆盖当前帧)。
另一种选择是使用两个提供swap
方法的'Person or Group'
,这意味着不进行复制。
其他容器,例如Graph api
或std::vector
也提供了std::list
方法。
搜索双缓冲时,您可能会发现其他信息,这是一种用于显示无闪烁内容的技术。