OpenCV - 使用VideoWriter没有生成文件

3
我在许多网站上(包括stack overflow)搜索了解决我的问题的方案。我正在尝试使用OpenCV从我的树莓派上的网络摄像头保存视频。从理论上讲,我的代码运行正常(我可以在窗口中看到我的网络摄像头,我可以看到python打印“frame”),但当它转到保存文件时,我看不到任何东西。我发现我应该更改FourCC中的编解码器,但它没有改变任何东西。
我的代码:
#!/usr/bin/python

import cv2
import numpy as np

def InitCamera():

    cap = cv2.VideoCapture(0)
    if cap is None:
        print('No camera access')
    else:
        print('Camera init done')
    return cap

def InitWriter():
    fps = 20
    size = (640,480)
    outFile = 'output.mp4'

    #fourcc = cv2.cv.CV_FOURCC('D','I','V','X')
    #fourcc = cv2.cv.CV_FOURCC('R','G','B',' ')
    #fourcc = cv2.cv.CV_FOURCC('Y','U','Y','2')
    #fourcc = cv2.cv.CV_FOURCC('Y','U','Y','U')
    #fourcc = cv2.cv.CV_FOURCC('U','Y','V','Y')
    #fourcc = cv2.cv.CV_FOURCC('I','4','2','0')
    #fourcc = cv2.cv.CV_FOURCC('I','Y','U','V')
    #fourcc = cv2.cv.CV_FOURCC('Y','U','1','2')
    #fourcc = cv2.cv.CV_FOURCC('Y','8','0','0')
    #fourcc = cv2.cv.CV_FOURCC('G','R','E','Y')
    #fourcc = cv2.cv.CV_FOURCC('B','Y','8',' ')
    #fourcc = cv2.cv.CV_FOURCC('Y','1','6',' ')
    #fourcc = cv2.cv.CV_FOURCC('X','V','I','D')
    #fourcc = cv2.cv.CV_FOURCC('M','J','P','G')
    fourcc = cv2.cv.CV_FOURCC('M','P','E','G')

    out = cv2.VideoWriter(outFile, fourcc, fps, size, 1)
    if out is None:
        print('No video access')
    else:
        print('Video init done')
    return out

def CapVideo(cap,out):
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret==True:
            out.write(frame)
            print('frame')
            cv2.imshow('frame',frame)
            if cv2.waitKey(1) & 0xFF==ord('q'):
                break

        else:
            break
    print 'Done'

    cap.release()
    out.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    cam = InitCamera()
    out = InitWriter()
    CapVideo(cam,out)

你找到解决方法了吗? - GKS
1个回答

0

你是否有写MP4文件的充分理由?考虑使用AVI扩展名来写入文件。我也曾经在这个问题上苦苦挣扎,但是在我迫切需要一个MP4文件的情况下,最终使用了ffmpeg将OpenCV生成的AVI文件转换为MP4。

我当时是用C++进行开发,直接进行了系统调用。代码类似于:

std::string ffmpeg_conversion_cmd = "ffmpeg -y -i data\\intermediate_result.avi -c:v libx264 -crf 19 -preset slow -c:a libfaac -b:a 192k -ac 2 data\\intermediate_result.mp4";
std::system(ffmpeg_conversion_cmd.c_str());

当然,您需要在树莓派上安装ffmpeg才能执行此操作。


不,我不需要MP4。当我尝试使用*.avi时,它也没有创建任何文件。 - Dawid Po
还有一件需要检查的事情是你的帧是否确实是大小为(640,480)。你可以通过使用cap.get(CV_CAP_PROP_FRAME_WIDTH)cap.get(CV_CAP_PROP_FRAME_WIDTH)从cap本身获取属性,而不是自己定义它。 - TheBlueNotebook
我已经检查过了。打印cap.get高度和宽度给出了尺寸(640,480)。 - Dawid Po
同样的问题。这真的很疯狂。该死。有时输出视频文件会出现,并且使用.write(frame)它会被正确填充。 “有时”意味着:它曾经发生过一次。通常(现在和将来)输出文件不会被创建。但是一切看起来仍然是正确的(.write()循环需要相同的时间,...)。/Debian Stretch./ - mirek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接