Compare commits

...

8 Commits

Author SHA1 Message Date
2f3934d5eb plonk 2020-04-14 18:29:45 +02:00
1130906f03 plonk 2020-04-14 18:25:45 +02:00
514034d2c8 fix spot tracking 2020-04-05 16:32:59 +02:00
75cc736490 bong 2020-04-03 22:19:57 +02:00
1f2a438b75 remove spurious print 2020-04-03 21:22:09 +02:00
e88be83958 minor adjustments 2020-04-03 21:03:35 +02:00
a8ac06189d add docker-compose/prometheus sample 2020-04-02 00:17:37 +02:00
17986590d6 add stream_on metric 2020-04-02 00:17:23 +02:00
3 changed files with 53 additions and 17 deletions

19
docker-compose.yml Normal file
View File

@@ -0,0 +1,19 @@
version: "3.3"
services:
exporter:
build: .
ports:
- 8888:8888
command: python3 -u /usr/src/process.py rtsp://ubnt:ubnt@10.8.0.124:554/live/ch00_0
restart: always
prometheus:
image: prom/prometheus:v2.17.1
volumes:
- ./prometheus.yml:/prometheus/prometheus.yml
command:
- '--config.file=/prometheus/prometheus.yml'
ports:
- 9090:9090
restart: always

View File

@@ -5,9 +5,11 @@ import os
import time import time
import numpy as np import numpy as np
from prometheus_client import start_http_server, Counter, Gauge from prometheus_client import start_http_server, Counter, Gauge
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s')
cut_count = Counter('cut_count', 'Total number of jebnięcie') cut_count = Counter('cut_count', 'Total number of jebnięcie')
machine_on = Gauge('machine_on', 'Current machine engine status') machine_on = Gauge('machine_on', 'Current machine engine status')
stream_on = Gauge('stream_on', 'Current camera stream status')
start_http_server(8888) start_http_server(8888)
@@ -20,6 +22,7 @@ def dist(pos1, pos2):
def run(path): def run(path):
gui = 'DISPLAY' in os.environ gui = 'DISPLAY' in os.environ
stream_on.set(0)
machine_on.set(0) machine_on.set(0)
# Create a VideoCapture object and read from input file # Create a VideoCapture object and read from input file
@@ -30,30 +33,33 @@ def run(path):
if not cap.isOpened(): if not cap.isOpened():
raise Exception('VideoCapture not opened') raise Exception('VideoCapture not opened')
print('Opened') logging.info('Stream opened')
stream_on.set(1)
spots = [] spots = []
turnedon = False turnedon = False
framenum = 0 framenum = 0
framerate = 30
# Read until video is completed # Read until video is completed
while(cap.isOpened()): while(cap.isOpened()):
# Capture frame-by-frame # Capture frame-by-frame
ret, frame = cap.read() ret, frame = cap.read()
if ret == True: if ret == True:
h, w, channels = frame.shape h, w, channels = frame.shape
frame = frame[int(h*0.5):int(h*0.9), int(w*0.62):int(w*0.8)]
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) smol = frame[int(h*0.5):int(h*0.9), int(w*0.63):int(w*0.8)]
blurred = cv2.GaussianBlur(gray, (5, 5), 0) gray = cv2.cvtColor(smol, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(blurred, 240, 255, cv2.THRESH_BINARY)[1] blurred = cv2.GaussianBlur(gray, (7, 7), 0)
thresh = cv2.threshold(blurred, 235, 255, cv2.THRESH_BINARY)[1]
cnts = cv2.findContours(thresh, cv2.RETR_LIST, cnts = cv2.findContours(thresh, cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)[-2] cv2.CHAIN_APPROX_SIMPLE)[-2]
for c in cnts: for c in cnts:
area = cv2.contourArea(c) area = cv2.contourArea(c)
if area > 20 and area < 45: if area > 20 and area < 80:
# compute the center of the contour # compute the center of the contour
M = cv2.moments(c) M = cv2.moments(c)
cX = int(M["m10"] / M["m00"]) cX = int(M["m10"] / M["m00"])
@@ -79,29 +85,31 @@ def run(path):
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
for spot in spots: for spot in spots:
if spot['lastseen'] <= framenum - 50 and turnedon: if spot['lastseen'] <= framenum - framerate and turnedon:
d = dist(spots[0]['pos'], spot['pos']) d = dist(spots[0]['pos'], spot['pos'])
if d < 30 and d > 5: l = spot['lifetime'] / framerate
print('PRYJEBAŁ :___DDD %.2f' % (spot['lifetime'] / 30.0,)) if d < 30 and d > 5 and l > 1.0 and l < 8.0:
logging.info('PRYJEBAŁ :___DDD %.2f' % (l,))
cut_count.inc() cut_count.inc()
if len(spots) and spots[0]['lifetime'] > 50: if len(spots) and spots[0]['lifetime'] > framerate * 5:
if not turnedon: if not turnedon:
print('just turned on') logging.info('just turned on')
machine_on.set(1) machine_on.set(1)
turnedon = True turnedon = True
else: else:
if turnedon: if turnedon:
print('just turned off') logging.info('just turned off')
machine_on.set(0) machine_on.set(0)
turnedon = False turnedon = False
spots = [spot for spot in spots if spot['lastseen'] > framenum - 50] spots = [spot for spot in spots if spot['lastseen'] > framenum - framerate]
spots.sort(key=lambda v: v['lastseen'], reverse=True) spots.sort(key=lambda v: v['lifetime'], reverse=True)
framenum += 1 framenum += 1
if gui: if gui:
cv2.imshow('frame',frame) cv2.imshow('frame',blurred)
#cv2.imshow('edges',edges)
cv2.imshow('thresh',thresh) cv2.imshow('thresh',thresh)
# Press Q on keyboard to exit # Press Q on keyboard to exit
@@ -119,5 +127,6 @@ while True:
try: try:
run(sys.argv[1]) run(sys.argv[1])
except Exception as exc: except Exception as exc:
print(exc) logging.exception('Failed?')
stream_on.set(0)
time.sleep(5.0) time.sleep(5.0)

8
prometheus.yml Normal file
View File

@@ -0,0 +1,8 @@
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: sztancarka
static_configs:
- targets: ["exporter:8888"]