2017-10-28 9 views
0

ビデオからフレームを読み込もうとしていますが、フレームを抽出してからビデオが無駄です。だから私はTempFileモジュールを使うことにしました。しかし、私が使用するフレームcv2.VideoCapture(NamedTempFile.name)は常に黒です。私はこれが正しい方法であるかどうか疑問に思います。そうでない場合は、より良い方法がありますか? 以下のコードのビデオキャプチャ部分を添付します。
また、get_temp_video関数が間違っている可能性があります。OpenCVを使ってPythonのNamedTempFileからビデオを読み込むにはどうすればいいですか?


def get_temp_video(url, temp_file): 
    r = requests.get(url, stream=True) 
    for chunk in r.iter_content(chunk_size=1024): 
     if chunk: 
      temp_file.write(chunk) 
    return temp_file 


def get_frame(video_url): 
    named_temp_file = NamedTemporaryFile() 
    named_temp_file = get_temp_video(video_url, named_temp_file) 
    named_temp_file.seek(0) 
    video = cv2.VideoCapture(named_temp_file.name) 
    while video.isOpened(): 
     ret, frame = video.read() 
     if ret: 
      temp_file = TemporaryFile() 
      np.save(temp_file, frame) 
      temp_file.seek(0) 
      upload_to_some_where(temp_file.read()) 
      temp_file.close() 
     else: 
      break 
    video.release() 
    named_temp_file.close() 

答えて

0

私はこの問題を推測していたコードの残りの部分は私のために正常に動作しますので、あなたの関数upload_to_some_whereです。テスト目的のために私はあなたのコードを少し変更しました:

def get_temp_video(url, temp_file): 
    r = requests.get(url, stream=True) 
    for chunk in r.iter_content(chunk_size=1024): 
     if chunk: 
      temp_file.write(chunk) 
    return temp_file 


def get_frame(video_url): 
    named_temp_file = NamedTemporaryFile() 
    named_temp_file = get_temp_video(video_url, named_temp_file) 
    named_temp_file.seek(0) 
    video = cv2.VideoCapture(named_temp_file.name) 
    while video.isOpened(): 
     ret, frame = video.read() 
     if ret: 
      # For testing purpose 
      cv2.imshow("frame", frame) 
      if cv2.waitKey(25) == ord('q'): 
      break 
      ############################## 
      # temp_file = TemporaryFile() 
      # np.save(temp_file, frame) 
      # temp_file.seek(0) 
      # upload_to_some_where(temp_file.read()) 
      # temp_file.close() 
     else: 
      break 
    video.release() 
    named_temp_file.close() 

if __name__=='__main__': 

    get_frame('http://samples.mplayerhq.hu/MPEG-4/MPEG4%20by%20philips.mp4') 
+0

あなたの答えをありがとう。私はどこにエラーがあるかを見つける。ちょうどあなたの答えのようにいくつかのロジックupload_to_some_where関数が間違っている、 –

関連する問題