OpenCV é a enorme biblioteca de código aberto para visão computacional, machine learning e processamento de imagens e agora desempenha um papel importante na operação em tempo real, o que é muito importante nos sistemas atuais. Ao usá-lo, pode-se processar imagens e vídeos para identificar objetos, rostos ou até mesmo a escrita de um humano.

Camshift ou podemos dizer Continuously Adaptive Meanshift é uma versão aprimorada do algoritmo de meanshift que fornece mais precisão e robustez ao modelo. Com a ajuda do algoritmo Camshift, o tamanho da janela continua atualizando quando a janela de rastreamento tenta convergir. O rastreamento é feito usando as informações de cor do objeto. Além disso, fornece a janela de rastreamento mais adequada para rastreamento de objetos. Ele aplica a diferença média primeiro e depois atualiza o tamanho da janela como:

     \ [s = 2 \ vezes \ sqrt {\ frac {M_ {00}} {256}} \]

Em seguida, ele calcula a elipse que melhor se ajusta a ele e novamente aplica o desvio médio com a janela de pesquisa recém-dimensionada e a janela anterior. Este processo continua até que a precisão exigida seja alcançada.

Observação: para obter mais informações sobre meanshift, consulte Python OpenCV: Meanshift



Abaixo está a implementação.

import numpy as np 
import cv2 as cv 
  
  
cap = cv.VideoCapture('sample.mp4') 
ret, frame = cap.read() 
x, y, width, height = 400, 440, 150, 150
track_window = (x, y,  
                width, height) 
roi = frame[y:y + height, 
            x : x + width] 
hsv_roi = cv.cvtColor(roi, 
                      cv.COLOR_BGR2HSV) 
mask = cv.inRange(hsv_roi,  
                  np.array((0., 60., 32.)), 
                  np.array((180., 255., 255))) 
  
roi_hist = cv.calcHist([hsv_roi],  
                       [0], mask, 
                       [180],  
                       [0, 180]) 
  
cv.normalize(roi_hist, roi_hist, 
             0, 255, cv.NORM_MINMAX) 
  
  
term_crit = ( cv.TERM_CRITERIA_EPS |  
             cv.TERM_CRITERIA_COUNT, 15, 2) 
  
  
while(1): 
      
    ret, frame = cap.read() 
      
    
    frame = cv.resize(frame,  
                      (720, 720),  
                      fx = 0, fy = 0, 
                      interpolation = cv.INTER_CUBIC) 
      
    cv.imshow('Original', frame) 
  
    
    
    ret1, frame1 = cv.threshold(frame, 
                                180, 155, 
                                cv.THRESH_TOZERO_INV) 
  
    
    
    hsv = cv.cvtColor(frame1,  
                      cv.COLOR_BGR2HSV) 
  
    dst = cv.calcBackProject([hsv],  
                             [0],  
                             roi_hist,  
                             [0, 180], 1) 
      
    
    
    ret2, track_window = cv.CamShift(dst, 
                                     track_window, 
                                     term_crit) 
  
    
    pts = cv.boxPoints(ret2) 
      
    
    
    pts = np.int0(pts) 
  
    
    
    Result = cv.polylines(frame,  
                          [pts],  
                          True
                          (0, 255, 255),  
                          2) 
  
    cv.imshow('Camshift', Result) 
  
    
    
    k = cv.waitKey(30) & 0xff
      
    if k == 27: 
        break
          
  
cap.release() 
cv.destroyAllWindows() 

Resultado: