使用openCV在Python中保存视频捕获:空视频

7
我是Python(2.7)的新手,尝试使用视频处理(使用模块openCv“cv2”)。从教程开始,我尝试使用这个教程的脚本:第"Saving a video"段落。除了我保存的视频为空之外,一切都正常。在我的目录中可以找到output.avi,但其记忆体大小为0KB,当我运行它时,当然没有视频显示。
经过一些更改,这是我的代码:
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
#fourcc = cv2.VideoWriter_fourcc(*'DIVX')
fourcc = cv2.cv.CV_FOURCC(*'DIVX')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:

        # write the flipped frame
        out.write(frame)

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

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

有人知道为什么它不能正常工作吗?
非常感谢。 Edwin
3个回答

4
我从未使用过openCV,但是我认为问题可能出在此处
cap = cv2.VideoCapture(0)

这是一个C版本的VideoCapture方法。 http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture 也许你可以尝试做类似的事情。就像这样:
cap = cv2.VideoCapture(0)
if (not cap.isOpened()):
    print "Error"

编辑:刚刚下载了Python和OpenCV,发现问题是编解码器。尝试更改

out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

对于

out = cv2.VideoWriter('output.avi', -1, 20.0, (640,480))

手动选择编解码器。


给Sauruxum:嗨,谢谢你的回答。我尝试了这个,Cap.isOpened()实际上返回True。我甚至可以在实时中看到捕获,所以它确实进入了while循环。不过还是谢谢你,那可能是问题所在。 - probaPerception
抱歉,我有点傻,没有看到您确实使用了那种方法。但是,如果您通过了该方法(可以看到相机反馈),并且仍然没有得到视频文件,则循环中的某些内容可能无法正常工作。这不像您会得到一个带有X帧的背景视频;帧没有保存在文件中,因此您得到的是0kB文件。或者可能是编解码器的问题? - user3371637
给Sauruxum:你说得对。循环中有些问题。它确实进入了循环,但没有保存。我对编解码器一无所知。它是什么?可能出了什么问题?干杯。 - probaPerception
我刚刚下载了openCV和Python。我知道的是编码。尝试将out = cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))替换为out = cv2.VideoWriter('output.avi',-1,20.0,(640,480)),然后手动选择您拥有的编解码器。我编辑了答案。 - user3371637
1
它运行了!太棒了。感谢您下载Python + OpenCV。谢谢。 - probaPerception

0

我使用的是Windows 10操作系统,Python版本为3.7.6,OpenCV版本为4.2.0。在我的情况下,问题出现在视频编码器上。无论是使用"XVID"还是"X264"编码器,输出的视频都是空的。但是当我将编码器改为"DIVX"时,视频成功生成。


0

可能是输出分辨率与输入不同。请检查捕获的宽度和高度。

size = (int(cap.get(3)), int(cap.get(4)))

更改相机或输出分辨率。


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