如何解决为不同视频的视频帧创建新目录时出错
对于每个标题,我正在尝试编写代码以循环浏览文件夹中的多个视频以提取其帧,然后将每个视频的帧写入其自己的新文件夹,例如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'
这是什么意思?我该如何解决?
解决方法
- 您无法遍历字符串:
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
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。