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,感谢你花时间帮助其他人解决堆栈溢出问题。为了提高答案的质量,请考虑展示一个示例解决方案,或许解释为什么修复是必要的。