【问题标题】:Python + OpenCV + Base64: Issue with converting frame to base64Python + OpenCV + Base64:将帧转换为 base64 的问题
【发布时间】:2020-10-07 13:55:09
【问题描述】:

我正在尝试将视频转换为帧,然后将这些帧转换为 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__

【问题讨论】:

    标签: python opencv base64


    【解决方案1】:

    在函数 frame_to_base64(frames) 中,frames 已经是单个图像,因为 VideoCapture.read 返回单个图像。它也是一个 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
    

    虽然取决于视频长度,您可能会遇到内存问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 2020-01-17
      • 1970-01-01
      • 2023-02-24
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多