首先明确这个问题很常见,最终生成的视频一般10KB以内,双击打卡就会报格式错误,解析错误等,其实就以下这几个点,不注意就会造成格式不正确。
- 解码格式与保存的文件格式要相匹配
在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生
成大尺寸的视频。X264会生成非常小的尺寸的视频)
在Windows中:DIVX(尚待测试和添加)
在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)
DIVX, MJPG,不知道具体用什么解码,就都试一试
fourcc = cv2.VideoWriter_fourcc(*'XVID')
- 输出视频的窗口大小,要和图片大小相匹配
比如说我的图片是240*210的,我设置的输出视频窗口大小为210*240
窗口大小要进行宽高反写,不能用行列数的形式来表示
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (210,240))
- 如果灰度图片要特殊处理,加入参数0或false
cv.VideoWriter()函数默认保存为RGB格式的彩色视频,要保存为灰度视频应在最后添加False或0
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (210,240))
- 如果想要保存MP4格式的视频,就写成output.mp4v,写成.mp4也可以不影响播放,就是会保错
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.mp4v', fourcc, 20.0, (210,240),0)
demo:保存灰度图像的视频
""" 从视频读取帧保存为图片"""
import cv2
import numpy as np
# cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件
cap = cv2.VideoCapture(0)#读取摄像头
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.mp4v', fourcc, 20.0, (210,240),0)
while(True):
ret, frame = cap.read()
#下面三行可以根据自己的电脑进行调节
src = cv2.resize(frame,(width,height), interpolation=cv2.INTER_CUBIC)#窗口大小
cv2.rectangle(src, (90, 60), (300, 300 ), (0, 255, 0))#框出截取位置
roi = src[60:300 , 90:300] # 获取手势框图
print(roi.shape)
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)#转化为灰度图片
out.write(gray)
cv2.imshow("2",gray)
key = cv2.waitKey(50) & 0xFF
if key == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()