Python 2.7 为什么我的OpenCV视频拒绝写入磁盘?

Python 2.7 为什么我的OpenCV视频拒绝写入磁盘?,python-2.7,opencv,codec,Python 2.7,Opencv,Codec,因此,我开始对openCV库将视频写入磁盘的能力感到非常困惑,因为即使是openCV文档也不太清楚在这种情况下视频是如何写入的。我下面的代码似乎可以很好地收集数据,但它试图编写的视频文件中没有数据。我所要做的就是拍摄一个我知道我可以拍摄的视频,将其中的数据更改为0到255之间的渐变,然后将数据写回磁盘。但是,由于我不理解的原因,最后的I/O步骤不配合。有人能帮忙吗?找到下面的代码: import numpy as np import cv2 import cv2.cv as cv cap

因此,我开始对openCV库将视频写入磁盘的能力感到非常困惑,因为即使是openCV文档也不太清楚在这种情况下视频是如何写入的。我下面的代码似乎可以很好地收集数据,但它试图编写的视频文件中没有数据。我所要做的就是拍摄一个我知道我可以拍摄的视频,将其中的数据更改为0到255之间的渐变,然后将数据写回磁盘。但是,由于我不理解的原因,最后的I/O步骤不配合。有人能帮忙吗?找到下面的代码:

import numpy as np
import cv2
import cv2.cv as cv



cap = cv2.VideoCapture("/Users/Steve/Documents/TestVideo.avi")  #The video
height = cap.get(cv.CV_CAP_PROP_FRAME_HEIGHT)  #We get some properties of the video
width = cap.get(cv.CV_CAP_PROP_FRAME_WIDTH)
fps = cap.get(cv.CV_CAP_PROP_FPS)
fourcc = cv2.cv.CV_FOURCC(*'PDVC')  #This is essential for testing

out = cv2.VideoWriter('output.avi',fourcc, int(fps), (int(width),int(height)))

xaxis = np.arange(width,dtype='int')
yaxis = np.arange(height,dtype='int')
xx,yy = np.meshgrid(xaxis,yaxis)

ramp=256*xx/int(width)   #This is a horizontal ramp image that scales from 0-255 across the width of the image


i=0
while(cap.isOpened()):
if i%100==0: print i
i+=1
ret, frame = cap.read()  #Grab a frame
if ret==True:
    # Change the frame data to the ramp instead of the original video                                                                                                                                                                                                                                             
    frame[:,:,0]=ramp   #The camera is B/W so the image is in B/W
    frame[:,:,1]=ramp
    frame[:,:,2]=ramp

    out.write(frame)  #Write to disk?

    cv2.imshow('frame',frame)  # I see the ramp as an imshow
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
else:
    break

cap.release()   #Clear windows
out.release()
cv2.destroyAllWindows()

您的代码通常是正确的,但可能在过程中的某个步骤中失败

尝试添加一些调试行:

out = cv2.VideoWriter('output2.avi',fourcc, int(fps), (int(width),int(height)))

当我在本地测试代码时,我发现我读取的大多数.avi文件的fps都设置为0。手动将其设置为15或30工作

我也没有任何运气让你的fourcc在我的机器(osx)上工作,但这台工作得很好

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

建议:始终检查抓取的帧是否实际有效。是否有什么特别需要做的事情来确认有效性?当我将原始帧放入cv2.imshow函数时,我肯定可以看到视频播放,我们使用这些视频进行各种其他分析,因此我知道它们通常是有效的视频…啊,好吧。您能否提供有关您试图编辑的视频的更多信息?我想这可能是编解码器的问题。请检查一下。似乎其他人也有FourCC和OpenCV的问题。
fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v')