我阅读了使用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)用作控制台
最佳答案
乍一看,这是由于您的代码中可能包含控制流指令(例如break
,continue
等),从而阻止了解释器到达该行。
因此,您应该确保在这些指令之前进行打印,我们可以仅在顶部进行打印,例如:
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
中所示。