我阅读了使用Python 3.6.5和OpenCV 3.4.1的mp4视频,并对每个帧进行一些(资源密集型)计算。

我当然拥有帧的总数(length)和当前帧的总数(count),所以我想在命令行中提供进度更新,但不幸的是,它仅在整个过程完成后才显示所有内容。

while cap.isOpened():
    ret, frame = cap.read()

    if ret:
        # Calculation stuff
        ...

        # Print the current status
        print("Frame %s/%s" % (count, length))

        count = count + 1

不幸的是,它仅在视频文件完全处理后才打印ALL。
如何打印当前帧的“实时”状态?

我将MINGW64(Windows)用作控制台

最佳答案

乍一看,这是由于您的代码中可能包含控制流指令(例如breakcontinue等),从而阻止了解释器到达该行。

因此,您应该确保在这些指令之前进行打印,我们可以仅在顶部进行打印,例如:

while cap.isOpened():
    ret, frame = cap.read()
    print("Frame %s/%s" % (count, length))
    count += 1

    if ret:
        # Calculation stuff
        # ...
        pass

话虽如此,我们可以将捕获过程转换为生成器,该生成器使用良好的进度条来打印值,例如:
from tqdm import tqdm
from cv2 import CAP_PROP_FRAME_COUNT

def frame_iter(capture, description):
    def _itertor():
        while capture.grab():
            yield capture.retrieve()[1]
    return tqdm(
        _iterator(),
        desc=description,
        total=int(capture.get(CAP_PROP_FRAME_COUNT)),
    )

然后我们可以像这样使用它:
for frame in frame_iter(capture, 'some description'):
    # process the frame
    pass

它将显示进度条,如GitHub repository of tqdm 中所示。

08-16 18:37