嘿所以我开始玩OpenCV并且我无法将我的网络摄像头输出保存到文件中。这就是我所拥有的。运行正常,启动网络摄像头并创建" output.avi"问题是output.avi很小(414字节),每次运行程序时都是相同的字节。 我猜测问题是使用fourcc编码,但我还没能找到适用于我的情况。我在Mac OS X上运行。如果您需要更多信息,请告诉我。
import numpy as np
import cv2
path = ('/full/path/Directory/output.avi')
cap = cv2.VideoCapture(0)
cap.set(1, 20.0) #Match fps
cap.set(3,640) #Match width
cap.set(4,480) #Match height
fourcc = cv2.cv.CV_FOURCC(*'XVID')
video_writer = cv2.VideoWriter(path,fourcc, 20.0, (640,480))
while(cap.isOpened()):
#read the frame
ret, frame = cap.read()
if ret==True:
#show the frame
cv2.imshow('frame',frame)
#Write the frame
video_writer.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
video_writer.release()
cv2.destroyAllWindows()
答案 0 :(得分:4)
只需要改变
fourcc = cv2.cv.CV_FOURCC(*'XVID')
到
fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v')
答案 1 :(得分:1)
将您的代码整理到类中并分离清晰的函数,找到几个用于在API OpenCV中保存结果的函数,尝试其他格式并在多个操作系统上运行代码。
您也可以使用OpenCV
转向C ++或Java / C# 中有一章关于您的问题这就是我能帮助你的全部
答案 2 :(得分:1)
主要问题是您没有安全编码:
path = ('/full/path/Directory/output.avi')
cap = cv2.VideoCapture(0)
if not cap:
print "!!! Failed VideoCapture: invalid parameter!"
sys.exit(1)
cap.set(1, 20.0) #Match fps
cap.set(3,640) #Match width
cap.set(4,480) #Match height
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter(path, fourcc, 20.0, (640,480))
if not video_writer :
print "!!! Failed VideoWriter: invalid parameters"
sys.exit(1)
# ...
因此,当VideoCapture()
或VideoWriter()
失败时,程序会立即知道它无法继续。
另外,请注意遗留cv2.cv.CV_FOURCC()
调用如何被cv2.VideoWriter_fourcc()
替换。我这样做是因为this page显示了如何使用Python完成这些工作的最新示例。您也可以尝试all the FourCC codes,直到找到适用于您系统的版本。
要实现的另一个重要事项是,设置捕获界面的帧大小可能无法正常工作,因为相机可能不支持该分辨率。对于FPS也是如此。 为什么这是一个问题?由于我们需要在VideoWriter
构造函数中定义这些设置,因此发送到此对象的所有框架必须具有该确切尺寸,否则writer将无法将帧写入文件。
这就是你应该如何做到这一点:
path = ('/full/path/Directory/output.avi')
cap = cv2.VideoCapture(0)
if not cap:
print "!!! Failed VideoCapture: invalid parameter!"
sys.exit(1)
# The following might fail if the device doesn't support these values
cap.set(1, 20.0) #Match fps
cap.set(3,640) #Match width
cap.set(4,480) #Match height
# So it's always safer to retrieve it afterwards
fps = cap.get(CV_CAP_PROP_FPS)
w = cap.get(CV_CAP_PROP_FRAME_WIDTH);
h = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter(path, fourcc, fps, (w, h))
if not video_writer :
print "!!! Failed VideoWriter: invalid parameters"
sys.exit(1)
while (cap.isOpened()):
ret, frame = cap.read()
if ret == False:
break
cv2.imshow('frame',frame)
video_writer.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
video_writer.release()