调用摄像头录制并保存视频

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 30.0, (640,480))

while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,1)
out.write(frame) # 保存视频
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

cap.release()
out.release()
cv2.destroyAllWindows()

重点

  • ​out.write()​​​的image类型只支持​​numpy.unit8​​​,如果使用其他类型如​​int8​​​会报错。如果之前是其他类型,可以通过​​img.astype(np.uint8)​​实现类别转换。
  • 具体原因则是因为:​​uint8​​​类型是指​​0-255​​​的数值,这是opencv一般image的存储格式,而​​int8​​​是指​​-127-127​​的数值,而image中的像素值不为负。

opencv-python——调用摄像头录制并保存视频_解决方法

BUG解决

如果出现生成的output.avi最终大小为0KB或者是无法打开时,可能问题有两个:

问题1:尺寸不对

解决方法:

检查保存的图像的尺寸,将​​cv2.VideoWriter('output.avi',fourcc, 30.0, (640,480))​​​中的尺寸改为和摄像头尺寸相同,这里直接从摄像头处获取尺寸信息,同时将编码格式改为​​MJPG​​。

w = int(cap.get(3))  # 获取视频的width
h = int(cap.get(4)) # 获取视频的height
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, 15.0, (w, h))

问题2:​​out.realse()​​未执行

解决方法:

无论采用什么停止方法,​​out.realse()​​务必要执行,否则会影响视频的正常生成。