Respostas no Fórum
- AutorPosts
Legal! Que bom que deu certo!
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).
- Esta resposta foi modificada 3 anos, 8 meses atrás por
Dalton Vargas.
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:'''
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.
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:
COCO 2020 Keypoint Detection Task
Espero ter ajudado, fico a disposição!
Att,
Dalton
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
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.
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.
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))
- 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:
- Esta resposta foi modificada 4 anos, 8 meses atrás por
Dalton Vargas.
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!
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
- resultado = “resultados/optical flow sparse.mp4”
- 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()
- gravarVideo = cv2.VideoWriter(resultado, cv2.VideoWriter_fourcc(‘m’,’p’,’4′,’v’), 60, (pri_frame.shape[1], pri_frame.shape[0]))
- 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
- Esta resposta foi modificada 3 anos, 8 meses atrás por
- AutorPosts