Guest User

Untitled

a guest
Jul 23rd, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.34 KB | None | 0 0
  1. import numpy as np
  2. import argparse
  3. import cv2
  4. import cv2.cv as cv
  5. from picamera.array import PiRGBArray
  6. from picamera import PiCamera
  7. import MySQLdb
  8. import ConfigParser
  9. import time
  10. import math
  11. import imutils
  12.  
  13.  
  14. class mod_cam():
  15.  
  16. camera_fisica = None
  17. notificado = None
  18. contador = None
  19. bd = None
  20. config = None
  21. def __init__(self, r=(320, 320), dg=0, a=None, Numero_SCSE = None):
  22. #Cargando datos del Archivo config default
  23. #Cargando Parser
  24. self.config = ConfigParser.RawConfigParser()
  25. self.config.read('default.config')
  26. #Cargando datos a variables
  27. #self.dp_Ip = self.config.get('SQL_DATA1', 'DB_IP')
  28. #self.db_port = self.config.getint('SQL_DATA1', 'DB_PORT')
  29. #self.db_user = self.config.get('SQL_DATA1', 'DB_USER')
  30. #self.db_pass = self.config.get('SQL_DATA1', 'DB_PASS')
  31. #self.db_dbt = self.config.get('SQL_DATA1', 'DB_TABLE')
  32. #self.n_scse = self.config.get('SYSTEM', 'SCSE_NUMBER')
  33. # done here
  34. #self.Numero_SCSE = self.n_scse
  35. self.avg = a
  36. self.camera_fisica = PiCamera()
  37. self.camera_fisica.resolution = r # r = Resolution
  38. self.rawCapture = PiRGBArray(self.camera_fisica, size=r)
  39. self.camera_fisica.rotation = 0 # dg = degree
  40. self.font = cv2.FONT_HERSHEY_SIMPLEX
  41. print "[INFO] Inicializando Camara"
  42. time.sleep(0.5)
  43. # Open database connection
  44. #self.bd = MySQLdb.connect(self.dp_Ip,self.db_user,self.db_pass,self.db_dbt,self.db_port)
  45. # prepare a cursor object using cursor() method
  46. #self.cursor = self.bd.cursor()
  47. # execute SQL query using execute() method.
  48. #self.cursor.execute("SELECT VERSION()")
  49. # Fetch a single row using fetchone() method.
  50. #self.data = self.cursor.fetchone()
  51. #print "Version de la base de datos : %s " % self.data
  52. time.sleep(0.5)
  53. self.min_area = 900
  54.  
  55. def add_contour_in_storage(self):
  56. storage = cv.CreateMemStorage(0)
  57. contour,storage = cv2.findContours(self.gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  58. return contour
  59.  
  60. @staticmethod
  61. def get_rectangle_parameters(bound_rect,frame):
  62. pt1 = (bound_rect[0], bound_rect[1])
  63. pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3])
  64. x_center = abs(pt1[0] - pt2[0]) / 2 + pt1[0]
  65. y_center = abs(pt1[1] - pt2[1]) / 2 + pt1[1]
  66. point = (x_center, y_center)
  67. y_length = abs(pt1[0] - pt2[0])
  68. x_length = abs(pt1[1] - pt2[1])
  69. area = x_length * y_length
  70. return pt1, pt2, point, area
  71.  
  72. def get_points_tracking(self, point, area,frame):
  73. if area > self.min_area:
  74. cv2.circle(self.frame, point, 2, cv.CV_RGB(0, 255, 0), 6)
  75.  
  76. def filtros(self):
  77. for f in self.camera_fisica.capture_continuous(self.rawCapture, format="bgr",
  78. use_video_port=True):
  79. #Toma Arreglo Bruto Numpy representando la imagen e inicializa
  80. self.frame = f.array
  81. # ajuste de resolucion de la imagen la convierte a escala
  82. #de grises y la difumina
  83. self.gray = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY) #Imagen a blanco y negro
  84. self.gray = cv2.GaussianBlur(self.gray,(7,7),0) #imagen a blanco y negro mas limpia
  85. #Si el frame promedio es None Inicializa esto
  86. if self.avg is None:
  87. print "[INFO] Starting Background Model"
  88. self.avg = self.gray.copy().astype("float")
  89. self.rawCapture.truncate(0)
  90. #Computa la diferencia entre el frame anterior y el actual con avg
  91. cv2.accumulateWeighted(self.gray, self.avg, 0.5)
  92. self.framedelta = cv2.absdiff(self.gray, cv2.convertScaleAbs(self.avg)) #Fondo Negro Movimiento a color
  93. #threshold la imagen delta , y dilata la threshold para llenar
  94. #los espacios , y entonces encontrar los contornos
  95. self.thresh = cv2.threshold(self.framedelta, 5, 255, cv2. THRESH_BINARY)[1] #Fondo Negro Movimiento Blanco y Negro
  96. self.thresh = cv2.dilate(self.thresh, None, iterations=2)
  97. self.contador_persona = 0
  98. self.decrease_persona = 0
  99. self.sql = ''
  100. #self.idsala = self.Numero_SCSE
  101. self.cantpent = 0
  102. self.cantpsal = 0
  103. self.cantpers = self.cantpent + self.cantpsal
  104. first = True
  105. entrada = False
  106. salida = False
  107. persona = 0
  108. contador = 0
  109. flagA= False
  110. flagB= False
  111. done = False
  112. valor_viejo = 0
  113. v_salida_o = 0
  114. while True:
  115. contour = self.add_contour_in_storage()
  116. cv2.line(self.frame, (60,120), (300,120), (0, 255, 0), 1)
  117. cv2.line(self.frame, (60,180), (300,180), (255, 0, 0), 1)
  118. cv2.putText(self.frame, "B", (0, 120), cv2.FONT_HERSHEY_SIMPLEX, 1, (250, 0, 0))
  119. cv2.putText(self.frame, "A", (0, 185), cv2.FONT_HERSHEY_SIMPLEX, 1, (250, 0, 0))
  120. for cnt in contour:
  121. bound_rect = cv2.boundingRect(cnt)
  122. pt1, pt2, point, area = self.get_rectangle_parameters(bound_rect, self.frame)
  123. if area > 12000 and area < 50000:
  124. #print "area",area,"punto",point,"done:",done
  125. if 120 <= point[1] <= 130: # si existe el puntoy en ese rango
  126. #print "comparo punto A en:",point[1],"; In:",entrada,"; out:",salida,"; flag A:",flagA,"; flagB:",flagB
  127. if salida is True:
  128. flagA = False #no significa que no entro por aca
  129. elif salida is False and entrada is False:
  130. flagA = True #entro primero por aca
  131. entrada = True
  132. if flagA is False:
  133. entrada = True
  134. #comparar punto sobre 130?
  135. #print "::cambio punto A en:",point[1],"; In:",entrada,"; out:",salida,"; flag A: ",flagA,"; flagB:",flagB
  136. elif 147 <= point[1] <= 170: # si existe punto en ese rango
  137. #print "comparo punto B en:",point[1],"; In:",entrada,"; out:",salida,"; flag A:",flagA,"; flagB:",flagB
  138. if entrada is True:
  139. flagB = False
  140. elif entrada is False and salida is False:
  141. flagB = True
  142. salida = True
  143. if flagB is False:
  144. salida = True
  145. #comparar punto sobre 170?
  146. #print "::cambio punto B en:",point[1],"; In:",entrada,"; out:",salida,"; flag A:",flagA,"; flagB:",flagB
  147. if entrada is True and salida is True and flagA is True:
  148. #entro y salio y ademas entro por punto A
  149. v_salida_n = point[1]
  150. if v_salida_n > 170 or v_salida_o > v_salida_n:
  151. #print "-->old: ",valor_viejo,";new:",v_salida_n
  152. #print "Paso por punto A primero"
  153. if area >= 45000:
  154. persona = persona +2
  155. self.increment_count_persona(2) #incremento Persona
  156. self.increment_bdcant_persona(2) #Incremento Persona en BD
  157. print " persona: ->", persona
  158. #entrada=salida=flagA=flagB=False
  159. else:
  160. persona = persona + 1
  161. self.increment_count_persona(1) #incremento Persona
  162. self.increment_bdcant_persona(1) #Incremento Persona en BD
  163. print " persona: ->", persona
  164. #entrada=salida=flagA=flagB=False
  165. entrada=salida=flagA=flagB=False
  166. #print "reset de caga en 170"
  167. elif v_salida_o <= 170 and v_salida_o < v_salida_n and v_salida_o > 0:
  168. #print "en 170 old: ",valor_viejo,";new:",v_salida_n
  169. v_salida_o = v_salida_n
  170. elif v_salida_o == 0:
  171. #print "old: ",valor_viejo,";new:",v_salida_n
  172. v_salida_o = v_salida_n
  173.  
  174. elif entrada is True and salida is True and flagB is True:
  175. #Entro y salio y ademas entro por punto B compara el ultimo delos 160 y 170
  176. #salvar numero anterior
  177. #compara numero anterior nuevo
  178. valor_nuevo = point[1]
  179. if valor_nuevo < 120 : #and valor_viejo < valor_nuevo:
  180. #print "->old: ",valor_viejo,";new:",valor_nuevo
  181. #print "Paso por punto B Primero"
  182. if area >= 45000:
  183. persona = persona - 2
  184. self.decrease_count_persona(2) #Decremento Persona
  185. self.decrement_bdcant_persona(2) #Decremento Persona En BD
  186. print " persona: ->", persona
  187. #entrada=salida=flagA=flagB=False
  188. else:
  189. persona = persona - 1
  190. self.decrease_count_persona(1) #Decremento Persona
  191. self.decrement_bdcant_persona(1) #Decremento Persona En BD
  192. print " persona: ->", persona
  193. #entrada=salida=flagA=flagB=False
  194. entrada=salida=flagA=flagB=False
  195. #print "reset de was en 120"
  196. elif valor_nuevo >= 120 and valor_nuevo < valor_viejo and valor_viejo > 0:
  197. #print "en 120 old: ",valor_viejo,";new:",valor_nuevo
  198. valor_viejo = valor_nuevo
  199. elif valor_viejo == 0:
  200. #print "old: ",valor_viejo,";new:",valor_nuevo
  201. valor_viejo = valor_nuevo
  202. if area == 0 and point[1]>=120 and point <= 170:
  203. entrada = False
  204. salida = False
  205. cv2.imshow("M", self.frame)
Add Comment
Please, Sign In to add comment