2017-01-21 5 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'. Попробуйте включить условие 'if' и' else' в цикле 'for'. –

+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.) Как я уже сказал, я не знаю синтаксиса. Пожалуйста, обратитесь к этой процедуре.

Cheers!

+0

Благодарим вас за разъяснения. – Guang

+0

Благодарим вас за разъяснения. Дело в том, что мы не можем знать, как долго это видео, потому что это полностью зависит от того, когда движение остановится. Я думаю, нам нужно найти пространство, которое может временно хранить последовательности изображений до тех пор, пока движение не остановится, и, наконец, оно не будет в папке назначения. Я не уверен, может ли массив numpy сделать это. Я попробую это. Сначала. – Guang

+0

рад, что я могу помочь –