Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用OpenCV存储网络摄像头视频_Python_Macos_Opencv_Video_Filesystems - Fatal编程技术网

如何在Python中使用OpenCV存储网络摄像头视频

如何在Python中使用OpenCV存储网络摄像头视频,python,macos,opencv,video,filesystems,Python,Macos,Opencv,Video,Filesystems,我有一个Python脚本,它读取我的网络摄像头并在窗口中显示。现在我想存储结果,因此我编写了以下代码: import cv2 import imutils camera = cv2.VideoCapture(0) # Define the codec and create VideoWriter object to save the video fourcc = cv2.VideoWriter_fourcc(*'XVID') video_writer = cv2.VideoWriter('ou

我有一个Python脚本,它读取我的网络摄像头并在窗口中显示。现在我想存储结果,因此我编写了以下代码:

import cv2
import imutils
camera = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object to save the video
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video_writer = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

while True:
    try:
        (grabbed, frame) = camera.read()  # grab the current frame
        frame = imutils.resize(frame, width=640, height=480)
        cv2.imshow("Frame", frame)  # show the frame to our screen
        key = cv2.waitKey(1) & 0xFF  # I don't really have an idea what this does, but it works..
        video_writer.write(frame)  # Write the video to the file system
    except KeyboardInterrupt:
        break

# cleanup the camera and close any open windows
camera.release()
video_writer.release()
cv2.destroyAllWindows()
print "\n\nBye bye\n"
这在一个新窗口中完美地显示了我的网络摄像头的实时视频片段。但编写视频文件似乎失败了。它确实创建了一个名为
output.avi
的文件,但该文件是空的(零字节),在命令行上我看到以下错误:

OpenCV: Frame size does not match video size.
OpenCV: Frame size does not match video size.
OpenCV: Frame size does not match video size.
etc.
我很清楚地将帧调整为我想要保存视频的大小(640x480),所以我不确定为什么它不匹配

当我再次运行脚本时(在本例中,空的
output.avi
已经存在),它会显示以下错误:

2017-04-17 10:57:14.147 Python[86358:5848730] AVF: AVAssetWriter status: Cannot Save
2017-04-17 10:57:14.332 Python[86358:5848730] mMovieWriter.status: 3. Error: Cannot Save
2017-04-17 10:57:14.366 Python[86358:5848730] mMovieWriter.status: 3. Error: Cannot Save
2017-04-17 10:57:14.394 Python[86358:5848730] mMovieWriter.status: 3. Error: Cannot Save
etc.
在本教程中,四位数的FourCC代码用于指定视频编解码器,该编解码器依赖于平台,可用代码列表可在FourCC.org中找到。我在OSX上,所以我尝试了一系列不同的编解码器代码:DIVX、XVID、MJPG、X264、WMV1、WMV2。但不幸的是,它们都不适合我。它们都给出了相同的错误,除了
MJPG
,它给出了以下错误:

OpenCV Error: Assertion failed (img.cols == width && img.rows == height && channels == 3) in write, file /tmp/opencv3-20170216-77040-y1hrk1/opencv-3.2.0/modules/videoio/src/cap_mjpeg_encoder.cpp, line 829
Traceback (most recent call last):
  File "store_video.py", line 15, in <module>
    video_writer.write(frame)  # Write the video to the file system
cv2.error: /tmp/opencv3-20170216-77040-y1hrk1/opencv-3.2.0/modules/videoio/src/cap_mjpeg_encoder.cpp:829: error: (-215) img.cols == width && img.rows == height && channels == 3 in function write
OpenCV错误:在写入文件/tmp/opencv3-20170216-77040-y1hrk1/OpenCV-3.2.0/modules/videoio/src/cap_mjpeg_encoder.cpp第829行时,断言失败(img.cols==width&&img.rows==height&&channels==3)
回溯(最近一次呼叫最后一次):
文件“store_video.py”,第15行,在
视频_writer.write(frame)#将视频写入文件系统
cv2.error:/tmp/opencv3-20170216-77040-y1hrk1/opencv-3.2.0/modules/videoio/src/cap_mjpeg_编码器。cpp:829:error:(-215)img.cols==宽度和img.rows==高度和通道==函数写入中的3

有人知道这里可能出了什么问题吗?欢迎所有提示

这可能是因为您使用AVFoundation构建了OpenCV,而它不支持XVID或其他编解码器。您可以尝试
mp4v
m4v
扩展

import cv2
camera = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object to save the video
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
video_writer = cv2.VideoWriter('output.m4v', fourcc, 30.0, (640, 480))

while True:
        (grabbed, frame) = camera.read()  # grab the current frame
        frame = cv2.resize(frame, (640,480))
        cv2.imshow("Frame", frame)  # show the frame to our screen
        key = cv2.waitKey(33) & 0xFF  # I don't really have an idea what this does, but it works..
        video_writer.write(frame)  # Write the video to the file system
        if key==27:
            break;

# cleanup the camera and close any open windows
camera.release()
video_writer.release()
cv2.destroyAllWindows()
print("\n\nBye bye\n")
另一方面,错误

OpenCV Error: Assertion failed (img.cols == width && img.rows == height && channels == 3) in write, file /tmp/opencv3-20170216-77040-y1hrk1/opencv-3.2.0/modules/videoio/src/cap_mjpeg_encoder.cpp, line 829
意味着你把尺寸弄乱了

frame = imutils.resize(frame, width=640, height=480)

您可以尝试
cv2。按照我在代码中使用的方法调整大小。当
cv2
已经可以使用另一个库时,就不需要使用它了。

给出了使用
cv2.resize()
而不是
imutils.resize()
的最后一个技巧,修复了我的所有问题。我现在可以使用任何编解码器编写视频。谢谢