python代码:视频帧提取
以下是Python代码,可对文件夹内的视频按每秒一帧提取,并将提取的帧保存在新的以pic命名的文件夹中。
代码:
import os
import cv2
def extract_images(video_path, output_folder):
# 获取视频文件名
video_name = os.path.splitext(os.path.basename(video_path))[0]
# 新建文件夹
output_path = os.path.join(output_folder, video_name)
if not os.path.exists(output_path):
os.makedirs(output_path)
# 打开视频
cap = cv2.VideoCapture(video_path)
# 获取帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置帧间隔
frame_interval = int(fps)
# 逐帧提取并保存
count = 0
while cap.isOpened():
ret, frame = cap.read()
if ret:
if count % frame_interval == 0:
image_name = os.path.join(output_path, f"{video_name}_{count}.jpg")
cv2.imwrite(image_name, frame)
count += 1
else:
break
cap.release()
# 测试代码
if __name__ == '__main__':
video_path = '/path/to/video.mp4' # 视频文件路径
output_folder = '/path/to/output_folder' # 输出文件夹路径
extract_images(video_path, output_folder)
以下是调整后的代码,可以处理MP4格式的视频:
import os
import cv2
def extract_images(video_path, output_folder):
# 获取视频文件名
video_name = os.path.splitext(os.path.basename(video_path))[0]
# 新建文件夹
output_path = os.path.join(output_folder, video_name)
if not os.path.exists(output_path):
os.makedirs(output_path)
# 打开视频
cap = cv2.VideoCapture(video_path)
# 获取帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 设置帧间隔
frame_interval = int(fps)
# 逐帧提取并保存
count = 0
while cap.isOpened():
ret, frame = cap.read()
if ret:
if count % frame_?!interval == 0:
image_name = os.path.join(output_path, f"{video_name}_{count}.jpg")
cv2.imwrite(image_name, frame)
count += 1
else:
break
cap.release()
# 测试代码
if __name__ == '__main__':
video_path = '/path/to/video.mp4' # 视频文件路径
output_folder = '/path/to/output_folder' # 输出文件夹路径
extract_images(video_path, output_folder)
其中,您只需要将 video_path 和 output_folder 变量改为您的实际路径即可。请注意,本代码仅适用于MP4格式的视频,如果您的视频格式不同,可能需要相应修改代码。
多线程版本
import os
import cv2
import threading
video_path = "D:/PR/教程2/"
pic_path = "D:/PR/教程2/"
filelist = os.listdir(video_path)
lock = threading.Lock() # 创建锁对象
def video2pic(filename):
with lock: # 锁定锁对象,确保每个线程都能够成功创建文件夹
if not os.path.exists(pic_path + str(filename)):
os.mkdir(pic_path + str(filename))
cnt = 0
dnt = 0
cap = cv2.VideoCapture(video_path + str(filename))
while True:
ret, image = cap.read()
if image is None:
break
w = image.shape[1]
h = image.shape[0]
if (cnt % 20) == 0:
with lock: # 锁定锁对象,确保每个线程都能够成功保存图像
cv2.imencode('.jpg', image)[1].tofile(pic_path + str(filename) + '/' + str(dnt) + '.jpg')
print(pic_path + str(filename) + '/' + str(dnt) + '.jpg')
dnt = dnt + 1
cnt = cnt + 1
if cv2.waitKey(1) & 0xFF == ord('q'):
break