Wpis z mikrobloga

#python #python3 #opencv #programowanie
Panowie (i Panie), mam problem z nagrywaniem obrazu do pliku po detekcji ruchu. Obecnie skrypt tworzy mi kilkusekundowe pliki, wtedy gdy licznik jest powyżej 2000 i przerywa gdy spadnie poniżej tej wartości. Chciałbym, aby kontynuował nagrywanie jeszcze przez 20 sekund po ustaniu ruchu, a gdy przez te 20 sekund wykryje ponownie ruch to resetował licznik i od nowa odliczał 20 sekund. Skrypt działa poprawnie, ale niestety potrafi wygenerować w przeciągu minuty kilkadziesiąt filmików o nawet sekundowej długości. Kombinowałem coś z timerami ale biblioteka time w pythonie jest dla mnie nie do ogarnięcia;P

kod
import cv2
import numpy as np
import time
from datetime import datetime

# Video Capture
capture = cv2.VideoCapture("rtsp://admin:123456@192.168.0.86:554/H264?ch=1&subtype=2")
fourcc = cv2.VideoWriter_fourcc(*'XVID')
#capture = cv2.VideoCapture("demo.mov")

# History, Threshold, DetectShadows
fgbg = cv2.createBackgroundSubtractorMOG2(1000, 200, False)
#fgbg = cv2.createBackgroundSubtractorMOG2(300, 400, True)

# Keeps track of what frame we're on
frameCount = 0

while(1):
# Return Value and the current frame
ret, frame = capture.read()

# Check if a current frame actually exist
if not ret:
break

frameCount += 1
# Resize the frame
resizedFrame = cv2.resize(frame, (0, 0), fx=1, fy=1)

# Get the foreground mask
fgmask = fgbg.apply(resizedFrame)

# Count all the non zero pixels within the mask
count = np.countnonzero(fgmask)

print('Frame: %d, Pixel Count: %d' % (frameCount, count))

# Determine how many pixels do you want to detect to be considered "movement"
# if (frameCount > 1 and cou`nt > 5000):
if (frameCount > 1 and count >2000):
print('RUCH')
cv2.putText(resizedFrame, 'RUCH', (10, 50), cv2.FONT
HERSHEYSIMPLEX, 1, (0, 0, 255), 2, cv2.LINEAA)
now = datetime.now().strftime("%Y%m%d-%H%M%S")
filename = now + '.avi'
out = cv2.VideoWriter(filename, fourcc, 20.0, (640, 480))
while count > 1000:
ret, frame = capture.read()
fgmask = fgbg.apply(resizedFrame)
out.write(frame)
count = np.count_nonzero(fgmask)
#if count <200 :
# break

cv2.imshow('Frame', resizedFrame)
cv2.imshow('Mask', fgmask)

k = cv2.waitKey(1) & 0xff
if k == 27:
break

capture.release()
cv2.destroyAllWindows()

kod
  • 11
@NewEpisode: próbowałem z drugą pętlą, ale też mi coś nie wychodziło()
Jakiego warunku byś użył dla drugiej pętli?
Szukałem jakiegoś sygnału z biblioteki opencv, który daje prawdę jak już jest rozpoczęte nagrywanie coś jak "status record video".