Python cv2 VideoWriter 文件损坏

3

我在跟着这个教程学习,尝试将视频保存为avi格式,但每次尝试都会出现损坏的文件。我通过使用cv2.imwrite()方法逐帧保存可以单独完成,但拼接各个帧非常耗时,并会影响整个程序的性能。下面是我的代码:

from imutils.video import VideoStream
import imutils
import time
import cv2

MINIMUM_AREA = 500

# For Video Recording Purposes
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('vibralert_test001.avi', fourcc, 20, (640, 480))

vs = VideoStream(src=0).start()

print("Setting up feed.")
time.sleep(2)
print("Live")

firstFrame = None

while True:
    frame = vs.read()
    text = "No Movement Detected"

    frame = imutils.resize(frame, width=500)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)

    if firstFrame is None:
        firstFrame = gray
        continue

    delta = cv2.absdiff(firstFrame, gray)
    thresh = cv2.threshold(delta, 25, 255, cv2.THRESH_BINARY)[1]

    thresh = cv2.dilate(thresh, None, iterations=2)
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
                            cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)

    for c in cnts:
        if cv2.contourArea(c) < MINIMUM_AREA:
            continue

        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        text = "Movement Detected"

    cv2.putText(frame, "Room Status: {}".format(text), (10, 20),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    cv2.imshow("VibrAlert v0.1", frame)
    out.write(frame)

    key = cv2.waitKey(1) & 0xFF

    if key == 27:
        break

vs.stop()
out.release()
cv2.destroyAllWindows()

print('End Feed')

尝试这个最简单的示例(附带视频文件以排除视频流错误):https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html#saving-a-video - J.D.
1个回答

4
< p >帧图像的大小需要与给定给VideoWriterframeSize相同,即(640,480)。虽然frame被调整大小为宽度500,但videoWriter期望宽度为640。

然而,将调整大小更改为frame = imutils.resize(frame, width=640)也可能行不通。imutils.resize将返回具有与原始图像相同纵横比的图像,因此高度不一定是480。我建议用opencv.resize替换那一行:

frame = cv2.resize(frame, (640,480))

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