2017-06-19 54 views
1

代碼讀取train1.mov文件,顯示cv2.imshow('res', res)也保存名爲output.avi的文件。問題是,output.avi大約40 kb並且是空的。但cv2.imshow('res', res)顯示整個視頻。然後顯示以下錯誤。無法在Python中使用OpenCV打開保存的視頻(Windows 10)

Python代碼:

import numpy as np 
import cv2 

cap = cv2.VideoCapture('C:\\Users\\khan1\\Desktop\\python project\\color_threshold\\train1.mov') 

fourcc = cv2.VideoWriter_fourcc(*'XVID') 
out = cv2.VideoWriter('C:\\Users\\khan1\\Desktop\\python project\\color_threshold\\output.avi',fourcc, 20.0, (640,480)) 

while(cap.isOpened()): 
    _, frame = cap.read() 

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
    lower_green = np.array([40, 60, 60]) 
    upper_green = np.array([80, 255, 255]) 

    mask = cv2.inRange(hsv, lower_green, upper_green) 
    mask = cv2.GaussianBlur(mask, (7, 7), 0) 
    res = cv2.bitwise_and(frame, frame, mask=mask) 

    out.write(res) 

    cv2.namedWindow("res", cv2.WINDOW_NORMAL) 
    cv2.imshow('res', res) 
    if (cv2.waitKey(1) & 0xFF) == ord('q'): # Hit `q` to exit 
     break 

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

錯誤:

OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::cvtColor, file C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp, line 9815 
Traceback (most recent call last): 
    File "C:/Users/khan1/Desktop/python project/color_threshold/savevid.py", line 19, in <module> 
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
cv2.error: C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp:9815: error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cv::cvtColor 


Process finished with exit code 1 

我怎樣才能解決呢?

+0

那麼錯誤發生在視頻編輯器關閉之前,所以這就是爲什麼沒有寫入電影。這可能是在視頻的最後一幀發生的。如果沒有幀,'cap.read()'函數返回(到你的被忽略的變量'_')'True'或'False',它可能試圖轉換那個空幀。即'cap.isOpened()'是最後一幀的'True',但你需要先退出循環。所以你需要一個'if retval: else:quit'。查看最後一個例子[here](http://docs.opencv.org/3.1.0/dd/d43/tutorial_py_video_display.html)。 –

回答

1

很明顯,你的錯誤發生在最後一幀;這就是爲什麼你的imshow仍然工作的原因,但它錯誤了,並沒有完成寫在while循環後發生的視頻。

cap.read()返回的第一個值是關於幀是否存在/被讀取的布爾值。所以你可以簡單地在代碼中插入一個if-else塊,以在幀被讀取時執行處理,如果沒有,則循環爲,這樣就可以完成寫入幀。

這應該修補代碼:

import numpy as np 
import cv2 

cap = cv2.VideoCapture('C:\\Users\\khan1\\Desktop\\python project\\color_threshold\\train1.mov') 

fourcc = cv2.VideoWriter_fourcc(*'XVID') 
out = cv2.VideoWriter('C:\\Users\\khan1\\Desktop\\python project\\color_threshold\\output.avi',fourcc, 20.0, (640,480)) 

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

     hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
     lower_green = np.array([40, 60, 60]) 
     upper_green = np.array([80, 255, 255]) 

     mask = cv2.inRange(hsv, lower_green, upper_green) 
     mask = cv2.GaussianBlur(mask, (7, 7), 0) 
     res = cv2.bitwise_and(frame, frame, mask=mask) 

     out.write(res) 

     cv2.namedWindow("res", cv2.WINDOW_NORMAL) 
     cv2.imshow('res', res) 
     if (cv2.waitKey(1) & 0xFF) == ord('q'): # Hit `q` to exit 
      break 
    else: 
     break 

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

看到這個同樣的過程here的例子。

+0

解決了錯誤部分。謝謝。現在沒有錯誤信息。但'output.avi'仍然是一個空白的8kb文件。爲什麼'out.write(res)'不起作用? @亞歷山大雷諾茲 – sayem48

+0

我不確定。在Windows上,有一個[VideoWriter'構造函數'isColor']的可選標誌(http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter),它是否寫入灰度或顏色---不知道這是否有幫助。將'isColor = False'傳遞到頂部的'VideoWriter'構造函數中。還要確保你實際上有'XVID'編解碼器。從[這裏](http://answers.opencv.org/question/100967/codecs-list/):「在Windows上,'VideoWriter'使用'MJPG'或'VFW API'因此...任何可用的編解碼器「符合VFW」可以使用「 –

相關問題