我有用于在静态视频上应用背景减法的工作代码,但它无法正确地将减去背景的帧写入其输出文件。我得到了在cv2.VideoWriter
中指定的.avi文件和文件名,但是似乎并没有写出我通过的每一帧:
import cv2
import numpy as np
cap = cv2.VideoCapture('traffic-mini.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2()
cv2.startWindowThread()
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (640,480))
while True:
ret, frame = cap.read()
if ret == True:
frame = fgbg.apply(frame)
out.write(frame)
cv2.imshow('fg',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
for i in range (1,5):
cv2.waitKey(1)
输出视频test_output.avi
始终为6KB,没有传入帧。我缺少什么?预先感谢
答案 0 :(得分:0)
这是因为frame
的大小不是(640,480)
。代替
out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (640,480))
尝试
out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (int(cap.get(3)), int(cap.get(4))))
答案 1 :(得分:0)
尝试一下:
#Add a 0 to the end of the out after (640, 480)
out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (640,480),0)
while True:
ret, frame = cap.read()
if ret == True:
frame = cv2.resize(frame, (640,480))
frame = fgbg.apply(frame)
out.write(frame)
cv2.imshow('fg',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
之所以要写出黑白帧,需要在末尾加0以便告诉opencv不涉及通道。
您可能需要切换两个数字以调整大小,因为我记得它是框架的宽度或高度,但关键是视频帧的大小应与您的输出和输入都匹配。同样,背景减除的提示是使视频变灰,就像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
答案 2 :(得分:0)
MNM提出的解决方案-在VideoWriter的最后一个参数上添加0-对我而言效果很好-在Raspbian Stretch(Raspberry Pi 3)上使用OpenCV 3.4.5。
尽管官方文档https://docs.opencv.org/3.4.5/dd/d9e/classcv_1_1VideoWriter.html-声明“ isColor如果它不为零,则编码器将期望并编码颜色框架,否则它将与灰度框架一起使用(该标志当前仅在Windows上受支持)。 ”它可能适用于其他操作系统。