一段时间后,使用OpenCV拍摄视频



我是Python和OpenCV的初学者。我想在OpenCV视频仪功能上进行某个间隔的视频,让我们说10秒钟,然后系统应该进入睡眠模式一段时间,请说6秒钟。然后拍摄10秒的视频。任何视频都应保存在单独的文件中。我的问题是,当我调用第一个功能时,它保存了第一个视频,但是在呼叫Video2功能时,它并不能保存视频。对代码的不良安排。我是新用户。

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个位置,并说这是一个问题。所以我在这里重新安排了您的代码。另外,您甚至没有在代码中定义time_startclosing_time。但是我假设您的真实代码拥有它们,而问题只是第二个视频不正确。那是因为您必须在video1video2的开头定义time_start。如果您不重新定义time_start,那么到达video2时,此while 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()

这应该做到您在问题中要求的技巧,代码如下:

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()

`

最新更新