OpenCV ist die riesige Open-Source-Bibliothek für Computer Vision, machine learning und Bildverarbeitung und spielt jetzt eine wichtige Rolle im Echtzeitbetrieb, der in heutigen Systemen sehr wichtig ist. Mit ihm kann man Bilder und Videos verarbeiten, um Objekte, Gesichter oder sogar die Handschrift eines Menschen zu identifizieren.

Camshift oder Continuously Adaptive Meanshift ist eine erweiterte Version des Meanshift-Algorithmus, die dem Modell mehr Genauigkeit und Robustheit verleiht. Mithilfe des Camshift-Algorithmus wird die Größe des Fensters ständig aktualisiert, wenn das Tracking-Fenster versucht, zu konvergieren. Die Verfolgung erfolgt anhand der Farbinformationen des Objekts. Außerdem bietet es das am besten passende Verfolgungsfenster für die Objektverfolgung. Zuerst wird die Mittelwertverschiebung angewendet und dann die Größe des Fensters wie folgt aktualisiert:

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

Anschließend wird die am besten passende Ellipse berechnet und die Mittelwertverschiebung erneut mit dem neu skalierten Suchfenster und dem vorherigen Fenster angewendet. Dieser Vorgang wird fortgesetzt, bis die erforderliche Genauigkeit erreicht ist.

Hinweis: Weitere Informationen zu Meanshift finden Sie unter Python OpenCV: Meanshift



Unten ist die Implementierung.

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() 

Ausgabe: