如何使用OpenCV和Python在视频流中逐帧处理视频图像

发布于 2021-01-29 18:17:56

我是OpenCV的初学者。我想对要上传到服务器的视频帧进行一些图像处理。我只想读取可用的框架并将它们写入目录中。然后,等待视频的另一部分上载并将帧写入目录。并且,我应该等待每个帧都完全上传,然后将其写入文件。

您能告诉我如何使用OpenCV(Python)吗?

编辑1:
我编写了这段代码,用于从文件中捕获视频,而新数据将附加在文件末尾。换句话说,该out.mp4文件不是完整的视频,并且另一个程序正在其上写入新的帧。我要做的是,等待其他程序编写新框架,然后读取并显示它们。

这是我的代码:

import cv2
cap = cv2.VideoCapture("./out.mp4")

while True:
    if cap.grab():
        flag, frame = cap.retrieve()
        if not flag:
            continue
        else:
            cv2.imshow('video', frame)
    if cv2.waitKey(10) == 27:
        break

所以问题出在cap.grab()电话上!如果没有框架,它将返回False!即使我等了很长时间,它也不会再捕获帧。

关注者
0
被浏览
174
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    阅读完的文档后VideoCapture。我发现您可以告诉VideoCapture,下次调用VideoCapture.read()(或VideoCapture.grab())要处理哪个帧。

    问题是,当您要准备read()一个尚未准备就绪的框架时,该VideoCapture对象会卡在该框架上而永远无法进行。因此,您必须强制其从上一帧重新开始。

    这是代码

    import cv2
    
    cap = cv2.VideoCapture("./out.mp4")
    while not cap.isOpened():
        cap = cv2.VideoCapture("./out.mp4")
        cv2.waitKey(1000)
        print "Wait for the header"
    
    pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)
    while True:
        flag, frame = cap.read()
        if flag:
            # The frame is ready and already captured
            cv2.imshow('video', frame)
            pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)
            print str(pos_frame)+" frames"
        else:
            # The next frame is not ready, so we try to read it again
            cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, pos_frame-1)
            print "frame is not ready"
            # It is better to wait for a while for the next frame to be ready
            cv2.waitKey(1000)
    
        if cv2.waitKey(10) == 27:
            break
        if cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
            # If the number of captured frames is equal to the total number of frames,
            # we stop
            break
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看