如何使用Python和OpenCV模块来确定文件(.avi)中帧的总数。
如果可能的话,我们可以通过此方法获取哪些视频文件信息(分辨率、fps、持续时间等)。
如何使用Python和OpenCV模块来确定文件(.avi)中帧的总数。
如果可能的话,我们可以通过此方法获取哪些视频文件信息(分辨率、fps、持续时间等)。
使用更新的OpenCV版本(我使用的是3.1.0),它可以这样工作:
import cv2
cap = cv2.VideoCapture("video.mp4")
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print( length )
其他视频属性同理,使用 cv2.CAP_PROP_*
。
import cv2
cap = cv2.VideoCapture(fn)
if not cap.isOpened():
print("could not open :",fn)
return
length = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
width = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
点击这里获取更多信息。
另外,这些属性不是全部必需的,有些可能因为您的设备或视频编码器而无法使用,请谨慎使用。
确定视频文件中帧数的方法有两种
方法 #1很快且依赖于OpenCV的视频属性功能,可以几乎瞬间确定视频文件中的帧数。但是,这种方法存在精度折衷,因为它取决于您的OpenCV和视频编解码器版本。另一方面,手动计算每个帧将是100%准确的,尽管它会明显地更慢。以下是一个尝试默认执行方法 #1 的函数,如果失败,则自动使用方法#2。
def frame_count(video_path, manual=False):
def manual_count(handler):
frames = 0
while True:
status, frame = handler.read()
if not status:
break
frames += 1
return frames
cap = cv2.VideoCapture(video_path)
# Slow, inefficient but 100% accurate method
if manual:
frames = manual_count(cap)
# Fast, efficient but inaccurate method
else:
try:
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
except:
frames = manual_count(cap)
cap.release()
return frames
基准测试
if __name__ == '__main__':
import timeit
import cv2
start = timeit.default_timer()
print('frames:', frame_count('fedex.mp4', manual=False))
print(timeit.default_timer() - start, '(s)')
start = timeit.default_timer()
print('frames:', frame_count('fedex.mp4', manual=True))
print(timeit.default_timer() - start, '(s)')
第一种方法的结果
frames: 3671
0.018054921 (s)
第二种方法的结果
frames: 3521
9.447095287 (s)
请注意,这两种方法的帧数相差150帧,并且方法2比方法1慢得多。因此,如果您需要速度但愿意牺牲准确性,请使用方法1。在需要精确帧数但可以接受延迟的情况下,请使用方法2。
以下是Python 3.6.5(在Anaconda上)和OpenCV 3.4.2的操作方式。 [注意]: 您需要从官方OpenCV 网站中给出的任何属性的“CV_”中删除。
import cv2
cap = cv2.VideoCapture("video.mp4")
property_id = int(cv2.CAP_PROP_FRAME_COUNT)
length = int(cv2.VideoCapture.get(cap, property_id))
print( length )
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
进行检索。 - Scratch'N'PurrCV_CAP_PROP
获取器的解决方案是在循环中遍历整个视频文件。CV_CAP_PROP
可能按您预期工作或可能不按预期工作。
cap.get()
的复杂度是多少吗? - user5586747