Respostas no Fórum

Visualizando 9 posts - 106 até 114 (de 114 do total)
  • Autor
    Posts
  • em resposta a: intalção do OpenCV 3.4.4.19 #29967
    Dalton Vargas
    Moderador

      Legal! Que bom que deu certo!

      em resposta a: intalção do OpenCV 3.4.4.19 #29952
      Dalton Vargas
      Moderador

        Olá Breno!

        Ah sim, as vezes ocorre este erro. Você tentar com outras versões do OpenCV realizando um pequeno ajusto no código, na parte onde criamos os trackers, acessando cada um deles através do legacy. Segue abaixo:

        Ajustar disso:

        if tracker_type == 'BOOSTING':
              tracker = cv2.TrackerBoosting_create()

        Para isso:

        if tracker_type == 'BOOSTING':
              tracker = cv2.legacy.TrackerBoosting_create()

        Conforme a imagem abaixo, apenas o rastreador Goturn não está disponível no legacy, todos os demais estão. Lembrando que o GOTURN é o único rastreador baseado em aprendizado profundo incluído no OpenCV. Requer arquivos de modelo adicionais para ser executado (goturn.caffemodel e goturn.prototxt).

        legacy

        • Esta resposta foi modificada 3 anos, 8 meses atrás por Dalton Vargas.
        em resposta a: Erro ao detectar mãos para cima #22194
        Dalton Vargas
        Moderador

          Olá LpCoutinho!

          Este erro ocorre quando tentamos comparar um valor com nenhum valor (None).

          Para corrigir, ao invés de adicionar None na lista de pontos quando o ponto chave detectado não corresponde ao valor mínimo de confiança, pode substituir por (0,0) , ou seja, passamos o valor da posição do ponto sendo em 0 (zero) na horizontal e 0(zero) na vertical.

          Segue abaixo o ajuste:

          Na linha onde adicionamos os pontos chave a lista de pontos, na condição  else mudar para:

          else:
              pontos.append((0, 0)) 
          
          '''Depois de ajustado, fica assim:'''
          

          Despois de ajustado, fica assim:

          Fatos interessantes

          None não é o mesmo que False.

          None não é 0(zero).

          None não está vazio string.

          Comparando None com qualquer coisa sempre retornará False, exceto quando comparamos None a ele mesmo.

           

          Ah, também segue o link de acesso ao Colab: https://colab.research.google.com/drive/1Zsi5-8TQsNjm5hKAWBFyabTZ8yWYkCrS#scrollTo=SLAptHZtSeYA

           

          Espero ter ajudado, permaneço a disposição!

          • Esta resposta foi modificada 4 anos, 5 meses atrás por Dalton Vargas.
          • Esta resposta foi modificada 4 anos, 5 meses atrás por Dalton Vargas.
          em resposta a: Como treinar um modelo? #22191
          Dalton Vargas
          Moderador

            Olá LpCoutinho!

            Nos links abaixo você encontra os artigos completos dos autores de cada modelo, explicando detalhadamente como foram criados:

            Hand Keypoint Detection in Single Images using Multiview Bootstrapping

            Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗

            Neste curso trazemos apenas uma introdução básica sobre a arquitetura de redes neurais convolucionais, utilizadas pelos autores dos artigos acima na criação dos modelos (Seção 2 – Teoria básica). Os autores disponibilizam os modelos pré-treinados neste link: https://github.com/CMU-Perceptual-Computing-Lab/openpose/tree/master/models. Sugiro iniciar sua pesquisa focando em redes neurais convolucionais, para entender bem como funcionam e implementar seus próprios modelos.

            Também seguem os links do dataset utilizados para treinamento de cada um dos modelos:

            MPII Human Pose Dataset

            COCO 2020 Keypoint Detection Task

             

            Espero ter ajudado, fico a disposição!

            Att,

            Dalton

             

            em resposta a: Sincronização de video com OpenCV #20649
            Dalton Vargas
            Moderador

              Olá Benjamim!

              O Opencv usa o FPS do próprio arquivo de vídeo (get (CAP_PROP_FPS) ou get (CV_CAP_PROP_FPS), porém para webcans e algumas outras câmeras é preciso calcular manualmente o FPS.

              Segue o link de um artigo com a explicação mais detalhada de como isto funciona e como calcular manualmente o FPS com o Opencv: How to find frame rate or frames per second (fps) in OpenCV ( Python / C++ ): https://www.learnopencv.com/how-to-find-frame-rate-or-frames-per-second-fps-in-opencv-python-cpp/

               

              Att,

              Dalton Luiz Vargas

               

              em resposta a: Rotação/Inclinação do objeto #19260
              Dalton Vargas
              Moderador

                Olá Grace!

                O algoritmo CAMshift retorna a localização de 4 pontos nas posições x e y do objeto rastreado para desenhar a box adaptativa, então basicamente você precisa destes valores para determinar a rotação do objeto, fazendo uma comparação das posições entre os pontos do retângulo para determinar a rotação.

                Por exemplo, analisando a imagem abaixo, se os pontos A e D do retângulo estiverem em uma posição mais acima no eixo y do que os pontos C e B no eixo y, então significa que o objeto girou no sentido horário.

                exemplo

                Também sobre o deslocamento do objeto, a ideia é exatamente como você mencionou acima, pode usar o tamanho do objeto para calcular o deslocamento, ou seja, a proporção do objeto é definida como a proporção da largura da caixa delimitadora e a altura da caixa delimitadora: proporção = largura / altura.

                Separei alguns artigos que podem lhe ajudar, são métodos diferentes dos explicados no curso, mas com soluções específicas para trabalhar com rotação no opencv:

                Geometric Transformations of Images: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_geometric_transformations/py_geometric_transformations.html

                Affine Transformations: https://docs.opencv.org/3.4/d4/d61/tutorial_warp_affine.html

                OpenCV Track Object Movement: https://www.pyimagesearch.com/2015/09/21/opencv-track-object-movement/

                 

                Espero ter ajudado, fico a disposição

                • Esta resposta foi modificada 4 anos, 8 meses atrás por Dalton Vargas.
                • Esta resposta foi modificada 4 anos, 8 meses atrás por Dalton Vargas.
                em resposta a: Detecção ao entrar no ROI #19226
                Dalton Vargas
                Moderador

                  Sim, na verdade é possível fazer as duas coisas que você mencionou.

                  • A resposta anterior é sobre inicializar o rastreamento passando uma posição pré-definida, sem precisar selecionar com o mouse, conforme você havia questionado;
                  • Sobre especificar a ROI para “executar alguma ação caso algum objeto entre nela”, por exemplo, usar a detecção de uma pessoa somente em determinada área do vídeo, funciona assim:
                    • Dentro da estrutura de repetição while, após inicializar a captura do vídeo (ret, frame = cap.read()), você pode definir a ROI assim:
                      • roi = frame[100:300, 400:600]
                    • Também pode desenhar um retângulo para marcar as posições da ROI:
                      • cv2.rectangle(frame, (400, 100), (600, 300), (158, 158, 158), 1)
                    • Ai é só passar a variável roi como parâmetro para o detector de objetos, segue exemplo:
                      • deteccao = fullbody_cascade.detectMultiScale(roi, 1.08, 1, minSize=(80,80))
                  • Esta resposta foi modificada 4 anos, 8 meses atrás por Dalton Vargas.
                  em resposta a: Detecção ao entrar no ROI #19181
                  Dalton Vargas
                  Moderador

                    Olá Guilherme!

                    Sim, você pode deixar o ROI estático, apenas inicializando a variável bbox nas posições de x, y, l, a da área de interesse na imagem que você definiu.

                    Segue exemplo:

                    bbox = (287, 23, 86, 320)

                    Espero ter ajudado, fico a disposição!

                    em resposta a: Resultado final do rastreamento #18458
                    Dalton Vargas
                    Moderador

                      Olá Michael!

                      Funciona assim:

                      • existe a classe VideoWriter no opencv, trabalhamos com 4 parâmetros;
                        • o primeiro parâmetro é uma string com o nome do vídeo de saída, ‘resultado.avi’ por exemplo;
                        • o segundo parâmetro é o cv2.VideoWriter_fourcc, onde especificamos o codec para compactar os quadros do vídeo: (‘P’, ‘I’, ‘M’, ‘1’) é um codec MPEG-1, (‘M’, ‘J’, ‘P’, ‘G ‘) é um codec motion-jpeg, etc. Neste link tem a lista de codecs que você pode usar: http://www.fourcc.org/codecs.php
                        • o terceiro parâmetro é a taxa de quadros do fluxo de vídeo criado (FPS);
                        • e o quarto parâmetro é a resolução do vídeo. Aqui pegamos as dimensões do vídeo de entrada, armazenamos em duas variáveis para usar neste parâmetro;

                      No código fica assim:

                      • crie uma variável para armazenar o caminho onde o vídeo será armazenado e dê um nome para este vídeo. Este é o primeiro parâmetro, conforme descrito acima:
                        • resultado = “resultados/optical flow sparse.mp4”
                          • resultados: é o nome da pasta onde vai salvar o vídeo
                          • optical flow sparse.mp4: é o nome do vídeo
                      • crie outra variável para armazenar a classe cv2.VideoWriter, especificando os quatro parâmetros:
                        • gravarVideo = cv2.VideoWriter(resultado, cv2.VideoWriter_fourcc(‘m’,’p’,’4′,’v’), 60, (pri_frame.shape[1], pri_frame.shape[0]))
                          • resultado: é a variável que criamos no tópico anterior
                          • cv2.VideoWriter_fourcc(‘m’,’p’,’4′,’v’): codec para compactar os quadros do vídeo
                          • 60: é o FPS
                          • pri_frame.shape[1], pri_frame.shape[0]: são as dimensões do vídeo de entrada. Exemplo: 640×480
                            • pri_frame é o primeiro frame do vídeo, desta parte do código: ret, pri_frame = cap.read()
                      • para gravar o vídeo, <span style=”text-decoration: underline;”>dentro da estrutura de repetição while, na última linha de código desta estrutura</span>, insira a variável gravarVídeo.write(frame) passando como parâmetro o vídeo de resultado, com bouding box.
                      • e por fim, gravarVideo.release() fora do while, para fechar o arquivo.

                      Espero ter ajudado, fico a disposição

                       

                      AttE

                      Dalton

                       

                    Visualizando 9 posts - 106 até 114 (de 114 do total)