为不同视频的视频帧创建新目录时出错

2024-10-03 04:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

根据标题,我试图编写代码,循环浏览文件夹中的多个视频以提取它们的帧,然后将每个视频的帧写入它们自己的新文件夹,例如video1到frames\u video1,video2到frames\u 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'

这是什么意思?我怎样才能解决这个问题


Tags: path代码in文件夹forframes视频main
1条回答
网友
1楼 · 发布于 2024-10-03 04:25:43
  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扩展文件,现在我可以继续了

  1. 您不需要为每个帧重新声明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():
          .
          .
  1. 不要使用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
      

相关问题 更多 >