Initial commit
This commit is contained in:
commit
a2598f5912
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
|
|
@ -0,0 +1,41 @@
|
|||
import cv2
|
||||
import imageio
|
||||
|
||||
|
||||
class FrameBuffer(object):
|
||||
|
||||
def __init__(self, size):
|
||||
self.size = size
|
||||
self.items = []
|
||||
|
||||
def is_empty(self):
|
||||
return len(self.items) == 0
|
||||
|
||||
def get_size(self):
|
||||
return len(self.items)
|
||||
|
||||
def push(self, frame):
|
||||
self.items.append(frame)
|
||||
if self.get_size() > self.size:
|
||||
self.items.pop(0)
|
||||
|
||||
def get_frames(self):
|
||||
return self.items
|
||||
|
||||
def write_gif(self, filename):
|
||||
with imageio.get_writer(filename, mode='I') as writer:
|
||||
for frame in self.items:
|
||||
writer.append_data(frame)
|
||||
|
||||
def dump(self):
|
||||
self.items = []
|
||||
|
||||
def write_mp4(self, filename, width, height, fps=25):
|
||||
print("Schreibe mp4 Datei")
|
||||
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
|
||||
out = cv2.VideoWriter(filename, fourcc, fps, frameSize=(width, height))
|
||||
|
||||
for frame in self.items:
|
||||
out.write(frame)
|
||||
|
||||
out.release()
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
from datetime import datetime
|
||||
from FrameBuffer import FrameBuffer
|
||||
import cv2
|
||||
# import random
|
||||
# RTSP-Stream-URL einstellen
|
||||
#1280x720:
|
||||
#rtsp_url = "rtsp://admin:RlBqOp30cam@192.168.178.121/live/ch0"
|
||||
#640x360:
|
||||
rtsp_url = "rtsp://admin:RlBqOp30cam@192.168.178.121/live/ch1"
|
||||
|
||||
# OpenCV-Videoaufzeichnungsobjekt erstellen
|
||||
cap = cv2.VideoCapture(rtsp_url)
|
||||
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||
print("Width: "+str(width)+" Height: "+str(height))
|
||||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||||
print(f'Framerate: {fps}')
|
||||
# 2 Sekunden vor Erkennung
|
||||
MAX_BUFFER = fps*2
|
||||
# Codec für die Ausgabe festlegen
|
||||
fourcc = cv2.VideoWriter_fourcc(*'XVID')
|
||||
frameBuffer = FrameBuffer(MAX_BUFFER)
|
||||
# Initialisiere den Hintergrundsubtraktor
|
||||
# Load the mask from a file
|
||||
# mask_file = 'CAM2maskeBW.png'
|
||||
mask_file = 'CAM2maskeBW640.png'
|
||||
mask_rgb = cv2.imread(mask_file)
|
||||
mask = cv2.imread(mask_file, cv2.IMREAD_GRAYSCALE)
|
||||
# Invert the mask (if necessary) and threshold it
|
||||
# mask = cv2.bitwise_not(mask)
|
||||
mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]
|
||||
# Ausgabedatei erstellen und Videoaufzeichnung starten
|
||||
# output_file = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
|
||||
counter = 1
|
||||
# print(datetime.datetime.now().time())
|
||||
firstFrameWithMotion = 0
|
||||
lastFrameWithMotion = 0
|
||||
fgbg = cv2.createBackgroundSubtractorMOG2()
|
||||
bufferedFrames = []
|
||||
while(cap.isOpened()):
|
||||
try:
|
||||
ret, frame = cap.read()
|
||||
if ret:
|
||||
#output_file.write(frame)
|
||||
#img = cv2.imread(frame)
|
||||
# Wende die Maske auf das Frame an
|
||||
masked_frame = cv2.bitwise_and(frame, frame, mask=mask)
|
||||
|
||||
# Subtrahiere das Hintergrund-Modell von dem aktuellen Frame
|
||||
fgmask = fgbg.apply(masked_frame)
|
||||
#gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||
#fgmask = fgbg.apply(gray)
|
||||
blur = cv2.GaussianBlur(fgmask, (5,5), 0)
|
||||
ret,thresh = cv2.threshold(blur,100,255,cv2.THRESH_BINARY)
|
||||
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
|
||||
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 3)
|
||||
contours, hierarchy = cv2.findContours(opening, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||
|
||||
for c in contours:
|
||||
area = cv2.contourArea(c)
|
||||
faktor = (width*height*4)/(640*360)
|
||||
#if area > width*height/3 or area < width*height/20:
|
||||
# continue
|
||||
if area < 1600*faktor or area > 40000*faktor:
|
||||
continue
|
||||
(x, y, w, h) = cv2.boundingRect(c)
|
||||
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
||||
if firstFrameWithMotion == 0:
|
||||
firstFrameWithMotion = counter
|
||||
lastFrameWithMotion = counter
|
||||
bufferedFrames = frameBuffer.get_frames()
|
||||
if firstFrameWithMotion > 0:
|
||||
lastFrameWithMotion = counter
|
||||
|
||||
MAX_PAUSE_OF_MOTION = fps/2
|
||||
MIN_DURATION_OF_MOTION = fps*2
|
||||
WATCH_BEFORE = fps*2
|
||||
if firstFrameWithMotion > 0 and lastFrameWithMotion - firstFrameWithMotion > MIN_DURATION_OF_MOTION and counter - lastFrameWithMotion > MAX_PAUSE_OF_MOTION:
|
||||
|
||||
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
|
||||
now = datetime.now()
|
||||
# Format the date and time as a string
|
||||
dt_string = now.strftime("%Y-%m-%d_%H-%M-%S")
|
||||
print(dt_string + " Schreibe mp4 Datei")
|
||||
out = cv2.VideoWriter("output-" + dt_string + ".mp4", fourcc, fps, frameSize=(width, height))
|
||||
for frame in bufferedFrames:
|
||||
out.write(frame)
|
||||
out.release()
|
||||
firstFrameWithMotion = 0
|
||||
lastFrameWithMotion = 0
|
||||
frameBuffer.dump()
|
||||
bufferedFrames = []
|
||||
|
||||
if counter > MAX_BUFFER and firstFrameWithMotion == 0:
|
||||
counter = 1
|
||||
|
||||
# Apply the mask to the frame
|
||||
#masked_frame = cv2.multiply(0.2, mask_rgb) + frame
|
||||
|
||||
cv2.imshow('frame',frame)
|
||||
#cv2.imshow('fgmask',fgmask)
|
||||
if firstFrameWithMotion == 0:
|
||||
frameBuffer.push(frame)
|
||||
else:
|
||||
bufferedFrames.append(frame)
|
||||
#if counter % 10 == 0:
|
||||
# print("Frame"+str(counter))
|
||||
counter += 1
|
||||
|
||||
|
||||
#blur_img = cv2.GaussianBlur(frame, (5, 5), 0)
|
||||
#cv2.imshow('frame',blur_img)
|
||||
#edges = cv2.Canny(blur_img, 150, 200)
|
||||
#cv2.imshow("Kantenerkennung", edges)
|
||||
|
||||
if cv2.waitKey(1) & 0xFF == ord('q'):
|
||||
break
|
||||
else:
|
||||
break
|
||||
except Exception as e:
|
||||
# Hier kommt der Code, der ausgeführt wird, wenn ein Fehler auftritt
|
||||
print("Ein Fehler ist aufgetreten:", str(e))
|
||||
|
||||
# Freigeben der Ressourcen
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
Loading…
Reference in New Issue