Python + OpenCV + Base64:将帧转换为 base64 的问题
Python + OpenCV + Base64: Issue with converting frame to base64
我正在尝试将视频转换为帧,然后将这些帧转换为 base64 字符串。我无法这样做并得到一些例外。下面是我的代码:
import cv2
import base64
def footage_to_frame(video):
vidcap = cv2.VideoCapture(video)
success, frames = vidcap.read()
if success:
return frames
def frame_to_base64(frames):
with frames as frame:
frame_b64 = base64.b64encode(frame.read())
return frame_b64
该方法的函数调用是:
frames = converter.footage_to_frame("/Users/myname/Desktop/video.mp4")
converter.frame_to_base64(frames)
以下是我在控制台中得到的错误:
File "/Users/myname/Desktop/Test/src/service/converter.py", line 13, in frame_to_base64
with frames as frame:
AttributeError: __enter__
在函数frame_to_base64(frames)中,frames已经是单张图片了,因为VideoCapture.read returns是单张图片。它也是一个 opencv 图像(numpy 数组),你不能在上面使用“with”。
def frame_to_base64(frame):
return base64.b64encode(frame)
如果你想读取视频的所有帧,你应该这样做:
import cv2
import base64
def footage_to_frame(video):
vidcap = cv2.VideoCapture(video)
frames = []
# read until no more frames exist in the video
while True:
success, frame = vidcap.read()
if (success):
frames.append(frame)
else:
# unable to read a frame
break
return frames
def frames_to_base64(frames):
frames_b64 = []
# iterate frames and convert each of them to base64
for frame in frames:
frames_b64.append(base64.b64encode(frame))
return frames_b64
虽然根据视频长度,您可能会遇到内存问题。
我正在尝试将视频转换为帧,然后将这些帧转换为 base64 字符串。我无法这样做并得到一些例外。下面是我的代码:
import cv2
import base64
def footage_to_frame(video):
vidcap = cv2.VideoCapture(video)
success, frames = vidcap.read()
if success:
return frames
def frame_to_base64(frames):
with frames as frame:
frame_b64 = base64.b64encode(frame.read())
return frame_b64
该方法的函数调用是:
frames = converter.footage_to_frame("/Users/myname/Desktop/video.mp4")
converter.frame_to_base64(frames)
以下是我在控制台中得到的错误:
File "/Users/myname/Desktop/Test/src/service/converter.py", line 13, in frame_to_base64
with frames as frame:
AttributeError: __enter__
在函数frame_to_base64(frames)中,frames已经是单张图片了,因为VideoCapture.read returns是单张图片。它也是一个 opencv 图像(numpy 数组),你不能在上面使用“with”。
def frame_to_base64(frame):
return base64.b64encode(frame)
如果你想读取视频的所有帧,你应该这样做:
import cv2
import base64
def footage_to_frame(video):
vidcap = cv2.VideoCapture(video)
frames = []
# read until no more frames exist in the video
while True:
success, frame = vidcap.read()
if (success):
frames.append(frame)
else:
# unable to read a frame
break
return frames
def frames_to_base64(frames):
frames_b64 = []
# iterate frames and convert each of them to base64
for frame in frames:
frames_b64.append(base64.b64encode(frame))
return frames_b64
虽然根据视频长度,您可能会遇到内存问题。