cap.isOpened()在命令行

时间:2018-06-16 16:02:38

标签: python python-3.x opencv

我用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。 如何打印" live"当前帧的状态?

我使用MINGW64(Windows)作为我的控制台

2 个答案:

答案 0 :(得分:1)

初看起来,这是因为你的代码中可能有控制流指令(如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中显示的进度条。

答案 1 :(得分:0)

tqdm中的OpenCV编写器

import numpy as np
import cv2
from tqdm import tqdm

inp = "./videos/a"
out = "b"

inpcap = cv2.VideoCapture(inp+".MP4")
outcap = cv2.VideoWriter(out+".MP4", cv2.VideoWriter_fourcc('H','2','6','4'), 30, (int(inpcap.get(3)),int(inpcap.get(4))))

print(inp)
print(out)
print(int(inpcap.get(3)),int(inpcap.get(4)))

i = 1
pbar = tqdm(total = 80000)
while(inpcap.isOpened()):
    pbar.update(1)
    ret, frame = inpcap.read()
    if(ret == False):
        break
    outcap.write(frame)

inpcap.release()
outcap.release()