Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
Qt 在OpenCV::VideoCapture中引入延迟_Qt_Opencv - Fatal编程技术网

Qt 在OpenCV::VideoCapture中引入延迟

Qt 在OpenCV::VideoCapture中引入延迟,qt,opencv,Qt,Opencv,我有一个Camera类继承自cv::VideoCapture,它的核心方法是将我从实时流中获得的cv::Mat转换为QImage: QImage Camera::getFrame() { if(isOpened()) { cv::Mat image; (*this) >> image; cv::cvtColor(image, image, CV_BGR2RGB); return QImage((uchar*) i

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

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,它调用此方法并添加延迟:

void CameraDelayedView::timerEvent(QTimerEvent *evt) {
    if(cam != NULL) {
        buffer.enqueue(cam->getFrame());

        if(buffer.size() > delay*fps) {
            setPixmap(QPixmap::fromImage(buffer.dequeue()));
        }
    }
}
我可以看到,视频的初始显示延迟了5秒,但在这之后,它运行平稳。似乎这些图像仍然以某种方式与实时反馈指针相关联(或者QQUEUE不是一个合适的FIFO,但我对此表示怀疑)。。。是这样吗

如果是的话,我可以用这种方式回答其他正在经历同样事情的人,我会对一种高效的复制方式感兴趣(或者更高效地复制上述代码)。如果不是,我不知道发生了什么

提前谢谢

问候,,
Mster Mystère

摄像机的反馈在某种缓冲区中排队。我自己也曾努力解决过这个问题,使用一个单独的线程解决了它,它不断地从缓冲区中获取帧,如果有人要求,它会将帧发送到主线程

摄像机的馈送在某种缓冲区中排队。我自己也曾努力解决过这个问题,使用一个单独的线程解决了它,它不断地从缓冲区中获取帧,如果有人要求,它会将帧发送到主线程

所有摄像头在执行
流式启动
(v4l术语)请求后都需要一段时间的预热,其范围从几毫秒到几秒钟不等

如果你负担不起第一帧的延迟,你最好让相机开着。然后,你可能会发现自己变老了。在这种情况下,您需要在开始时冲洗相机。也就是说:在存在可用的[过时]帧时,快速丢弃所有可用的[过时]帧。(您需要能够知道是否存在无阻塞的新图像)


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

流式启动
(v4l术语)请求之后,所有相机都需要一段时间的预热,其范围从几毫秒到几秒钟不等

如果你负担不起第一帧的延迟,你最好让相机开着。然后,你可能会发现自己变老了。在这种情况下,您需要在开始时冲洗相机。也就是说:在存在可用的[过时]帧时,快速丢弃所有可用的[过时]帧。(您需要能够知道是否存在无阻塞的新图像)


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

谢谢您的回答。我现在意识到,我可能还没有明确我的目标:虽然我的声音听起来很疯狂,但我希望在摄像机的反馈中有一个可设置的延迟。所以热身对我来说没什么大不了的,只要能在延迟之内。不过,对于非延迟视图来说,这是一个好消息,我也有,然后你们讨论的是“帧速率”设置,这是所有相机都应该提供的。我见过便宜的相机只能拍30帧。在这种情况下,您可以让一个线程设置一个“最新图像”图像缓冲区,以防您感兴趣。如果没有人读它,它就是丢失了。然后,从线程中读取一个图像(这会立即出现,因为您正在读取一个已经接收到的图像),然后等待所需的时间。帧速率应保持“平滑”为30fps(最大)。这真的像是让一条路停了一段时间,几乎堵车,然后让它自己流动:这只是开始时的延迟,因此接收到的图像应该是一次延迟之前看到的图像。但对于最后一部分,阅读图像并等待所需的时间基本上是我在上面代码中尝试做的,它根本不起作用…谢谢你的回答。我现在意识到,我可能还没有明确我的目标:虽然我的声音听起来很疯狂,但我希望在摄像机的反馈中有一个可设置的延迟。所以热身对我来说没什么大不了的,只要能在延迟之内。不过,对于非延迟视图来说,这是一个好消息,我也有,然后你们讨论的是“帧速率”设置,这是所有相机都应该提供的。我见过便宜的相机只能拍30帧。在这种情况下,您可以让一个线程设置一个“最新图像”图像缓冲区,以防您感兴趣。如果没有人读它,它就是丢失了。然后,从线程中读取一个图像(这会立即出现,因为您正在读取一个已经接收到的图像),然后等待所需的时间。帧速率应保持“平滑”为30fps(最大)。这真的像是让一条路停了一段时间,几乎堵车,然后让它自己流动:这只是开始时的延迟,因此接收到的图像应该是一次延迟之前看到的图像。但对于最后一部分,阅读图像并等待所需的时间基本上是我在上述代码中尝试做的事情,它根本不起作用…谢谢你的回答,所以它不是那么明显。为了保持简单,简单地复制每个帧的内容本身是否有效?对我来说,这听起来很明显,但也可以肯定。如果是,我应该如何复制image.data,它是否由空字符限定?你一定是复制了它,甚至使用线程可以在以后发送,不是吗?我使用纯OpenCV的线程。只是
cap>>垫
在无限循环中,如果需要,可以提取一些互斥对象
mat
。我建议不要尝试一次性完成,而是将其分为几个步骤,如清空缓冲区、获取最新帧、将其发送到qt……事实上,我正试图在每一帧将OpenCV与qt分离,在存储之前将其翻译成QImage。也许有一种更独立的方法可以做到这一点,因为它们仍然是以这种方式链接的(可能是通过image.data)。谢谢你的回答,所以这并不明显。为了保持简单,简单地复制每个帧的内容本身是否有效?苏