2017-06-19 17 views
1

コードはtrain1.movファイルを読み取り、cv2.imshow('res', res)output.aviというファイルも保存します。問題は、output.aviは約40kbで空です。しかし、cv2.imshow('res', res)はビデオ全体を表示します。次に、次のエラーを表示します。OpenCVを使用して保存したビデオをPython(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'ですが、前のループを終了する必要があります。だからあなたは '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ブロックをコードに挿入して処理を実行し、そうでない場合はループをwhileループに挿入して、フレームの書き込みを完了することができます。

これはあなたのコードをアップパッチを適用する必要があります

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)'が動いていないのですか? @Alexander Reynolds – sayem48

+0

私はよく分かりません。 Windowsでは、グレースケールを書き込むかどうかのためのオプションのフラグ( 'VideoWriter'コンストラクタ' isColor')(http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_videoowriter-videowriter)がありますまたは色---それが役立つかどうか確かではありません。 'isColor = False'を上部の' VideoWriter'コンストラクタに渡します。また、実際に 'XVID'コーデックがあることを確認してください。 [here](http://answers.opencv.org/question/100967/codecs-list/): "Windowsでは、' VideoWriter'は 'MJPG'または' VFW API'を使用します...利用可能なコーデック'VFW'に準拠することができます" –

関連する問題