对于每个标题,我正在尝试编写代码以循环浏览文件夹中的多个视频以提取其帧,然后将每个视频的帧写入其自己的新文件夹,例如video1到frames_video1,video2到frames_video2。
这是我的代码:
subclip_video_path = main_path + "\\subclips"
frames_path = main_path + "\\frames"
#loop through videos in file
for subclips in subclip_video_path:
currentVid = cv2.VideoCapture(subclips)
success, image = currentVid.read()
count = 0
while success:
#create new frames folder for each video
newFrameFolder = ("frames_" + subclips)
os.makedirs(newFrameFolder)
我收到此错误:
[ERROR:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-k8sx3e60\opencv\modules\videoio\src\cap.cpp (142) cv::VideoCapture::open VIDEOIO(CV_IMAGES): raised OpenCV exception:
OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-k8sx3e60\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): P in function 'cv::icvExtractPattern'
这是什么意思?我该如何解决?
答案 0 :(得分:1)
for subclips in subclip_video_path:
您需要获取视频列表:
from glob import glob
sub_clip_video_path = glob("sub_clip_video_path/*.mp4")
这意味着获取所有.mp4扩展名视频文件并将其存储在sub_clip_video_path
变量中。
我的结果:
['sub_clip_video_path/output.mp4', 'sub_clip_video_path/result.mp4']
由于我确定目录中包含两个.mp4
扩展名文件,因此我现在可以继续。
VideoCapture
。for count, sub_clips in enumerate(sub_clip_video_path):
currentVid = cv2.VideoCapture(sub_clips)
success, image = currentVid.read()
count = 0
声明VideoCapture
后,请从当前视频中读取所有帧,然后为下一个视频声明VideoCapture
。
for count, sub_clips in enumerate(sub_clip_video_path):
currentVid = cv2.VideoCapture(sub_clips)
image_counter = 0
while currentVid.isOpened():
.
.
while success
,这会创建一个无限循环。如果从视频中捕获了第一帧,则success
变量将返回True
。当你说:
while success:
#create new frames folder for each video
newFrameFolder = ("frames_" + subclips)
os.makedirs(newFrameFolder)
您将为当前帧创建无限数量的文件夹。
这是我的结果:
import os
import cv2
from glob import glob
sub_clip_video_path = glob("sub_clip_video_path/*.mp4") # Each image extension is `.mp4`
for count, sub_clips in enumerate(sub_clip_video_path):
currentVid = cv2.VideoCapture(sub_clips)
image_counter = 0
while currentVid.isOpened():
success, image = currentVid.read()
if success:
newFrameFolder = "frames_video{}".format(count + 1)
if not os.path.exists(newFrameFolder):
os.makedirs(newFrameFolder)
image_name = os.path.join(newFrameFolder, "frame{}.png".format(image_counter + 1))
cv2.imwrite(image_name, image)
image_counter += 1
else:
break
我使用glob
正在读取当前视频:
for count, sub_clips in enumerate(sub_clip_video_path):
currentVid = cv2.VideoCapture(sub_clips)
image_counter = 0
while currentVid.isOpened():
如果成功捕获了当前帧,则声明文件夹名称。如果该文件夹不存在,请创建它。
if success:
newFrameFolder = "frames_video{}".format(count + 1)
if not os.path.exists(newFrameFolder):
os.makedirs(newFrameFolder)
然后声明图像名称并保存。
image_name = os.path.join(newFrameFolder, "frame{}.png".format(image_counter + 1))
cv2.imwrite(image_name, image)
image_counter += 1