首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenCV::VideoCapture中引入延迟

在OpenCV::VideoCapture中引入延迟
EN

Stack Overflow用户
提问于 2013-05-05 06:30:27
回答 2查看 2K关注 0票数 1

我有一个从cv::VideoCapture继承的类Camera,它的核心方法是将我从直播流中获得的cv::Mat转换为QImage:

代码语言:javascript
复制
QImage Camera::getFrame() {
    if(isOpened()) {
        cv::Mat image;
        (*this) >> image;
        cv::cvtColor(image, image, CV_BGR2RGB);
        return QImage((uchar*) image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
    }
    else return QImage();
}

以及一个封装类CameraDelayedView,它调用此方法并添加一个延迟:

代码语言:javascript
复制
void CameraDelayedView::timerEvent(QTimerEvent *evt) {
    if(cam != NULL) {
        buffer.enqueue(cam->getFrame());

        if(buffer.size() > delay*fps) {
            setPixmap(QPixmap::fromImage(buffer.dequeue()));
        }
    }
}

我可以看到5秒的延迟,视频的初始显示是延迟的,但在那之后它运行得很顺利。看起来图片似乎仍然以某种方式通过指针链接到实时提要(或者QQeueue不是一个合适的先进先出,但我对此表示怀疑)……是这样吗?

如果是这样的话,我可能会给正在经历同样事情的其他人一个答案,我会对一种有效的复制方式感兴趣(或者上面的代码更高效)。如果没有,我不知道发生了什么.

提前谢谢。

向您致敬,神秘先生

EN

回答 2

Stack Overflow用户

发布于 2013-05-06 01:00:20

来自摄像机的馈送在某种缓冲器中排队。我自己已经为这个问题挣扎了一段时间,使用一个单独的线程解决了这个问题,这个线程不断地从缓冲区中获取帧,如果被请求,就会向主线程发送一个帧。

票数 2
EN

Stack Overflow用户

发布于 2013-05-06 01:39:36

STREAM-ON (在v4l术语中)请求之后,所有摄像机都需要预热一段时间,范围从几毫秒到几秒不等。

如果你不能承受第一帧的延迟,你最好让相机开着。然后,您可能会发现自己得到的是旧框架。在这种情况下,您需要在开始时对相机进行刷新。也就是说:快速丢弃所有可用的过时帧,而这些帧都存在。(您需要能够知道是否有新的图片而不需要分块)

另一种方法是让线程使用这些图像,并仅在需要时使用它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16379558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档