2017-01-21 40 views
1

目的保存视频片段:检测的运动,只有在保存文件中的运动时间与起始时间名。OpenCV的 - 基于certion条件

现在我遇到了关于如何将视频保存到具有视频开始时间的文件的问题。

我测试

我的一部分测试了我的计划的一部分。看起来,除了保存部分以外,每个部分都工作得很好。

运行状态:没有错误。但在保存文件夹中,没有视频。如果我使用静态保存路径,视频将被成功保存,但视频将被下一个视频覆盖。我的代码如下所示:

import cv2 
import numpy as np 
import time 
cap = cv2.VideoCapture(0) 
bgst = cv2.createBackgroundSubtractorMOG2() 
fourcc=cv2.VideoWriter_fourcc(*'DIVX') 
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) 
n = "start_time" 

while True: 
    ret, frame = cap.read() 
    dst = bgst.apply(frame) 
    dst = np.array(dst, np.int8) 

    if np.count_nonzero(dst)>3000: # use this value to adjust the "Sensitivity“ 

     print('something is moving %s' %(time.ctime())) 

     path = r'E:\OpenCV\Motion_Detection\%s.avi' %n 
     out = cv2.VideoWriter(path, fourcc, 50, size) 
     out.write(frame) 

     key = cv2.waitKey(3) 
     if key == 32: 
      break 

else: 
    out.release() 
    n = time.ctime() 
    print("No motion Detected %s" %n) 
+0

为了避免覆盖已保存的视频,请使用“for”循环。尝试在'for'循环中包含'if'和'else'条件。 –

+0

对不起,请您说清楚,我仍然....不能解决问题 – Guang

回答

0

我的意思是:

import cv2 
import numpy as np 
import time 
cap = cv2.VideoCapture(0) 
bgst = cv2.createBackgroundSubtractorMOG2() 

fourcc=cv2.VideoWriter_fourcc(*'DIVX') 
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) 
path = r'E:\OpenCV\Motion_Detection\%s.avi' %(time.ctime()) 
out = cv2.VideoWriter(path, fourcc, 16, size) 

while True: 
    ret, frame = cap.read() 
    dst = bgst.apply(frame) 
    dst = np.array(dst, np.int8) 

    for i in range(number of frames in the video): 
     if np.count_nonzero(dst)<3000: # use this value to adjust the "Sensitivity“ 

      print("No Motion Detected") 
      out.release() 

     else: 

      print('something is moving %s' %(time.ctime())) 
      #label each frame you want to output here 
      out.write(frame(i)) 

    key = cv2.waitKey(1) 
    if key == 32: 
     break 

cap.release() 
cv2.destroyAllWindows() 

如果你看到的代码会有一个for循环,其内保存的过程中完成的。

我不知道确切的语法涉及循环与帧,但我希望你有它的要点。您必须找到视频中存在的帧数,并将其设置为for循环中的范围。

每个帧得到保存唯一(请参阅else条件。)正如我所说我不知道​​的语法。请参阅并遵循此过程。

干杯!

+0

谢谢您的解释。 – Guang

+0

谢谢你的解释。问题是,我们不知道视频有多长,因为它完全取决于运动停止的时间。我认为我们需要找到一个可以临时存储图像序列的空间,直到运动停止,最后与目标文件夹相同。我不确定numpy数组是否可以做到这一点。我会先试试这个。 – Guang

+0

很高兴我能帮上忙 –