Ricardo Henriques - Ricardo Henriques: ‘É preciso se adaptar ao mundo do conhecimento desde ...
Ricardo Henriques: ‘É preciso se adaptar ao mundo do conhecimento desde ...

Tracking com KCF no OpenCV: o que eu aprendi depois de anos usando

A maior parte dos tutoriais na internet trata o detector de tracking do OpenCV de forma muito superficial. Você cria um objeto, passa uma caixa delimitadora e depois chama update() em cada frame. Parece simples até você tentar rodar em produção e perceber que os parâmetros padrão não servem para nada quando o objeto se move rápido ou sai do campo de visão. Eu comecei a trabalhar com tracking visual há uns anos atrás, quando o artigo do Ricardo Henriques sobre KCF (Kernelized Correlation Filters) ainda era referência obrigatória para qualquer pessoa que quisesse fazer tracking em tempo real. A publicação dele com Pedro Felzenszwalb em 2016 mudou o jeito como a gente pensa sobre tracking leve, porque mostrou que você pode obter boa precisão sem precisar de redes neurais pesadas rodando em cada frame.

O que procurar se quiser estudar o trabalho de ricardo henriques

Se você vai implementar algo parecido com o que ele propôs, saiba que o código original do KCF no OpenCV é uma linha, mas aconfiguração correta exige entender o que está acontecendo por baixo. O tracker usa features HOG (Histogram of Oriented Gradients) por padrão. Isso é bom para objetos com forma definida, mas péssimo para texturas repetidas ou objetos que mudam muito de escala. Quando eu precisei rastrear veículos em uma câmera de tráfego com variações grandes de distância, o KCF padrão falhava em cerca de 40% dos frames mais longos. A solução foi trocar para o MOSSE tracker, que é mais rápido mas menos preciso, ou então usar o MDNet, que é mais lento mas aguenta mudanças de escala muito melhor. Outro detalhe que ninguém mencionava nos tutoriais iniciais: o KCF assume que o objeto tem tamanho e orientação constantes dentro de uma janela fixa. Se o seu objeto gira ou muda de tamanho significativamente, o tracker perde o alvo silenciosamente. Você não recebe nenhum erro, só vê a caixa de tracking se afastando devagar do objeto até que pareça que o tracker parou de funcionar.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Eu encontrei esse problema especificamente ao rastrear pessoas em uma câmera fixa de portaria. O tracking funcionava bem quando a pessoa caminhava em linha reta de frente para a câmera, mas assim que ela virava o corpo ou passava por trás de um poste, o KCF simplesmente seguia o fundo errado. O workaround que eu apliquei foi adicionar um re-detector periódico. De 30 em 30 frames, eu chamava um detector de rosto baseado em Haar cascades para verificar se o bounding box ainda fazia sentido. Se o IoU entre a posição prevista e a posição detectada caísse abaixo de 0.5, eu resetava o tracker com a nova detecção. Esse reset periódico reduziu drasticamente as perdas de tracking e não impactou a performance porque o detector só rodava uma vez a cada meio segundo. Sobre download, o OpenCV já traz os trackers embutidos desde a versão 3.3. Você não precisa baixar nada separado. A instalação básica com os módulos extras fica assim:

pip install opencv-python — mas isso vem com apenas alguns trackers. Para ter acesso ao KCF completo, ao MOSSE, ao MDT e ao CSRT, o ideal é instalar o opencv-contrib-python, que inclui todos os algoritmos da biblioteca de tracking experimental. Um exemplo mínimo que funciona direto:

import cv2
tracker = cv2.TrackerKCF_create()
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
box = cv2.selectROI(frame, False)
tracker.init(frame, box)
while True:
  ret, frame = cap.read()
  success, box = tracker.update(frame)
  if success:
    cv2.rectangle(frame, (int(box[0]), int(box[1])), (int(box[0]+box[2]), int(box[1]+box[3])), (0, 255, 0), 2)
  else:
    print("tracking lost")
  cv2.imshow("Frame", frame)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows() Se você está fazendo algo mais sério do que um prototype rápido, considere usar oBoundingTrack ou o SiamRPN como alternativa. Eles são mais lentos mas muito mais robustos a oclusões e mudanças de escala. O KCF do OpenCV é útil para aprendizado e para cenários controlados, mas tem limitações sérias que não aparecem nos primeiros testes.