Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数读取视频并转换为帧_Python_Python 3.x_Opencv_Video_Video Processing - Fatal编程技术网

Python函数读取视频并转换为帧

Python函数读取视频并转换为帧,python,python-3.x,opencv,video,video-processing,Python,Python 3.x,Opencv,Video,Video Processing,我想将输入视频转换为一组帧。我已经在网上看过这篇文章了 . 但是我想有一个函数,我可以插入视频作为参数,而不是视频文件的位置 在下面的视频捕获功能中,它接收视频文件的位置 import cv2 def vidtoframes(videoFile): vidcap = cv2.VideoCapture(videoFile) success,image = vidcap.read() count = 0 while success: cv2.imwrite("frame%d.jpg"

我想将输入视频转换为一组帧。我已经在网上看过这篇文章了 .

但是我想有一个函数,我可以插入视频作为参数,而不是视频文件的位置

在下面的视频捕获功能中,它接收视频文件的位置

import cv2
def vidtoframes(videoFile):
 vidcap = cv2.VideoCapture(videoFile)
 success,image = vidcap.read()
 count = 0

 while success:
  cv2.imwrite("frame%d.jpg" % count, image) # save frame as JPEG file      
  success,image = vidcap.read()
  print('Read a new frame: ', success)
  count += 1

但是,有没有一种功能或方法可以将视频传递给该方法,并将其转换为帧数组,而无需将任何内容保存到磁盘上。

拍摄的视频必须保存到一个目录中,然后我们可以对其执行这些功能。这就是应用程序的工作方式。

面向对象方法:编写一种“VideoWrapper”类和派生类:

from abc import abstractmethod

class VideoWrapper:
    def __init__(self, path: str, chunk_size: int = 1):
        self.path = path
        self.chunk_size = chunk_size

    @abstractmethod
    def __iter__(self): ...

class VideoFileWrapper(VideoWrapper):
    def __iter__(self):
        chunk = []
        cap = cv2.VideoCapture(self.path)
        while cap.isOpened():
            ret, frame = cap.read()
            chunk.append(frame)
            if len(chunk) == self.chunk_size:
                yield chunk
                chunk = []


class VideoFolderWrapper(VideoWrapper):
    def __iter__(self):
        chunk = []
        for frame_path in glob(os.path.join(self.path, '*')):
            frame = cv2.imread(frame_path)
            chunk.append(frame)
            if len(chunk) == self.chunk_size:
               yield chunk
               chunk = []
在这种情况下,可以在代码中传递单个类类型。 一个更好的类将实现
\uuuuuuuuuuuuu
\uuuuuuuuuu
方法,以便使用
with
语句、异常处理等。这可能太多了,更简单的“Pythonic”版本是:

def video_wrapper(path):
    if os.path.isdir(path):
        frames = list(glob(os.path.join(path, '*.png')))
        frames.sort(key=file_name_order)
        for frame_path in frames:
            frame = cv2.cvtColor(cv2.imread(frame_path),cv2.COLOR_BGR2RGB)
            yield frame
    elif os.path.exists(path):
        cap = cv2.VideoCapture(path)
        while cap.isOpened():
        ret, frame = cap.read()
        yield frame

你是说视频URL吗?我想制作一个可以将视频转换为一组帧的web应用程序,所以我想使代码具有通用性。我想把上传到网站上的视频转换成一组帧并返回,而不将任何内容保存到文件中。我不知道你的意思。如果视频被上传,那么它会被保存在某个地方,你可以给出它到OpenCV的路径,但是如果视频可以像Youtube一样流式传输,那么你可以使用。我对web开发非常陌生。所以我想知道,视频将保存在哪里?或者我将如何找到它的位置?谢谢你,Hidrana,感谢你花时间帮助其他人解决堆栈溢出问题。为了提高答案的质量,请考虑展示一个示例解决方案,或许解释为什么修复是必要的。