迭代几个视频文件与您的实现没有太大区别:
- 在每个“视频文件迭代”开始时使用
cap = cv2.VideoCapture(intput_filename)。
和你一样。
- 在每次“视频文件迭代”结束时使用
cap.release()。
在您发布的代码中,您似乎将cap.release() 放在了错误的位置。
- 继续推进图像计数器(用于给出连续的文件名)。
和你一样。
我不确定你的代码:
if ret == False:
break
看来断点的缩进不正确。
我创建了一个“自包含”的代码示例:
- 生成两个合成视频文件(用作输入)。
- 迭代视频文件名(在外循环中)。
- 从视频文件中读取帧(在内部循环中)。
- 将帧写入 JPEG 图像文件。
- 在阅读时显示视频帧(用于测试)。
代码如下:
import numpy as np
import cv2
import os
intput_filename1 = 'input_vid1.avi'
intput_filename2 = 'input_vid2.avi'
# List of video file names
intput_filenames = [intput_filename1, intput_filename2]
# Generate two synthetic video files to be used as input:
###############################################################################
width, height, n_frames = 640, 480, 30 # 30 frames, resolution 640x480
# Use motion JPEG codec (for testing)
synthetic_out = cv2.VideoWriter(intput_filename1, cv2.VideoWriter_fourcc(*'MJPG'), 25, (width, height))
for i in range(n_frames):
img = np.full((height, width, 3), 60, np.uint8)
cv2.putText(img, str(i+1), (width//2-100*len(str(i+1)), height//2+100), cv2.FONT_HERSHEY_DUPLEX, 10, (30, 255, 30), 20) # Green number
synthetic_out.write(img)
synthetic_out.release()
width, height, n_frames = 320, 240, 20 # 20 frames, resolution 320x240
synthetic_out = cv2.VideoWriter(intput_filename2, cv2.VideoWriter_fourcc(*'MJPG'), 25, (width, height))
for i in range(n_frames):
img = np.full((height, width, 3), 60, np.uint8)
cv2.putText(img, str(i+1), (width//2-50*len(str(i+1)), height//2+50), cv2.FONT_HERSHEY_DUPLEX, 5, (255, 30, 30), 10) # Blue number
synthetic_out.write(img)
synthetic_out.release()
###############################################################################
i = 1 # Images file counter
# Iterate file names:
for intput_filename in intput_filenames:
cap = cv2.VideoCapture(intput_filename)
# Keep iterating break
while True:
ret, frame = cap.read() # Read frame from first video
if ret:
cv2.imwrite(str(i) + '.jpg', frame) # Write frame to JPEG file (1.jpg, 2.jpg, ...)
cv2.imshow('frame', frame) # Display frame for testing
i += 1 # Advance file counter
else:
# Break the internal loop when res status is False.
break
cv2.waitKey(100) #Wait 100msec (for debugging)
cap.release() #Release must be inside the outer loop
cv2.destroyAllWindows()
更新:
把这个放到一个函数中:
def extract_multiple_videos(intput_filenames):
"""Extract video files into sequence of images.
Intput_filenames is a list for video file names"""
i = 1 # Counter of first video
# Iterate file names:
for intput_filename in intput_filenames:
cap = cv2.VideoCapture(intput_filename)
# Keep iterating break
while True:
ret, frame = cap.read() # Read frame from first video
if ret:
cv2.imwrite(str(i) + '.jpg', frame) # Write frame to JPEG file (1.jpg, 2.jpg, ...)
cv2.imshow('frame', frame) # Display frame for testing
i += 1 # Advance file counter
else:
# Break the interal loop when res status is False.
break
cv2.waitKey(100) #Wait 100msec (for debugging)
cap.release() #Release must be inside the outer loop