예제 #1
0
    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