Transformar “máscara” em vídeo

Home Fóruns Fórum Rastreamento de Objetos com Python e OpenCV Transformar “máscara” em vídeo

Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #33632
    PH1005
    Participante

      Boa tarde , me chamo Pedro Henrique, sou assinante da IA Expert (inclusive, gostaria de comentar que o curso é excelente), venho por meio deste fórum perguntar se alguém poderia me auxiliar com uma dúvida. No caso, estou tentando mesclar codificações das aulas de detecção de movimento e de rastreamento de objetos, utilizando python e openCV. Bom , minha dúvida é o seguinte, queria saber se é possível aplicar os parâmetros de shitomasi e lucas kanade em uma máscara retirada de um algoritmo de subtração de background, já estou tentando fazer essa junção, porém não consigo fazer com que o algoritmo shitomasi-kanade “leia” a máscara obtida como um vídeo.

      cap = cv2.VideoCapture("result")

      (sendo “result” a máscara do algoritmo de subtração)

      Para um entendimento mais fácil da situação, estou enviando o código.

      import numpy as np
      import cv2
      import sys
      
      ##################################################################################
      
      # Escolha do Vídeo
      VIDEO_SOURCE = "videos/Video_5.mp4"
      
      #Definindo as variáveis de cor/fonte
      
      TEXT_COLOR = (0, 255, 0)
      TRACKER_COLOR = (255, 0, 0)
      FONT = cv2.FONT_HERSHEY_SIMPLEX
      
      # Escolha do Background
      BGS_TYPES = ["MOG2", "KNN"]
      BGS_TYPE = BGS_TYPES[1]
      
      ##################################################################################
      
      # Escolha do Kernel
      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
      
      ##################################################################################
      
      # Criação dos Filtros
      def getFilter(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):
      if BGS_TYPE == "MOG2":
      return cv2.createBackgroundSubtractorMOG2()
      if BGS_TYPE == "KNN":
      return cv2.createBackgroundSubtractorKNN()
      print("Detector inválido")
      sys.exit(1)
      
      cap = cv2.VideoCapture(VIDEO_SOURCE)
      bg_subtractor = getBGSubtractor(BGS_TYPE)
      minArea = 150
      
      ##################################################################################
      
      # Configuração dos parametros Shitomasi e Lucas Kanade
      def SK(result):
      cap = cv2.VideoCapture("result")
      parameters_shitomasi = dict(maxCorners=100, # máx de nós
      qualityLevel=0.05, # aumenta pra achar mais e diminui pra achar menos
      minDistance=30) # distancia entre pontos
      parameters_lucas_kanade = dict(winSize=(15, 15),
      maxLevel=2,
      criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.05))
      colors = np.random.randint(0, 255, (100, 3))
      
      ret, frameSK = cap.read()
      frame_gray_init = cv2.cvtColor(frameSK, cv2.COLOR_BGR2GRAY)
      
      edges = cv2.goodFeaturesToTrack(frame_gray_init, mask=None, **parameters_shitomasi)
      # print(edges) #localização dos pontos inicias marcados
      print(len(edges)) # contagem de pontos indentificados
      
      maskSK = np.zeros_like(frameSK)
      # print(maskSK)
      # print(np.shape(maskSK)) #dimensão do vídeo
      
      while True:
      ret, frameSK = cap.read()
      frame_gray = cv2.cvtColor(frameSK, 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()
      
      a, b, c, d = int(a), int(b), int(c), int(d)
      
      maskSK = cv2.line(maskSK, (a, b), (c, d), colors[i].tolist(), 2)
      
      frameSK = cv2.circle(frameSK, (a, b), 5, colors[i].tolist(), -1)
      
      img = cv2.add(frameSK, maskSK)
      
      cv2.imshow('Optical flow', img)
      # cv2.imshow('maskSK',maskSK)
      # cv2.imshow('frameSK',frameSK)
      if cv2.waitKey(1) == 13:
      break
      
      frame_gray_init = frame_gray.copy()
      edges = news.reshape(-1, 1, 2)
      
      cv2.destroyAllWindows()
      cap.release()
      
      
      ##################################################################################
      
      def main():
      while (cap.isOpened):
      
      ok,frameBG = cap.read()
      if not ok:
      print("ERRO")
      break
      
      frameBG = cv2.resize(frameBG, (0,0), fx=0.50, fy=0.50)
      
      bg_mask = bg_subtractor.apply(frameBG)
      bg_mask = getFilter(bg_mask,'combine')
      bg_mask = cv2.medianBlur(bg_mask, 5)
      
      ####################################################################################################
      
      # Aplicação dos contornos
      (contours, hierarchy) = cv2.findContours(bg_mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
      
      for cnt in contours:
      area = cv2.contourArea(cnt)
      if area>= minArea:
      x,y,w,h = cv2.boundingRect(cnt)
      cv2.drawContours(frameBG, [cnt], -1, TRACKER_COLOR, 2)
      cv2.drawContours(frameBG, [cnt], -1, (255, 255, 255), 1)
      
      ####################################################################################################
      
      result = cv2.bitwise_and(frameBG,frameBG,mask=bg_mask)
      #cv2.imshow('frameBG', frameBG)
      #cv2.imshow('Mask', result)
      
      ####################################################################################################
      
      # Aplicação dos parametros shitomasi e kanade
      SK(result)
      ####################################################################################################
      
      # Configuração da tecla de saída
      #if cv2.waitKey(1) & 0xFF == ord("q"):
      # break
      if cv2.waitKey(1) == 13:
      break
      
      # Liberação das janelas de vídeo
      cv2.destroyAllWindows()
      cap.release()
      
      # Acionamento do main()
      main()
      
      
      
      
      #33635
      Dalton Vargas
      Moderador

        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.

        #33636
        Dalton Vargas
        Moderador
          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()
          • Esta resposta foi modificada 2 anos, 1 mês atrás por Dalton Vargas.
          #33678
          PH1005
          Participante

            Olá Dalton, com o seu algoritmo consegui avançar um pouco, consigo até visualizar a tela preta com as linhas formadas, porém a janela trava e não consigo rodar o vídeo, acabei obtendo outro problema que foge do meu conhecimento, normalmente eu pesquiso mas não entendi oque realmente é esse erro. No caso o erro é o seguinte:

            Traceback (most recent call last):
            File “C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2800.0_x64__qbz5n2kfra8p0\lib\code.py”, line 90, in runcode
            exec(code, self.locals)
            File “<input>”, line 1, in <module>
            File “C:\Program Files\JetBrains\PyCharm 2021.3.1\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py”, line 198, in runfile
            pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
            File “C:\Program Files\JetBrains\PyCharm 2021.3.1\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py”, line 18, in execfile
            exec(compile(contents+”\n”, file, ‘exec’), glob, loc)
            File “C:/Users/pedro/PycharmProjects/pythonProject1/TESTE IA.py”, line 132, in <module>
            SubtractorTracker()
            File “C:/Users/pedro/PycharmProjects/pythonProject1/TESTE IA.py”, line 109, in SubtractorTracker
            news = new_edges[status == 1]
            TypeError: ‘NoneType’ object is not subscriptable

            Desculpe ficar pedindo ajuda, mas se puder me auxiliar, ficarei muito agradecido.

            #33690
            Dalton Vargas
            Moderador

              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.

               

              • Esta resposta foi modificada 2 anos, 1 mês atrás por Dalton Vargas.
              #33706
              PH1005
              Participante

                Oi Dalton, consigo sim.

                import numpy as np
                import cv2
                import sys
                from random import randint
                
                ##################################################################################
                
                # Escolha do Vídeo
                VIDEO_SOURCE = "videos/Video_5.mp4"
                
                #Definindo as variáveis de cor/fonte aleatoriamente (R,G,B)
                
                TEXT_COLOR = (randint(0, 255), randint(0,255),randint(0,255))
                TRACKER_COLOR = (randint(0, 255), randint(0,255),randint(0,255))
                FONT = cv2.FONT_HERSHEY_SIMPLEX
                
                # Escolha do Background
                BGS_TYPES = ["MOG2", "KNN"]
                BGS_TYPE = BGS_TYPES[1]
                
                ##################################################################################
                
                # Escolha do Kernel
                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
                
                ##################################################################################
                
                # Criação dos Filtros
                def getFilter(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):
                if BGS_TYPE == "MOG2":
                return cv2.createBackgroundSubtractorMOG2()
                if BGS_TYPE == "KNN":
                return cv2.createBackgroundSubtractorKNN()
                print("Detector inválido")
                sys.exit(1)
                
                ##################################################################################
                
                # Carregando o vídeo
                cap = cv2.VideoCapture(VIDEO_SOURCE)
                bg_subtractor = getBGSubtractor(BGS_TYPE)
                minArea = 150
                
                ##################################################################################
                
                # Configuração dos parametros Shitomasi e Lucas Kanade
                def SK():
                parameters_shitomasi = dict(maxCorners=100, # máx de nós
                qualityLevel=0.05, # aumenta pra achar mais e diminui pra achar menos
                minDistance=30) # distancia entre pontos
                parameters_lucas_kanade = dict(winSize=(15, 15),
                maxLevel=2,
                criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.05))
                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)
                # print(edges) #localização dos pontos inicias marcados
                print(len(edges)) # contagem de pontos indentificados
                # print(mask)
                # print(np.shape(mask)) #dimensão do vídeo
                
                while (cap.isOpened):
                ok, frame = cap.read()
                
                if not ok:
                print("ERRO...")
                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()
                
                a, b, c, d = int(a), int(b), int(c), int(d)
                
                mask = cv2.line(mask, (a, b), (c, d), colors[i].tolist(), 2)
                
                frame = cv2.circle(frame, (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)
                
                cv2.destroyAllWindows()
                cap.release()
                
                # Acionamento do main()
                
                SK()
                
                ##################################################################################
                
                
                ERRO: 
                
                Traceback (most recent call last):
                File "C:\Users\Pedro Henrique\PycharmProjects\IC\main.py", line 137, in <module>
                SK()
                File "C:\Users\Pedro Henrique\PycharmProjects\IC\main.py", line 109, in SK
                news = new_edges[status == 1]
                TypeError: 'NoneType' object is not subscriptable

                 

                #33715
                Dalton Vargas
                Moderador

                  Opa!

                  Fiz a correção e teste com seu script, segue o link de um vídeo de demontração:

                  Demonstração

                  Na próxima mensagem vou postar o script.

                   

                  #33716
                  Dalton Vargas
                  Moderador
                    import numpy as np
                    import cv2
                    import sys
                    from random import randint
                    
                    ##################################################################################
                    
                    # Escolha do Vídeo
                    VIDEO_SOURCE = "videos/persons.mp4"
                    
                    #Definindo as variáveis de cor/fonte aleatoriamente (R,G,B)
                    
                    TEXT_COLOR = (randint(0, 255), randint(0,255),randint(0,255))
                    TRACKER_COLOR = (randint(0, 255), randint(0,255),randint(0,255))
                    FONT = cv2.FONT_HERSHEY_SIMPLEX
                    
                    # Escolha do Background
                    BGS_TYPES = ["MOG2", "KNN"]
                    BGS_TYPE = BGS_TYPES[1]
                    
                    ##################################################################################
                    
                    # Escolha do Kernel
                    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
                    
                    ##################################################################################
                    
                    # Criação dos Filtros
                    def getFilter(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):
                        if BGS_TYPE == "MOG2":
                            return cv2.createBackgroundSubtractorMOG2()
                        if BGS_TYPE == "KNN":
                            return cv2.createBackgroundSubtractorKNN()
                        print("Detector inválido")
                        sys.exit(1)
                    
                    ##################################################################################
                    
                    # Carregando o vídeo
                    cap = cv2.VideoCapture(VIDEO_SOURCE)
                    bg_subtractor = getBGSubtractor(BGS_TYPE)
                    minArea = 150
                    
                    ##################################################################################
                    
                    # Configuração dos parametros Shitomasi e Lucas Kanade
                    def SK():
                        parameters_shitomasi = dict(maxCorners=100, # máx de nós
                        qualityLevel=0.05, # aumenta pra achar mais e diminui pra achar menos
                        minDistance=30) # distancia entre pontos
                        parameters_lucas_kanade = dict(winSize=(15, 15),
                        maxLevel=2,
                        criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.05))
                        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)
                    # print(edges) #localização dos pontos inicias marcados
                        # print(len(edges)) # contagem de pontos indentificados
                    # print(mask)
                    # print(np.shape(mask)) #dimensão do vídeo
                    
                        while (cap.isOpened):
                            ok, frame = cap.read()
                    
                            if not ok:
                                print("ERRO...")
                                break
                    
                            bg_mask = bg_subtractor.apply(frame)
                            fg_mask = getFilter(bg_mask, 'combine')
                    
                            result = cv2.bitwise_and(frame, frame, mask=fg_mask)
                    
                            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()
                    
                                # Não entendi esta parte
                                # a, b, c, d = int(a), int(b), int(c), int(d)
                    
                                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)
                    
                    # Acionamento do main()
                    SK()
                    #33717
                    PH1005
                    Participante

                      Olá Dalton, vi seu vídeo e de fato está rodando, mas no meu vídeo teste eu não consigo rodar esse código, fico com o mesmo erro que mandei anteriormente. Vou mandar meu vídeo para ver se você consegue encontrar o problema, o algoritmo é o mesmo que você mandou.

                      https://drive.google.com/file/d/1WXv7sMaxNtVae3rQkQfoc4gn7amuIFGR/view?usp=sharing

                      Ah, e a linha que eu passo as variáveis para inteiros foi só uma passagem porque anteriormente estava dando erro também, acho que para o vídeo que estou usando existem alguns problemas e não tô sabendo resolver. Vou mandar o Erro de novo também.

                      Traceback (most recent call last):
                      File “C:\Users\Pedro Henrique\PycharmProjects\IC\teste1.py”, line 131, in <module>
                      SK()
                      File “C:\Users\Pedro Henrique\PycharmProjects\IC\teste1.py”, line 107, in SK
                      news = new_edges[status == 1]
                      TypeError: ‘NoneType’ object is not subscriptable

                      Process finished with exit code 1

                      #33814
                      Dalton Vargas
                      Moderador

                        Olá Pedro!

                        Fiz o teste aplicando somente o Optical Flow e parece que devido aos insetos estarem desfocados desde o início do vídeo, o algoritmo não consegue indetificar os contornos/arestas. Já nos objetos que estão mais nítidos (marca da câmera, tempo de vídeo, camisa branca ao fundo) ele consegue identificar. Segue o vídeo .

                        Minha sugestão seria gravar um vídeo mais focado nos insetos (se estes forem o objetivo).

                        Também se puder compartilhar a ideia do projeto, assim podemos pensar em mais soluções. Caso não queira compartilhar aqui no fórum, pode mandar no meu e-mail: daltonluizvargas@hotmail.com

                        • Esta resposta foi modificada 2 anos, 1 mês atrás por Dalton Vargas.
                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.