是否可以从视频文件中保存所需数量的图像(DESIRED_FRAMES_TO_SAVE
),并在整个视频文件素材中均匀分布?
希望这是有意义的,我有一个视频文件,是8秒的长度,我想保存60帧的视频文件的顺序。
尝试扔在一起的东西在打开CV的代码工作,但我知道它应该得到改进。例如,if count % 3 == 0:
我从计算的视频文件的总帧是223
,然后除以DESIRED_FRAMES_TO_SAVE
或60
我想出约3.72...所以换句话说,我认为每3或4帧,我应该保存一个来提出~ DESIRED_FRAMES_TO_SAVE
的视频文件的结尾。对不起,这是一个奇怪的问题,但有人有任何建议,如何重写这个更好地没有到while循环?
import cv2
VIDEO_FILE = "hello.mp4"
DESIRED_FRAMES_TO_SAVE = 60
count = 0
cap = cv2.VideoCapture(VIDEO_FILE)
'''
# calculate total frames
while True:
success, frame = cap.read()
if success == True:
count += 1
else:
break
total_frames = count
print("TOTAL_FRAMES",total_frames)
'''
count = 0
while True:
success, frame = cap.read()
name = './raw_images/' + str(count) + '.jpg'
if success == True:
if count % 3 == 0:
cv2.imwrite(name, frame)
print(count)
elif count > DESIRED_FRAMES_TO_SAVE:
break
count += 1
else:
break
cap.release()
cv2.destroyAllWindows()
2条答案
按热度按时间yyhrrdl81#
OpenCV是为计算机视觉设计的。它可以读取视频文件,但它不是为这个而设计的。它有真实的的局限性。它给你的是“帧有索引”这种破碎的抽象。
你***必须***为***可变帧速率***做好准备,这是一个真实的东西。许多视频文件不通过“索引”而是通过***时间戳***来跟踪帧。视频文件也可能不知道它们包含多少帧。任何帧计数只是持续时间(这是真实的)乘以 * 平均 * 帧速率(这是猜测)。
最可靠的解决方案是读取整个视频,查看每个帧的时间戳,然后决定是否保留它。这只需要一点数学和一些计数。伪代码:
如果你想赌博,你可以试着“寻找”。首先你计算你想保留的理想时间戳,然后你“寻找”到那些位置。
一般来说,搜索(不仅仅是OpenCV)有两种操作模式。在任何情况下,库都会告诉你“确切”的位置,所以它不是“不精确”(对于一些“不精确”的概念)。
CAP_PROP_POS_FRAMES
可能是谎言。它只需要时间戳,然后除以平均帧率。时间戳是视频中唯一的真相。即使
CAP_PROP_FRAME_COUNT
也可能是一个谎言。它是从真实的持续时间和平均帧速率计算出来的。遗憾的是,OpenCV并没有公开视频持续时间,但它是OpenCV内部的一个基本值。取帧数,然后乘以(平均)帧速率,得到持续时间。所有这些都假设使用ffmpeg后端,这是OpenCV中视频文件最常见(和默认)的选择。其他一些专业后端,如内置的AVI+MJPEG后端,* 确实 * 有全部信息,由于文件格式。
e0bqpujr2#
完整的代码也需要看一下ffmeg: