所以我开始对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()
答案 0 :(得分:0)
您的代码通常是正确的,但在此过程中可能会默默地失败。
尝试添加一些调试行:
out = cv2.VideoWriter('output2.avi',fourcc, int(fps), (int(width),int(height)))
或
else:
print "frame %d is false" % i
break
当我在本地测试你的代码时,我发现对于我读过的大多数.avi文件,fps设置为0。手动将其设置为15或30工作。
我也没有运气让你的四分之一在我的机器上工作(osx),但这个工作正常。
fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v')