我正在尝试在从网络摄像头获取的直播中创建延迟。我正在使用opencv。但是,我无法产生所需的延迟。我很困惑如何设置和处理FPS和延迟。下面是我的代码: 我目前正在使用fps的常量值。但我不确定我们是否能做到这一点。 目前,在填充队列时,流显示有一些初始延迟。但在那之后,流中没有延迟。
fps=15;
wait= (1000.0/fps);
queue<cv::Mat> _buffer;
while(1)
{
int size_x=0;
//grad a frame from the video camers
boost::unique_lock<boost::mutex> lock(mutex, boost::defer_lock);
bool read = cap.read(image);
if(!read)
break;
locked= lock.try_lock();
if(locked){
if(image.data){
_buffer.push(image);
waitKey(wait);
if((int)_buffer.size() > (buffer_lenght))
{
popped_img=_buffer.front();
_buffer.pop();
imshow("VideoCaptureTutorial", popped_img);
}
}
lock.unlock();
}
答案 0 :(得分:0)
我在你的代码中发现了两个问题。
1)尝试减少waitKey值,使用较长的等待时间,opencv可能会在实时流时跳过帧。哪个与您的问题无关,但我认为这可能会有所帮助。
waitKey(30);
以上这条线可能还不错。
2)你必须推送Mat.clone(),我认为,在这种情况下,这可能会解决你的问题。
_buffer.push(image.clone());
Opencv的get / set fps在实时流上不起作用,如果你想获得fps for live feed,你必须使用自己的计数器。正如我所做的那样,如果,我是你。
VideoCapture cap(0);
double counter=0;
clock_t t1 = clock();
Mat frame;
while(1)
{
counter++;
cap.read(frame);
}
double fps = (Clock()-t1)/counter;
//assuming, you are on windows, clock() would give in seconds or else, it would be in ms
完全相反,除此之外,使用视频任务将livefeed保存为视频文件,然后使用get fps来了解fps。