我最近开始使用opencv-python进行编程,但是当我尝试使用cv2编写视频时,我遇到了困难。 脚本的输出为空。这是我的代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'h263')
out = cv2.VideoWriter('cv2_camera_output.mp4',fourcc, 20.0, (800,600))
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
cv2.imshow('gray', gray)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
我猜测问题必须与fourcc编解码器有关。所以我用谷歌搜索了如果有一个用于mac的4CC编解码器(我正在使用OS X 10.12.3(Sierra)),但是所有的建议都不适用于我的电脑,所以这个问题甚至可能都没有在fourCC编解码器中。这些是我访问过的链接:
OpenCV Documentation (I didn't follow this one, it was just to make sure, and it didn't work either)
GitHub Tests for FourCC codecs on OS X
有人知道真正的问题吗?任何帮助都会很棒
答案 0 :(得分:2)
您的框架宽度和高度必须与VideoWriter
的宽度和高度相同。只需在out.write(frame)
之前添加此内容,您就可以了:
frame = cv2.resize(frame,(800,600))
或者将VideoWriter
的大小更改为网络摄像头帧的初始大小。我的是(640,480)。我想如果你的操作系统不支持这种格式,它就不会写任何东西。甚至不会创建空文件。我在Linux上,我认为'h263'不起作用,但'h264'确实如此。当我使用'h263'时,它不会生成任何文件。
答案 1 :(得分:0)
最大的问题是h263指定了它可以编码的确切帧大小(请查看https://en.wikipedia.org/wiki/H.263#Version_1_and_Annex_I处的可能值)并且您不遵守该大小。
解决了这个问题之后,h263可能无法在OSX上使用mp4容器(在Linux和Windows上它不会因为它们使用FFMPEG作为后端而OSX使用另一个库)所以我建议你使用avi作为容器。
最后,您必须调整图像大小(就像@ROAR所说)或使用输入设备的尺寸,如下所示:
width = int(cap.get(3))
height = int(cap.get(4))
虽然如果使用h263编解码器执行后者,则必须使用能够生成符合大小限制的帧的输入设备。
答案 2 :(得分:0)
我解决了这个问题。问题只是因为我不能将VideoWriter用于灰度,所以我不得不将它用于彩色框架。