2

嘿,所以我开始玩 OpenCV,但我无法将我的网络摄像头输出保存到文件中。这就是我所拥有的。这运行良好,启动网络摄像头并创建“output.avi”问题是 output.avi 很小(414 字节),每次运行程序时的字节完全相同。我猜问题出在fourcc编码上,但我无法找到适合我的情况。我在 Mac OS X 上运行。如果您需要更多信息,请告诉我。

import numpy as np
import cv2

path = ('/full/path/Directory/output.avi')

cap = cv2.VideoCapture(0)
cap.set(1, 20.0) #Match fps
cap.set(3,640)   #Match width
cap.set(4,480)   #Match height

fourcc = cv2.cv.CV_FOURCC(*'XVID')
video_writer = cv2.VideoWriter(path,fourcc, 20.0, (640,480))

while(cap.isOpened()):
    #read the frame
    ret, frame = cap.read()
    if ret==True:
        #show the frame
        cv2.imshow('frame',frame)
        #Write the frame
        video_writer.write(frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
video_writer.release()
cv2.destroyAllWindows()
4

3 回答 3

4

只需要改变

fourcc = cv2.cv.CV_FOURCC(*'XVID')

fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v')

在这里找到答案: OSX下的opencv VideoWriter不产生输出

于 2014-10-19T18:01:31.490 回答
1

将您的代码组织到类中并分离清晰的函数,找到几个函数来将您的结果保存在 API OpenCV 中,尝试其他格式并在多个操作系统上运行您的代码。

您还可以使用 OpenCV 转向 C++ 或 Java/C#

我想在 Computer Vison 书中有一章关于您的问题http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Dstripbooks&field-keywords=Cassandra%20NoSQL#/ref=nb_sb_noss_2?url =search-alias%3Dstripbooks&field-keywords=python+computer+vision+open+cv&rh=n%3A283155%2Ck%3Apython+computer+vision+open+cv

这就是我能帮助你的全部

于 2014-10-19T16:59:25.617 回答
1

主要问题是您没有安全地编码:

path = ('/full/path/Directory/output.avi')

cap = cv2.VideoCapture(0)
if not cap:
    print "!!! Failed VideoCapture: invalid parameter!"
    sys.exit(1)

cap.set(1, 20.0) #Match fps
cap.set(3,640)   #Match width
cap.set(4,480)   #Match height

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')

video_writer = cv2.VideoWriter(path, fourcc, 20.0, (640,480))
if not video_writer :
    print "!!! Failed VideoWriter: invalid parameters"
    sys.exit(1)

# ...

因此,当VideoCapture()VideoWriter()失败时,程序立即知道它无法继续。

另外,请注意遗留cv2.cv.CV_FOURCC()调用如何被cv2.VideoWriter_fourcc(). 我这样做是因为此页面显示了有关如何使用 Python 执行此操作的最新示例。您也可以尝试所有 FourCC 代码,直到找到适合您系统的代码。

另一个需要意识到的重要事情是,设置捕获界面的帧大小可能无法正常工作,因为相机可能不支持该分辨率。FPS 也是如此。为什么这是个问题?由于我们需要在VideoWriter构造函数中定义这些设置,因此发送到该对象的所有帧都必须具有精确的尺寸,否则编写器将无法将帧写入文件。

这就是你应该这样做的方式:

path = ('/full/path/Directory/output.avi')

cap = cv2.VideoCapture(0)
if not cap:
    print "!!! Failed VideoCapture: invalid parameter!"
    sys.exit(1)

# The following might fail if the device doesn't support these values
cap.set(1, 20.0) #Match fps
cap.set(3,640)   #Match width
cap.set(4,480)   #Match height

# So it's always safer to retrieve it afterwards
fps = cap.get(CV_CAP_PROP_FPS)
w = cap.get(CV_CAP_PROP_FRAME_WIDTH);
h = cap.get(CV_CAP_PROP_FRAME_HEIGHT);

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')

video_writer = cv2.VideoWriter(path, fourcc, fps, (w, h))
if not video_writer :
    print "!!! Failed VideoWriter: invalid parameters"
    sys.exit(1)

while (cap.isOpened()):
    ret, frame = cap.read()
    if ret == False:
         break

    cv2.imshow('frame',frame)         
    video_writer.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
         break

cap.release()
video_writer.release()
于 2014-10-19T21:00:56.950 回答