2017-09-27 211 views
0

我在python初學者也OpenCV中。我想用opencv的視頻捕捉功能拍攝一段時間的視頻,比如說10秒,然後系統進入睡眠模式一段時間,比如說6秒,然後拍攝10秒的視頻。兩個視頻都應該保存在單獨的文件中。我的問題是,當我打電話第一個功能它保存第一個視頻,但在視頻2功能調用它不保存video.sorry不好的代碼安排。我是新用戶。下拍攝視頻

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

沒有太多的分析:你有一個恆定的輸出文件。所以是的,當然你不會看到多個輸出文件。您需要在循環中使用不同的文件名(並可能重構創建文件處理程序的位置)。 – sascha

+0

我有兩個功能節省2 videos.first視頻正常打開,但第二個文件出現在文件夾中的首部影片正常打開,但在開說不能解複用流 –

+0

請修改代碼以刪除所有的意見,然後我們可以看到,如果有保存第一個視頻文件和第二個視頻文件的任何差異。同時做這兩個功能視頻1,視頻2執行保存視頻相同的行動? –

回答

0

你的代碼中有這麼多的缺口的問題,我可以甚至不會指向1個位置,並說這是一個問題。所以我在這裏重新安排了你的代碼。你甚至沒有在你的代碼中定義time_startclosing_time。但我假設你的真實代碼有他們,問題只是第二個視頻不能正確輸出。那是因爲你必須在video1video2的開頭定義time_start。如果不重新定義time_start,你的時間去video2while time.time() < time_start + closing_time:已經用盡,將是錯誤的。所以沒有真正的視頻正在寫入文件。

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

代碼節省了兩段視頻,但每當我試着用OpenCV的視頻拍攝功能播放視頻 OpenCV的生成錯誤OpenCV的錯誤:斷言失敗(size.width> 0 && size.height> 0) –

+0

每當我試圖打開一個視頻文件簡單地通過點擊它給不能解複用流。 –