2017-09-27 6 views
0

私は初心者ですが、pythonでもopencvでもあります。私はopencvのビデオキャプチャ機能で一定の間隔のビデオを撮りたいと思っています.10秒と言うと、システムはある時間スリープモードに移行します.6秒間、10秒間のビデオが撮影されます。ビデオは別ファイルに保存してください。私の問題は、私は最初のビデオを保存する最初の機能を呼び出すときに、ビデオ2機能の呼び出しでコードの悪い配置のためにvideo.sorryを保存しないということです。私はそう新しいユーザーです。いくつかの時間間隔の後にopencvでビデオを撮る

import cv2 
import time 
def delay(delay_time): 
    timeout = delay_time # [seconds] 

    timeout_start = time.time() 

    print(time.strftime("%c")) 
    while time.time() < timeout_start + timeout: 
      test = 0 
      if test == 3: 

      break 
      test -= 1 
    print(time.strftime("%c")) 

def video1(): 



    cap = cv2.VideoCapture(0) 


    if (cap.isOpened() == False): 
    print("Unable to read camera feed") 

    frame_width = int(cap.get(3)) 
    frame_height = int(cap.get(4)) 

    out = cv2.VideoWriter('Data/output1.avi', 
    cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height)) 

    while time.time() < time_start + closing_time: 
     ret, frame = cap.read() 

     if ret == True: 
     out.write(frame) 

      cv2.imshow('frame', frame) 

      if cv2.waitKey(1) & 0xFF == ord('q'): 
       break 

      else: 
       break 

    cap.release() 
    out.release() 

def video2(): 


    cap = cv2.VideoCapture(0) 

    if (cap.isOpened() == False): 
    print("Unable to read camera feed") 

    frame_width = int(cap.get(3)) 
    frame_height = int(cap.get(4)) 

    out = cv2.VideoWriter('Data/output2.avi', 
    cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height)) 

    while time.time() < time_start + closing_time: 
     ret, frame = cap.read() 

     if ret == True: 

      out.write(frame) 

      cv2.imshow('frame', frame) 

      if cv2.waitKey(1) & 0xFF == ord('q'): 
       break 

      else: 
       break 

    cap.release() 
    out.release() 

    cv2.destroyAllWindows() 


    cv2.destroyAllWindows() 
    print(time.strftime("%c")) 
    video1() 
    delay(6) 
    print(time.strftime("%c")) 
    video2() 
+1

多くの分析なしで:一定の出力ファイルがあります。もちろん、複数の出力ファイルは表示されません。ループでは異なるファイル名を使用する必要があります(おそらくリファクタリングでファイルハンドラを作成する場所)。ビデオが正常に開きますが、2番目のファイルは最初のビデオが正常に開いたフォルダ内に表示されますが、オープニングで言いますが、すべてのコメントを削除するようにコードを変更してくださいストリーム – sascha

+0

最初のビデオファイルと2番目のビデオファイルの保存の違い。また、両方の関数video1、video2はビデオを保存するのと同じアクションを実行しますか? –

+0

を分離することはできませんし、我々があるかどうかを確認することができますvideos.first私は2を保存するための2つの機能を持っている –

答えて

0

あなたのコード非常に多くのインデントの問題を抱えていること私ができますこれは問題であると言います。そこで私はここにあなたのコードを並べ替えました。また、コードにtime_startまたはclosing_timeを定義していない場合もあります。しかし、私はあなたの本当のコードはそれらを持っていると仮定している問題は、右の出力されていない2番目のビデオです。これは、video1video2の冒頭にtime_startを定義する必要があるからです。 time_startを再定義しないと、video2に到達するまでには、このwhile time.time() < time_start + closing_time:はすでに使い果たされており、Falseになります。実際のビデオはファイルに書き込まれません。

import cv2 
import time 
def delay(delay_time): 
    timeout = delay_time # [seconds] 
    timeout_start = time.time() 
    print(time.strftime("%c")) 
    while time.time() < timeout_start + timeout: 
     test = 0 
     if test == 3: 
      break 
      test -= 1 
    print(time.strftime("%c")) 

def video1(): 
    time_start = time.time() 
    cap = cv2.VideoCapture(0) 
    if (cap.isOpened() == False): 
     print("Unable to read camera feed") 
    frame_width = int(cap.get(3)) 
    frame_height = int(cap.get(4)) 
    print(frame_width,frame_height) 
    out = cv2.VideoWriter('output1.avi', 
     cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height)) 

    while time.time() < time_start + closing_time: 
     ret, frame = cap.read() 
     if ret == True: 
      out.write(frame) 
      #cv2.imshow('frame', frame) 
      if cv2.waitKey(1) & 0xFF == ord('q'): 
       break 
     else: 
      break 

    cap.release() 
    out.release() 

def video2(): 
    time_start = time.time() 
    cap = cv2.VideoCapture(0) 
    if (cap.isOpened() == False): 
     print("Unable to read camera feed") 
    frame_width = int(cap.get(3)) 
    frame_height = int(cap.get(4)) 
    print(frame_width,frame_height) 
    out = cv2.VideoWriter('output2.avi', 
    cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height)) 
    while time.time() < time_start + closing_time: 
     ret, frame = cap.read() 
     if ret == True: 
      out.write(frame) 
      if cv2.waitKey(1) & 0xFF == ord('q'): 
       break 
     else: 
      break 
    cap.release() 
    out.release() 

print(time.strftime("%c")) 
closing_time = 10 
video1() 
delay(6) 
print(time.strftime("%c")) 
video2() 
# this loop is here because sometimes cv2 has problems destroying windows 
# if you call it once. so to be safe I call it 10 times 
for _ in range(10): 
    cv2.destroyAllWindows() 
0

これは、それはあなたが質問に尋ねないトリックを行う必要があり、コードは以下の通りです: `

import cv2 
import time 
import numpy as np 
cap=cv2.VideoCapture(0) 
fourcc=cv2.VideoWriter_fourcc(*'XVID') 
out=cv2.VideoWriter('output1.avi', fourcc, 20.0, (640, 48)) 
start_time=time.time() 
while True: 
    ret, frame=cap.read() 
    out.write(frame) 
    cv2.imshow('frame', frame) 
    if time.time()-start_time>=10: 
     break 
cap.release() 
out.release() 
time.sleep(6) 
cap2=cv2.VideoCapture(0) 
fourcc2=cv2.VideoWriter_fourcc(*'XVID') 
out2=cv2.VideoWriter('output2.avi', fourcc2, 20.0, (640, 48)) 
start_time2=time.time() 
while True: 
    ret, frame=cap2.read() 
    out2.write(frame) 
    cv2.imshow('frame', frame) 
    if time.time()-start_time2>=10: 
     break 
cap2.release() 
out.release() 

`

+0

コードは2本の動画が保存されますが、私はOpenCVのビデオキャプチャ機能でビデオを再生しようとした時はいつでも OpenCVのは、エラーOpenCVのエラーを生成します。アサーションに失敗しました(size.width> 0 && size.height> 0) –

+0

私は単純にそのビデオファイルを開こうとした時はいつでもをクリックすると、ストリームをデマルチプレクスできませんでした。 –

関連する問題