【问题标题】:How to store webcam video with OpenCV in Python如何在 Python 中使用 OpenCV 存储网络摄像头视频
【发布时间】:2017-09-12 21:25:33
【问题描述】:

我有一个 Python 脚本,它可以读取我的网络摄像头并将其显示在一个窗口中。我现在想存储结果,所以按照this tutorial我写了以下代码:

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

有人知道这里有什么问题吗?欢迎所有提示!

【问题讨论】:

    标签: python macos opencv video filesystems


    【解决方案1】:

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

    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.resize。当cv2 已经可以做到这一点时,就不需要使用另一个库了。

    【讨论】:

    • 最后一个提示是使用cv2.resize() 而不是imutils.resize() 解决了我所有的问题。我现在可以使用任何编解码器编写视频。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多