def play(self): moviment = Moviment(50, 50,100, (2 * 1000)); identify = Identify(20) identify.setMoviment(moviment) counterPoly = CounterPoly() self.config.configure(); cv2.namedWindow('frame', 2048) cv2.resizeWindow("frame", 1024, 768) if self.config.window == True: cv2.namedWindow('dilation', 2048) cv2.resizeWindow("dilation", 1024, 768) cv2.namedWindow('erosao', 2048) cv2.resizeWindow("erosao", 1024, 768) cv2.namedWindow('gauss', 2048) cv2.resizeWindow("gauss", 1024, 768) cv2.namedWindow('borda', 2048) cv2.resizeWindow("borda", 1024, 768) cv2.createTrackbar("Gauss", "gauss", self.config.medianBlur, 25, self.config.gaussCallback) cv2.createTrackbar("Vertical", "dilation", self.config.kernelVertical, 15, self.config.verticalCallback) cv2.createTrackbar("Horizontal", "dilation", self.config.kernelHorizontal, 15, self.config.horizontalCallback) cv2.createTrackbar("Dilation", "dilation", self.config.dilationInterator, 15, self.config.dilationCallback) cv2.createTrackbar("Erode", "erosao", self.config.erodeInterator, 15, self.config.erodeCallback) cv2.createTrackbar("Deslocamento Max.", "frame", self.config.deslocamentoMax, 100, self.config.velocidadeCallback) cv2.createTrackbar("Area Minima", "frame", self.config.minArea, 20000, self.config.minAreaCallback) cv2.createTrackbar("Area Maxima", "frame", self.config.maxArea, 200000, self.config.maxAreaCallback) cv2.createTrackbar("Velocidade do Video", "frame", self.config.modFrames, 15, self.config.modFramesCallback) count = 0 cframe = 0 while(True): frame = self.getFrame() if count < 15: count += 1 continue cframe += 1; if cframe % self.config.modFrames != 0: continue moviment.setFrame(frame) #pre processamento da imagem moviment.preProcess() if self.config.window == True: cv2.imshow('erosao', moviment.erosion) #Identifica os centros dos objetos identificados centers = identify.getPointsMap(self.polys) if self.polys != None: counterPoly.setCenters(centers) for poly in self.polys: try: label = Label(["%s: %s" % (poly.name, counterPoly.areas[poly.name])]) label.setFrame(frame) poly.setLabel(label) except: label = Label(["%s: %s" % (poly.name, 0)]) label.setFrame(frame) poly.setLabel(label) for poly in self.polys: poly.setFrame(frame) poly.draw() if self.channelBuffer != None: self.channelBuffer.setFrame(frame, counterPoly, centers) cv2.imshow('frame', frame) if self.config.window == True: cv2.imshow('gauss', moviment.MedianBlur) cv2.imshow('dilation', moviment.dilation) cv2.imshow('borda', moviment.erosion) k = cv2.waitKey(30) & 0xff if k == 27: break self.finish()
def getPointsMap(self, arrayPoly, frame): if self._centers == None: self._centers = self.moviment.getCenters() return None if arrayPoly == None: arrayPoly = []; arrayPoly.insert(0, polyDefault) # RECUPERA TODOS OS CENTROIDES centers = self.moviment.getCenters() for center in centers: for _center in self._centers: #calculo a distancia entre os centros do objeto h = g.distance((_center.x, _center.y), (center.x, center.y)) if Identify.deslocamentoMax > h: center.id = _center.id center.maxH = _center.maxH center.maxA = _center.maxA hasPoly = False for poly in arrayPoly: #verifico se o centro localizado esta dentro da area if poly.containsPoint(Point(center.px, center.py)): hasPoly = True #se o poligono for da classe off nao desenho o retangulo if poly.clas == "off": pass else: area = center.w * center.h if center.maxH < h: center.maxH = h if center.maxA < area: center.maxA = area texts = [("ID: %0.0f" % (center.id)), (poly.name)] label = Label(texts) label.setFrame(self.moviment.frame) center.setLabel(label) center.setPoly(poly) #Desenho dois retangulos para destacar melhor na imagem cv2.rectangle(self.moviment.frame,(center.x,center.y),(center.x+center.w,center.y+center.h),self.color,1) cv2.rectangle(self.moviment.frame,(center.x+1,center.y+1),(center.x+center.w+1,center.y+center.h+1),(255,255,255),1) if poly.clas == "line": #Se detectar algum movimento dentro da area, starta os processos de calculo self.hasLine = True #Aplico mascara para destacar apenas a area da fila mask = np.zeros(self.moviment.dilation.shape, dtype=np.uint8) #********Pegar os pontos do poligono de fila roi_corners = np.array([[(140,410), (340,400), (750,680), (200,680)]], dtype=np.int32) channel_count = self.moviment.dilation.shape[0] ignore_mask_color = (255,0,0) cv2.fillPoly(mask, roi_corners, ignore_mask_color) masked_image = cv2.bitwise_and(self.moviment.dilation, mask) (contours, a, _) = cv2.findContours(masked_image, 1, 2) M = cv2.moments(contours) self.area = M['m00'] if not hasPoly: area = center.w * center.h texts = [("ID: %0.0f" % (center.id)), ("A: %0.0f" % area), ("H: %0.0f" % h), ("Sem area")] label = Label(texts) label.setFrame(self.moviment.frame) center.setLabel(label) center.setPoly(polyDefault) cv2.rectangle(self.moviment.frame,(center.x,center.y),(center.x+center.w,center.y+center.h),self.color,1) cv2.rectangle(self.moviment.frame,(center.x+1,center.y+1),(center.x+center.w+1,center.y+center.h+1),(255,255,255),1) #Controle de fila por area if self.hasLine: #retorno se a fila esta cheia #***********Criar calculo de media print(self.area) if self.area > Identify.largeLine: print("Fila cheia") elif self.area < Identify.largeLine and self.area > Identify.mediumLine: print("Fila media") elif self.area < Identify.mediumLine: print("Fila pequena") self._centers = centers return centers