Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV-如何在队列中推回垫子?_C++_Opencv_Resize_Mat_Deque - Fatal编程技术网

C++ OpenCV-如何在队列中推回垫子?

C++ OpenCV-如何在队列中推回垫子?,c++,opencv,resize,mat,deque,C++,Opencv,Resize,Mat,Deque,我试图把视频的帧放在一个deque中。此代码不起作用。因为队列的后面和前面都与当前帧相同 deque frameSeq; int main(){ 垫架; 视频捕获视频(“视频路径”); int键=0; while(键!=“q”){ 视频>>帧; 框架顺序向后推(框架); imshow(“front”,frameSeq.front()); imshow(“back”,frameSeq.back()); key=cvWaitKey(1); } 返回0; } 但当我调整帧的大小时: deque fr

我试图把视频的帧放在一个deque中。此代码不起作用。因为队列的后面和前面都与当前帧相同

deque frameSeq;
int main(){
垫架;
视频捕获视频(“视频路径”);
int键=0;
while(键!=“q”){
视频>>帧;
框架顺序向后推(框架);
imshow(“front”,frameSeq.front());
imshow(“back”,frameSeq.back());
key=cvWaitKey(1);
}
返回0;
}
但当我调整帧的大小时:

deque frameSeq;
int main(){
垫架;
视频捕获视频(“视频路径”);
int键=0;
while(键!=“q”){
视频>>帧;
cv::resize(帧,帧,cv::Size(),1.0/2,1.0/2);
框架顺序向后推(框架);
imshow(“front”,frameSeq.front());
imshow(“back”,frameSeq.back());
key=cvWaitKey(1);
}
返回0;
}
它工作得很好。现在,
frameSeq.back()
是当前帧,
frameSeq.front()
是初始帧


如何在不调整帧大小的情况下使队列正常工作?

鉴于在您提供的两个示例中,您都将单个帧推入队列,因此之前如何处理帧并不重要——帧的前后始终相同。请提供事实证明您提到的问题。@DanMašek我修复了该部分。您实际上不需要调整大小,特别是,重要的部分是执行调整大小的副作用——因为新图像的大小不同,
frame
中的底层缓冲区被重新分配,不再与其他任何东西共享。简单的深度复制也可以(
frameSeq.push_back(frame.clone());
)。这是因为
Mat
的工作原理与智能指针类似。出于性能原因,
VideoCapture
(或者可能只是
>
操作符)对返回的所有帧重复使用相同的缓冲区。通常情况下,这不是问题,但在你的情况下,你明确地必须复制。确切地说,这只是一个巧合。使用大小/类型不正确的
Mat
作为输出会导致分配一个新的独立数组另一种可能的方法是,代替
clone()
放置
Mat帧
while
循环的范围内。如果这样做有效,那么每次迭代都可以避免整个缓冲区的一个副本。(如果重用是由于范围更大的
>
只要在大小合适时复制到队列中,然后就用浅(共享)副本填充队列,这种情况就是如此。--我认为这更合适)。