Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import argparse
- import cv2
- import cv2.cv as cv
- from picamera.array import PiRGBArray
- from picamera import PiCamera
- import MySQLdb
- import ConfigParser
- import time
- import math
- import imutils
- class mod_cam():
- camera_fisica = None
- notificado = None
- contador = None
- bd = None
- config = None
- def __init__(self, r=(320, 320), dg=0, a=None, Numero_SCSE = None):
- #Cargando datos del Archivo config default
- #Cargando Parser
- self.config = ConfigParser.RawConfigParser()
- self.config.read('default.config')
- #Cargando datos a variables
- #self.dp_Ip = self.config.get('SQL_DATA1', 'DB_IP')
- #self.db_port = self.config.getint('SQL_DATA1', 'DB_PORT')
- #self.db_user = self.config.get('SQL_DATA1', 'DB_USER')
- #self.db_pass = self.config.get('SQL_DATA1', 'DB_PASS')
- #self.db_dbt = self.config.get('SQL_DATA1', 'DB_TABLE')
- #self.n_scse = self.config.get('SYSTEM', 'SCSE_NUMBER')
- # done here
- #self.Numero_SCSE = self.n_scse
- self.avg = a
- self.camera_fisica = PiCamera()
- self.camera_fisica.resolution = r # r = Resolution
- self.rawCapture = PiRGBArray(self.camera_fisica, size=r)
- self.camera_fisica.rotation = 0 # dg = degree
- self.font = cv2.FONT_HERSHEY_SIMPLEX
- print "[INFO] Inicializando Camara"
- time.sleep(0.5)
- # Open database connection
- #self.bd = MySQLdb.connect(self.dp_Ip,self.db_user,self.db_pass,self.db_dbt,self.db_port)
- # prepare a cursor object using cursor() method
- #self.cursor = self.bd.cursor()
- # execute SQL query using execute() method.
- #self.cursor.execute("SELECT VERSION()")
- # Fetch a single row using fetchone() method.
- #self.data = self.cursor.fetchone()
- #print "Version de la base de datos : %s " % self.data
- time.sleep(0.5)
- self.min_area = 900
- def add_contour_in_storage(self):
- storage = cv.CreateMemStorage(0)
- contour,storage = cv2.findContours(self.gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- return contour
- @staticmethod
- def get_rectangle_parameters(bound_rect,frame):
- pt1 = (bound_rect[0], bound_rect[1])
- pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3])
- x_center = abs(pt1[0] - pt2[0]) / 2 + pt1[0]
- y_center = abs(pt1[1] - pt2[1]) / 2 + pt1[1]
- point = (x_center, y_center)
- y_length = abs(pt1[0] - pt2[0])
- x_length = abs(pt1[1] - pt2[1])
- area = x_length * y_length
- return pt1, pt2, point, area
- def get_points_tracking(self, point, area,frame):
- if area > self.min_area:
- cv2.circle(self.frame, point, 2, cv.CV_RGB(0, 255, 0), 6)
- def filtros(self):
- for f in self.camera_fisica.capture_continuous(self.rawCapture, format="bgr",
- use_video_port=True):
- #Toma Arreglo Bruto Numpy representando la imagen e inicializa
- self.frame = f.array
- # ajuste de resolucion de la imagen la convierte a escala
- #de grises y la difumina
- self.gray = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY) #Imagen a blanco y negro
- self.gray = cv2.GaussianBlur(self.gray,(7,7),0) #imagen a blanco y negro mas limpia
- #Si el frame promedio es None Inicializa esto
- if self.avg is None:
- print "[INFO] Starting Background Model"
- self.avg = self.gray.copy().astype("float")
- self.rawCapture.truncate(0)
- #Computa la diferencia entre el frame anterior y el actual con avg
- cv2.accumulateWeighted(self.gray, self.avg, 0.5)
- self.framedelta = cv2.absdiff(self.gray, cv2.convertScaleAbs(self.avg)) #Fondo Negro Movimiento a color
- #threshold la imagen delta , y dilata la threshold para llenar
- #los espacios , y entonces encontrar los contornos
- self.thresh = cv2.threshold(self.framedelta, 5, 255, cv2. THRESH_BINARY)[1] #Fondo Negro Movimiento Blanco y Negro
- self.thresh = cv2.dilate(self.thresh, None, iterations=2)
- self.contador_persona = 0
- self.decrease_persona = 0
- self.sql = ''
- #self.idsala = self.Numero_SCSE
- self.cantpent = 0
- self.cantpsal = 0
- self.cantpers = self.cantpent + self.cantpsal
- first = True
- entrada = False
- salida = False
- persona = 0
- contador = 0
- flagA= False
- flagB= False
- done = False
- valor_viejo = 0
- v_salida_o = 0
- while True:
- contour = self.add_contour_in_storage()
- cv2.line(self.frame, (60,120), (300,120), (0, 255, 0), 1)
- cv2.line(self.frame, (60,180), (300,180), (255, 0, 0), 1)
- cv2.putText(self.frame, "B", (0, 120), cv2.FONT_HERSHEY_SIMPLEX, 1, (250, 0, 0))
- cv2.putText(self.frame, "A", (0, 185), cv2.FONT_HERSHEY_SIMPLEX, 1, (250, 0, 0))
- for cnt in contour:
- bound_rect = cv2.boundingRect(cnt)
- pt1, pt2, point, area = self.get_rectangle_parameters(bound_rect, self.frame)
- if area > 12000 and area < 50000:
- #print "area",area,"punto",point,"done:",done
- if 120 <= point[1] <= 130: # si existe el puntoy en ese rango
- #print "comparo punto A en:",point[1],"; In:",entrada,"; out:",salida,"; flag A:",flagA,"; flagB:",flagB
- if salida is True:
- flagA = False #no significa que no entro por aca
- elif salida is False and entrada is False:
- flagA = True #entro primero por aca
- entrada = True
- if flagA is False:
- entrada = True
- #comparar punto sobre 130?
- #print "::cambio punto A en:",point[1],"; In:",entrada,"; out:",salida,"; flag A: ",flagA,"; flagB:",flagB
- elif 147 <= point[1] <= 170: # si existe punto en ese rango
- #print "comparo punto B en:",point[1],"; In:",entrada,"; out:",salida,"; flag A:",flagA,"; flagB:",flagB
- if entrada is True:
- flagB = False
- elif entrada is False and salida is False:
- flagB = True
- salida = True
- if flagB is False:
- salida = True
- #comparar punto sobre 170?
- #print "::cambio punto B en:",point[1],"; In:",entrada,"; out:",salida,"; flag A:",flagA,"; flagB:",flagB
- if entrada is True and salida is True and flagA is True:
- #entro y salio y ademas entro por punto A
- v_salida_n = point[1]
- if v_salida_n > 170 or v_salida_o > v_salida_n:
- #print "-->old: ",valor_viejo,";new:",v_salida_n
- #print "Paso por punto A primero"
- if area >= 45000:
- persona = persona +2
- self.increment_count_persona(2) #incremento Persona
- self.increment_bdcant_persona(2) #Incremento Persona en BD
- print " persona: ->", persona
- #entrada=salida=flagA=flagB=False
- else:
- persona = persona + 1
- self.increment_count_persona(1) #incremento Persona
- self.increment_bdcant_persona(1) #Incremento Persona en BD
- print " persona: ->", persona
- #entrada=salida=flagA=flagB=False
- entrada=salida=flagA=flagB=False
- #print "reset de caga en 170"
- elif v_salida_o <= 170 and v_salida_o < v_salida_n and v_salida_o > 0:
- #print "en 170 old: ",valor_viejo,";new:",v_salida_n
- v_salida_o = v_salida_n
- elif v_salida_o == 0:
- #print "old: ",valor_viejo,";new:",v_salida_n
- v_salida_o = v_salida_n
- elif entrada is True and salida is True and flagB is True:
- #Entro y salio y ademas entro por punto B compara el ultimo delos 160 y 170
- #salvar numero anterior
- #compara numero anterior nuevo
- valor_nuevo = point[1]
- if valor_nuevo < 120 : #and valor_viejo < valor_nuevo:
- #print "->old: ",valor_viejo,";new:",valor_nuevo
- #print "Paso por punto B Primero"
- if area >= 45000:
- persona = persona - 2
- self.decrease_count_persona(2) #Decremento Persona
- self.decrement_bdcant_persona(2) #Decremento Persona En BD
- print " persona: ->", persona
- #entrada=salida=flagA=flagB=False
- else:
- persona = persona - 1
- self.decrease_count_persona(1) #Decremento Persona
- self.decrement_bdcant_persona(1) #Decremento Persona En BD
- print " persona: ->", persona
- #entrada=salida=flagA=flagB=False
- entrada=salida=flagA=flagB=False
- #print "reset de was en 120"
- elif valor_nuevo >= 120 and valor_nuevo < valor_viejo and valor_viejo > 0:
- #print "en 120 old: ",valor_viejo,";new:",valor_nuevo
- valor_viejo = valor_nuevo
- elif valor_viejo == 0:
- #print "old: ",valor_viejo,";new:",valor_nuevo
- valor_viejo = valor_nuevo
- if area == 0 and point[1]>=120 and point <= 170:
- entrada = False
- salida = False
- cv2.imshow("M", self.frame)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement