我用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)作为我的控制台
答案 0 :(得分:1)
初看起来,这是因为你的代码中可能有控制流指令(如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
中显示的进度条。
答案 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()