Forum Replies Created

Viewing 15 posts - 91 through 105 (of 114 total)
  • Author
    Posts
  • in reply to: Transformar “máscara” em vídeo #33690
    Dalton Vargas
    Moderator

      Pedro,

      poderia compartilhar o fonte completo? Assim consigo analisar e testar aqui também.

      Ah e quando for mandar o fonte, por favor não esqueça de mandar em uma mensagem separada, adicionando como bloco de código, assim o script não perde a formatação original.

       

      in reply to: Transformar “máscara” em vídeo #33636
      Dalton Vargas
      Moderator
        import numpy as np
        import cv2
        import sys
        from random import randint
        
        # Criar um vetor para gerar cores aleatoriamente (R,G,B)
        TEXT_COLOR = (randint(0, 255), randint(0, 255), randint(0, 255))
        BORDER_COLOR = (randint(0, 255), randint(0, 255), randint(0, 255))
        FONT = cv2.FONT_HERSHEY_SIMPLEX
        VIDEO_SOURCE = "videos/walking.avi"
        
        # vetor de background subtractors
        BGS_TYPES = ["GMG", "MOG", "MOG2", "KNN", "CNT"]
        
        # definir qual BGS usar, inserindo o número que corresponde ao BGS selecionado no vetor de background subtractors
        # 0 = GMG, 1 = MOG, 2 = MOG2, 3 = KNN,  4 = CNT
        BGS_TYPE = BGS_TYPES[2]
        
        # Kernel: Elemento estruturante
        def getKernel(KERNEL_TYPE):
            if KERNEL_TYPE == "dilation":
                kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
            if KERNEL_TYPE == "opening":
                kernel = np.ones((3, 3), np.uint8)
            if KERNEL_TYPE == "closing":
                kernel = np.ones((3, 3), np.uint8)
        
            return kernel
        
        # Filtros morfológicos para redução do ruído
        def getFilter(img, filter):
            '''            
                Esses filtros são escolhidos a dedo, apenas com base em testes visuais
            '''
            if filter == 'closing':
                return cv2.morphologyEx(img, cv2.MORPH_CLOSE, getKernel("closing"), iterations=2)
        
            if filter == 'opening':        
                return cv2.morphologyEx(img, cv2.MORPH_OPEN, getKernel("opening"), iterations=2)
        
            if filter == 'dilation':
                return cv2.dilate(img, getKernel("dilation"), iterations=2)
            
            if filter == 'combine':
                closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, getKernel("closing"), iterations=2)
                opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, getKernel("opening"), iterations=2)
                dilation = cv2.dilate(opening, getKernel("dilation"), iterations=2)
        
                return dilation
        
        def getBGSubtractor(BGS_TYPE):
            if BGS_TYPE == "GMG":
                return cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=.8)  
            if BGS_TYPE == "MOG": 
                return cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=.7, noiseSigma=0)
            if BGS_TYPE == "MOG2":
                return cv2.createBackgroundSubtractorMOG2(history=500, detectShadows=True, varThreshold=100)  
            if BGS_TYPE == "KNN":
                return cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)    
            if BGS_TYPE == "CNT":
                return cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15*60, isParallel=True)
            print("Unknown createBackgroundSubtractor type")
            sys.exit(1)
        
        # Carregar o video
        cap = cv2.VideoCapture(VIDEO_SOURCE)
        
        bg_subtractor = getBGSubtractor(BGS_TYPE)
        
        def SubtractorTracker():
            # Inicialização do TRACKER
            parameters_shitomasi = dict(maxCorners = 100,
                                        qualityLevel = 0.3,
                                        minDistance = 7)
            parameters_lucas_kanade = dict(winSize = (15, 15),
                                           maxLevel = 2,
                                           criteria = (cv2.TERM_CRITERIA_EPS | cv2. TERM_CRITERIA_COUNT, 10, 0.03))
            colors = np.random.randint(0,255, (100, 3))
        
            ret, frame = cap.read()
            frame_gray_init = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edges = cv2.goodFeaturesToTrack(frame_gray_init, mask = None,   **parameters_shitomasi)
            mask = np.zeros_like(frame)
        
            while (cap.isOpened):
        
                ok, frame = cap.read()
                
                if not ok:
                    print("Frame capture failed, stopping...")
                    break
        
                bg_mask = bg_subtractor.apply(frame)
                fg_mask = getFilter(bg_mask, 'combine')
        
                # Resultado da subtração de fundo
                result = cv2.bitwise_and(frame, frame, mask=fg_mask)
        
                # Passamos como parâmetro ao Tracker o resultado do BGS
                frame_gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
                new_edges, status, errors = cv2.calcOpticalFlowPyrLK(frame_gray_init, frame_gray, edges, None,           **parameters_lucas_kanade)
                news = new_edges[status == 1]
                olds = edges[status == 1]
        
                for i, (new, old) in enumerate(zip(news, olds)):
                    a, b = new.ravel()
                    c, d = old.ravel()
        
                    mask = cv2.line(mask, (a,b), (c,d), colors[i].tolist(), 2)
        
                    frame = cv2.circle(result, (a,b), 5, colors[i].tolist(), -1)
        
                img = cv2.add(result, mask)
        
                cv2.imshow('BGS + Optical flow', img)
                if cv2.waitKey(1) == 13:
                    break
        
                frame_gray_init = frame_gray.copy()
                edges = news.reshape(-1,1,2)
        
        SubtractorTracker()
        in reply to: Transformar “máscara” em vídeo #33635
        Dalton Vargas
        Moderator

          Olá Pedro!

          Parabéns pela ideia do projeto, é bem interessante!

          Pelo que entendi, a ideia é aplicar o algoritmo subtrator de fundo e depois usar o resultado para o algoritmo Optical Flow rastrear, seria isto?

          Se sim, pelos fontes que você mandou, você estava chegando lá, só faltavam ajustar os parâmetros das imagens usadas entre os dois algoritmos.

          Fiz uma implementação simples baseada nesta ideia, vou mandar na próxima resposta aqui. Provavelmente você terá que ajustar os parâmetros de cada algoritmo de acordo com seu projeto, pois deixei a parametrização padrão de cada um.

          in reply to: Erro ao executar o “bg mask” #33494
          Dalton Vargas
          Moderator

            Poderia compartilhar o erro?

            in reply to: Erro ao executar o “bg mask” #33161
            Dalton Vargas
            Moderator
              import numpy as np
              import cv2
              import sys
              from random import randint
              
              TEXT_COLOR = (randint(0, 255), randint(0,255), randint (0,255))
              BORDER_COLOR = (randint(0, 255), randint(0,255), randint (0,255))
              FONT = cv2.FONT_HERSHEY_SIMPLEX
              
              # //////////////
              # VIDEO_SOURCE =”Video/Traffic_4.mp4″
              # Correção:
              VIDEO_SOURCE = "videos/Traffic_4.mp4"
              
              #print (TEXT_COLOR)
              # /////////////////
              # BGS_TYPES = ('GMG', 'MOG', 'MOG2', 'KNN', 'CNT')
              # Correção:
              # Neste vetor de BGS deve ser em aspas duplas e não simples,
              # também estava entre parenteses e o correto é entre colchetes
              BGS_TYPES = ["GMG", "MOG", "MOG2", "KNN", "CNT"]
              
              #print(BGS_TYPES[1])
              
              def getKernel(KERNEL_TYPE):
                  if KERNEL_TYPE == "dilation":
                      kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
                  if KERNEL_TYPE == "opening":
                      kernel = np.ones((3, 3), np.uint8)
                  if KERNEL_TYPE == "closing":
                      kernel = np.ones((3, 3), np.uint8)
              
                  return kernel
              #print(getKernel('opening'))
              
              def getFiltrer(img, filter):
                  if filter == 'closing':
                      return cv2.morphologyEx(img, cv2.MORPH_CLOSE, getKernel("closing"), iterations=2)
              
                  if filter == 'opening':
                      return cv2.morphologyEx(img, cv2.MORPH_OPEN, getKernel("opening"), iterations=2)
              
                  if filter == 'dilation':
                      return cv2.dilate(img, getKernel("dilation"), iterations=2)
              
                  if filter == 'combine':
                      closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, getKernel("closing"), iterations=2)
                      opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, getKernel("opening"), iterations=2)
                      dilation = cv2.dilate(opening, getKernel("dilation"), iterations=2)
              
                      return dilation
              
              def getBGSubtractor(BGS_TYPE):
                  # Correção:
                  # deve ser em aspas duplas e não simples,
                  # if BGS_TYPE == 'GMG':
                  if BGS_TYPE == "GMG":
                      return cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames = 120, decisionThreshold=0.8)
              
                  # Correção:
                  # deve ser em aspas duplas e não simples,
                  # if BGS_TYPE == 'MOG':
                  if BGS_TYPE == "MOG":
                      return cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5,
                  backgroundRatio=0.7, noiseSigma=0)
              
                  # Correção:
                  # deve ser em aspas duplas e não simples,
                  # if BGS_TYPE == 'MOG2':
                  if BGS_TYPE == "MOG2":
                      return cv2.createBackgroundSubtractorMOG2(history=500, detectShadows=True, varThreshold=100)
              
                  # Correção:
                  # deve ser em aspas duplas e não simples,
                  # if BGS_TYPE == 'KNN':
                  if BGS_TYPE == "KNN":
                      return cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)
              
                  # Correção:
                  # deve ser em aspas duplas e não simples,
                  # if BGS_TYPE == 'CNT':
                  if BGS_TYPE == "CNT":
                      # Correção:
                      # Precisa incluir o bgsem para acessar ao BG CNT
                      # return cv2.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15*60, isParallel=True)
                      return cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15*60, isParallel=True)
              
                  print("Detector inválido")
                  sys.exit(1)
              
              cap = cv2.VideoCapture(VIDEO_SOURCE)
              bg_subtractor = getBGSubtractor(BGS_TYPES[4])
              
              def main():
                  while cap.isOpened():
                      ok, frame = cap.read()
                      #print('frame.shape')
                      if not ok:
                          print('Erro')
                          break
              
                      frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)
                      #print(frame.shape)
              
                      bg_mask = bg_subtractor.apply(frame)
                      fg_mask = getFiltrer(bg_mask, 'dilation')
              
                      cv2.imshow('Frame', frame)
                      cv2.imshow('BG mask', bg_mask)
                      cv2.imshow('BG mask filtrer ', fg_mask)
              
                      if cv2.waitKey(1) & 0xFF == ord('q'): 
                          break
                      
              main()
              in reply to: Erro ao executar o “bg mask” #33157
              Dalton Vargas
              Moderator

                Luiz,

                Fiz as correções no seu fonte e testei com todos os BGS, a princípio está tudo funcionando. Segue abaixo:

                 

                in reply to: Erro ao executar o “bg mask” #33154
                Dalton Vargas
                Moderator

                  Oi Luiz!

                  Estou analisando o código, assim que eu terminar mando aqui pra você.

                  in reply to: Erro no código “CNT’ #33147
                  Dalton Vargas
                  Moderator

                    Certo Luiz, então precisamos revisar os seus fontes 😀

                    3º Caso o erro persista, encaminhe seu script completo e também compartilhe a mensagem de erro, assim consigo analisar melhor o que pode estar acontecendo.

                    Fico no aguardo.

                    in reply to: Erro ao executar o “bg mask” #33146
                    Dalton Vargas
                    Moderator

                      Olá Luiz!

                      Normalmente o erro -215:Assertion failed ocorre quando não foi possível carregar a imagem/vídeo de entrada.

                      Poderia compartilhar o código completo? Preciso revisar todas as funções, o carregamento do vídeo, importação das bibliotecas… Este que você mandou tem só as chamadas.

                      in reply to: Erro no código “CNT’ #33134
                      Dalton Vargas
                      Moderator

                        Certo, agora se puder dar uma olhada nas outras duas sugestões que mandei na mensagem anterior:

                        2º Verifique se você fez a instalação do opencv-contrib (pip install opencv-contrib-python);

                        3º Caso o erro persista, encaminhe seu script completo e também compartilhe a mensagem de erro, assim consigo analisar melhor o que pode estar acontecendo.

                        in reply to: Erro no código “CNT’ #33132
                        Dalton Vargas
                        Moderator

                          Olá Luiz!

                          Seguem algumas sugestões para solucionar o problema:

                          1º Por favor, tente adicionar uma nova importação:

                          import bgsubcnt 
                          
                          # Depois crie o subtrator de fundo desta maneira:
                          return bgsubcnt.createBackgroundSubtractor()

                           

                          2º Verifique se você fez a instalação do opencv-contrib (pip install opencv-contrib-python);

                          3º Caso o erro persista, encaminhe seu script completo e também compartilhe a mensagem de erro, assim consigo analisar melhor o que pode estar acontecendo.

                          in reply to: Rastreamento em vídeo de alta definição #32912
                          Dalton Vargas
                          Moderator

                            Olá Roberto!

                            Poderia compartilhar seu script e (se for possível) mandar uma cópia ou link do vídeo que você está testando? Já usei este algoritmo com vídeos nesta qualidade e a princípio não tive problemas, por isso imagino que pode ser algo na codificação, talvez o rastreador não está sendo inicializado ou  atualizado para o frames subsequentes.

                            in reply to: Movimento próximo a uma determinada área #32299
                            Dalton Vargas
                            Moderator

                              Olá Paula!

                              Para detectar quando algo se move e passa por determinado local, a ideia seria a mesma daquele exemplo aqui do curso, onde fazemos a contagem de veículos:

                              • neste exemplo analisamos o movimento dos objetos na vertical, certo?
                              • o ajuste que você precisaria fazer seria nisso, usar as coordenadas na horizontal para analisar o movimento na horizontal e definir os limites da ROI (linhas de entrada e saída), assim quando o objeto se move da esquerda para a direita, ou vice-versa, e entra nestes limites, ai você configura algum tipo de notificação como você falou acima. Neste mesmo exemplo foi implementada a ideia de tirar uma foto quando o objeto é detectado dentro destes limites.

                               

                              Atenciosamente,

                              Dalton

                               

                              in reply to: Tela trava após seleção do bbox #32226
                              Dalton Vargas
                              Moderator

                                Olá Felipe!

                                Poderia compartilhar seu script completo, assim consigo analisar melhor.

                                Fico no aguardo!

                                 

                                Atenciosamente,

                                Dalton

                                in reply to: Linha .init() em versão mais nova #30702
                                Dalton Vargas
                                Moderator

                                  Olá Wagner!

                                  Poderia compartilhar o erro?

                                Viewing 15 posts - 91 through 105 (of 114 total)