我是通过一个摄像头捕捉视频,它提供了一个mjpeg流。我在一个工作线程中拍摄了视频。我就这样开始抓捕:
const std::string videoStreamAddress = "http://192.168.1.173:80/live/0/mjpeg.jpg?x.mjpeg";
qDebug() << "start";
cap.open(videoStreamAddress);
qDebug() << "really started";
cap.set(CV_CAP_PROP_FRAME_WIDTH, 720);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 576);
摄象机正在以20 the的速度向溪流进发。但如果我在20 this读到这样的话:
if (!cap.isOpened()) return;
Mat frame;
cap >> frame; // get a new frame from camera
mutex.lock();
m_imageFrame = frame;
mutex.unlock();
然后是一个3+秒延迟。原因是,捕获的视频首先存储在buffer.When中,我首先启动相机,缓冲区是累积的,但我没有读出帧。因此,如果我从缓冲区读取,它总是给我旧的框架。我现在唯一的解决方案是以30 lag读取缓冲区,这样它就可以快速清除缓冲区,并且没有更严重的滞后。
是否有其他可能的解决方案,以便每次启动相机时都可以手动清理/刷新缓冲区?
发布于 2019-07-12 20:00:12
如果你知道你的相机的帧率,你可以使用这个信息(即每秒30帧)来抓取这些帧,直到你得到一个更低的帧速率。它之所以有效,是因为如果抓取功能变得延迟(即获得比标准帧速率更多的时间),这意味着缓冲区内的每一帧都需要等待下一帧才能从摄像机中获得。
while(True):
prev_time=time.time()
ref=vid.grab()
if (time.time()-prev_time)>0.030:#something around 33 FPS
break
ret,frame = vid.retrieve(ref)
https://stackoverflow.com/questions/30032063
复制相似问题