python - OpenCV - 使用 VideoWriter 不提供文件

标签 python opencv raspberry-pi video-capture

我已经在很多站点(包括堆栈溢出)上搜索了我的问题的解决方案。我正在尝试使用 OpenCV 在我的 Raspberry 中保存来 self 的网络摄像头的视频。从理论上讲,我的代码工作正常(我可以在窗口中看到我的网络摄像头,我可以看到 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)

最佳答案

你有很强的理由写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 才能执行此操作。

关于python - OpenCV - 使用 VideoWriter 不提供文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418650/

相关文章:

python - while 循环阻塞异步任务

opencv - fatal error : opencv2/xfeatures2d. hpp:没有这样的文件或目录

python - 如何通过在 HTML 文件上按下按钮来执行系统命令?

c++ - 创建一个程序以在 openWRT 上运行它入门

python - 使用 Raspberry Pi 和 Python 控制连续伺服电机

Python分布式/网络网络应用程序

python - 如何高效删除大文件的第一行?

c++ - 同步启动失败。错误 : 0x2 ;When starting reading from 2 cameras PTGrey

iphone - 更改颜色替换中的亮度

python - 无法保存数据库路径(Python/Windows)