我有一个从cv::VideoCapture继承的类Camera,它的核心方法是将我从直播流中获得的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秒的延迟,视频的初始显示是延迟的,但在那之后它运行得很顺利。看起来图片似乎仍然以某种方式通过指针链接到实时提要(或者QQeueue不是一个合适的先进先出,但我对此表示怀疑)……是这样吗?
如果是这样的话,我可能会给正在经历同样事情的其他人一个答案,我会对一种有效的复制方式感兴趣(或者上面的代码更高效)。如果没有,我不知道发生了什么.
提前谢谢。
向您致敬,神秘先生
发布于 2013-05-06 01:00:20
来自摄像机的馈送在某种缓冲器中排队。我自己已经为这个问题挣扎了一段时间,使用一个单独的线程解决了这个问题,这个线程不断地从缓冲区中获取帧,如果被请求,就会向主线程发送一个帧。
发布于 2013-05-06 01:39:36
在STREAM-ON (在v4l术语中)请求之后,所有摄像机都需要预热一段时间,范围从几毫秒到几秒不等。
如果你不能承受第一帧的延迟,你最好让相机开着。然后,您可能会发现自己得到的是旧框架。在这种情况下,您需要在开始时对相机进行刷新。也就是说:快速丢弃所有可用的过时帧,而这些帧都存在。(您需要能够知道是否有新的图片而不需要分块)
另一种方法是让线程使用这些图像,并仅在需要时使用它们。
https://stackoverflow.com/questions/16379558
复制相似问题