opencv cv2 视频延迟

场景:想要用 opencv 导入视频做运动监测

遇到的问题:发现视频不是按源的帧数播放,而是变慢了

通过OpenCV 的文档看到了:

“If it is too less, video will be very fast and if it is too high, video will be slow (Well, that is how you can display videos in slow motion). 25 milliseconds will be OK in normal cases.”

错误原因: opencv的cap.read()会有一定的缓存,不是读的实时帧.

尝试解决:

1.  OpenCV默认输出格式为YUYV,可将其改成MJPG格式。(未解决我的问题)

...
capture.open(1);
//这里添加一行
//OpenCV 2
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
//or OpenCV 3
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
//继续接下来的代码
capture.set(CV_CAP_PROP_FRAME_WIDTH, 2560);  //设置捕获视频的宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 720);  //设置捕获视频的高度
...

​​​​​​OpenCV读取视频产生稳定延迟情况的解决方案(一) Solution for reading pictures with stable delay by OpenCV_GEANNACAO的博客-CSDN博客_opencv 延迟

2.  Set maximum buffer size 设置最大的缓冲区大小

我们用cv2.CAP_PROP_BUFFERSIZE 将cv2.videoCapture() 设置为有一个有限的缓冲区大小。通过限制缓冲区,我们将始终拥有最新的帧。这也可以帮助缓解帧随机跳转的问题。

3. Set frame retrieval delay 设置帧检索延迟

read()的读取速度太快了。这就是为什么所有的帧都集中在一起,并在下一帧突然爆发的原因之一。比如说,在一秒钟的时间间隔内,它可能产生15个新的帧,但在下一个一秒钟的间隔内,只返回3个帧。这可能是由于网络包帧丢失,所以为了确保我们获得恒定的帧率,我们只是在帧检索线程中添加一个延迟。获得大约30FPS的延迟可以很好地 "正常化 "帧率,并在有数据包丢失的情况下平滑帧之间的过渡。

注意:应该尝试与视频的帧率相匹配。另外,"本地 "的视频会比通过网络获取的视频会好很多。

class ThreadedCamera(object):
    def __init__(self, src=0):
        self.capture = cv2.VideoCapture(src)
        self.capture.set(cv2.CAP_PROP_BUFFERSIZE, 2)

        # FPS = 1/X
        # X = desired FPS
        self.FPS = 1/30
        self.FPS_MS = int(self.FPS * 1000)

        # Start frame retrieval thread
        self.thread = Thread(target=self.update, args=())
        self.thread.daemon = True
        self.thread.start()

    def update(self):
        while True:
            if self.capture.isOpened():
                (self.status, self.frame) = self.capture.read()
            time.sleep(self.FPS)

    def show_frame(self):
        cv2.imshow('frame', self.frame)
        cv2.waitKey(self.FPS_MS)

if __name__ == '__main__':
    src = '.mp4'
    threaded_camera = ThreadedCamera(src)
    while True:
        try:
            threaded_camera.show_frame()
        except AttributeError:
            pass

​​​​​​​​​​​​​​https://stackoverflow.com/questions/58293187/opencv-real-time-streaming-video-capture-is-slow-how-to-drop-frames-or-get-sync

你可能感兴趣的:(opencv,人工智能,计算机视觉)