使用opencv boost引入直播流延迟

时间:2014-12-18 13:43:34

标签: opencv boost webcam live-streaming

我正在尝试在从网络摄像头获取的直播中创建延迟。我正在使用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();
    }

1 个答案:

答案 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。