将OpenCV2 Videowrite输入发送到缓冲区而不是文件

时间:2015-09-01 01:51:12

标签: python opencv memory

我想将openCV2录像机输出写入内存中的缓冲区而不是硬盘上的文件。接下来我可以写出一个文件或不写(这样可以保存基于闪存的对象不被过度使用)。我已经尝试过pyfilesystem,我尝试过像IO和StringIO这样的东西,但VideoRecorder不接受这些说它正在寻找一个字符串或Unicode类型,而是找到了一个(_IOTextWrapper,IOString等......)类型。

1 个答案:

答案 0 :(得分:1)

我现在得到你的意思,但是我认为这会以某种方式打破VideoWriter的目的。它的工作是磁盘上的视频。但是,我同意,拥有一个可以在cv2中操作的Video类会更好。

与此同时,对我们来说幸运的是,视频只是帧的序列,而不是阵容。我们可以做很多事情,所以这里是我提出的一般想法:

import numpy as np
import cv2

def save_to_vid(video):
    path = ".../output.avi"
    height , width , layers =  video[0].shape
    out = cv2.VideoWriter(path, cv2.cv.FOURCC("X", "V", "I", "D"),
                          20.0, (width, height))
    for frame in frames:
        out.write(frame)

    out.release()


##CAPTURING SOME TEST FRAMES
cap = cv2.VideoCapture(0)
frames = list() #THIS IS YOUR VIDEO
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)
        frames.append(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

#SOMETIMES LATER IN THE RPOGRAM
doYouWantToSave = True
if doYouWantToSave:
    save_to_vid(frames)
else:
    del frames

当然这一切都可以更聪明地完成我想通过创建自己的类Video然后实例化它并将其作为代码中的对象处理。视频也可以有一个方法“writeToFile”。它甚至可以更智能地编写脚本来节省一些空间,或者作为一个实际的缓冲区,如果这正是你需要的。