2015-03-03 128 views
0

我想将我的图像上的代码转换为视频。我的程序获取一幅画面,作品出来的平均RGB各9 * 9窗口,并输出图像:没有视频输出OpenCV蟒蛇

输入图像: Input Image

输出图像: Output Image

这里是我的代码具有图像输入/输出:

import numpy as np 
import cv2 

#Read in image 
img = cv2.imread('images/0021.jpg') 

scale = 9 
#Get x and y components of image 
y_len,x_len,_ = img.shape 

mean_values = [] 
for y in range(scale): 
    for x in range(scale): 
     #Crop image 3*3 windows 
     cropped_img=img[(y*y_len)/scale:((y+1)*y_len)/scale, 
          (x*x_len)/scale:((x+1)*x_len)/scale] 

     mean_val=cv2.mean(cropped_img) 
     mean_val=mean_val[:3] 
     cropped_img[:,:,:] = mean_val 

print img.shape  
cv2.imshow('mean_RGB',img) 
cv2.waitKey(0) 

当试图使用上的视频I得到的视频输出相同的代码,但它为空(0字节)。

下面是代码:

import numpy as np 
import cv2 

cap = cv2.VideoCapture('videos/kondo2.avi') 

fourcc = cv2.cv.CV_FOURCC(*'DIVX') 
out = cv2.VideoWriter('videos/output.avi',fourcc, 15.0, (800,600),True) 

while(cap.isOpened()): 
    ret, frame = cap.read() 
    if ret == True: 
     y_len,x_len,_ = frame.shape 
     scale = 9 
     for y in range(scale): 
      for x in range(scale): 
       cropped_frame=frame[(y*y_len)/scale:((y+1)*y_len)/scale, 
             (x*x_len)/scale:((x+1)*x_len)/scale] 

       mean_val=cv2.mean(cropped_frame) 
       mean_val=mean_val[:3] 
       cropped_frame[:,:,:] = mean_val 
       out.write(frame) 

cap.release() 
out.release() 
cv2.destroyAllWindows() 

谢谢您的阅读:)

+0

尝试带有双反斜线(\\)路径名,还以绝对路径名尽量保证是没有问题的。 – GPPK 2015-03-03 09:25:43

+0

@GPPK路径不应该是问题,因为'output.avi'视频被保存到正确的位置,它只是空的没有帧。 – 2015-03-03 09:30:03

+0

够公平的。我总是发现最好从静态路径名开始,以减少错误的可能性。这是问题的时间。 – GPPK 2015-03-03 09:33:45

回答

1

我想你的代码。我必须改变的三件事:

  • 输出视频的编解码器。我改变它为MP4,它的工作原理。
  • 行out.write(frame)的缩进。
  • 调整输入框的大小,以确保它具有合适的尺寸。

这里对我来说是什么工作:

import numpy as np 
import cv2 

cap = cv2.VideoCapture('videos/kondo2.avi') 
w=800 
h=600 

fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v') 
out = cv2.VideoWriter('videos/output.avi',fourcc, 25, (w,h),True) 
count = 0 
while(cap.isOpened()): 
    count = count + 1 
    print "processing frame ", count 
    ret, frame = cap.read() 
    if ret == True: 
     frame = cv2.resize(frame,(w,h), interpolation = cv2.INTER_CUBIC) 
     y_len,x_len,_ = frame.shape 

     scale = 9 
     for y in range(scale): 
      for x in range(scale): 
       cropped_frame=frame[(y*y_len)/scale:((y+1)*y_len)/scale, 
            (x*x_len)/scale:((x+1)*x_len)/scale] 

       mean_val=cv2.mean(cropped_frame) 
       mean_val=mean_val[:3] 
       cropped_frame[:,:,:] = mean_val 

     out.write(frame) 


cap.release() 
out.release() 
cv2.destroyAllWindows() 
+0

这是有效的,我必须做的其他事情是将ffmpeg第三方二进制文件从opencv文件夹复制到我的python目录。在处理完最后一帧后,我得到一个回溯错误,即文件“C:\ Python27 \ video.py”,第16行,在 frame = cv2.resize(frame,(w,h),interpolation = cv2。 INTER_CUBIC) error:.. \ .. \ .. \ .. \ opencv \ modules \ imgproc \ src \ imgwarp.cpp:1968:错误:(-215)ssize.area()> 0在函数cv :: resize '。我想这是因为它试图在不存在的框架上操作?我如何为这种情况制定例外规定? – 2015-03-09 12:53:28

+0

@NeilVicker:如果ret == True,那么将该行移动到范围内,那么你将会很好。看到我编辑的答案。 – 2015-03-09 16:11:15