【问题标题】:OpenCV - using VideoWriter gives no fileOpenCV - 使用 VideoWriter 没有文件
【发布时间】:2016-05-26 21:52:03
【问题描述】:

我在许多网站(包括堆栈溢出)上搜索了我的问题的解决方案。我正在尝试使用 OpenCV 将我的网络摄像头中的视频保存在我的 Raspberry 中。从理论上讲,我的代码工作正常(我可以在窗口中看到我的网络摄像头,我可以看到 python 打印“框架”),但是当它保存文件时,我什么也看不到。我发现我应该在 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)

【问题讨论】:

  • 找到解决方案了吗/

标签: python opencv raspberry-pi video-capture


【解决方案1】:

您有充分的理由编写 mp4 文件吗?考虑写入带有 avi 扩展名的文件。我也一直在努力解决这个问题,在我强烈需要 MP4 文件的情况下,我最终使用 ffmpeg 进行转换后,通过 openCV 将文件写入为 avi。

我在 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());

当然,你需要在你的 Pi 上安装 ffmpeg 才能做到这一点。

【讨论】:

  • 不,我不需要 mp4。当我尝试使用 *.avi 时,它也没有创建任何文件。
  • 要检查的另一件事是您的框架是否确实是大小 (640,480)。您可以使用 cap.get(CV_CAP_PROP_FRAME_WIDTH)cap.get(CV_CAP_PROP_FRAME_WIDTH) 从 cap 本身获取属性,而不是自己定义。
  • 我已经检查过了。打印 cap.get 高度和宽度给了我尺寸 (640, 480)。
  • 这里也一样。这真是太疯狂了。拉屎。有时会出现输出视频文件,并使用 .write(frame) 正确填充。 “有时”的意思是:曾经发生过一次。通常(现在,并且可能永远)不会创建输出文件。但一切看起来仍然正常工作。 (使用 .write() 循环需要相同的时间,..)。 /Debian Stretch./
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2017-07-27
  • 2014-06-06
相关资源
最近更新 更多