📜  Python OpenCV:均值偏移

📅  最后修改于: 2022-05-13 01:55:33.936000             🧑  作者: Mango

Python OpenCV:均值偏移

OpenCV 是用于计算机视觉、机器学习和图像处理的大型开源库,现在它在实时操作中发挥着重要作用,这在当今的系统中非常重要。通过使用它,人们可以处理图像和视频以识别物体、面部,甚至是人类的笔迹。

均值偏移

meanshift背后的想法是,在 meanshift 算法中,视频的每个实例都以该帧中像素分布的形式进行检查。我们定义了一个初始窗口,通常是正方形或圆形,其位置由我们自己指定,它标识最大像素分布的区域并尝试跟踪视频中的该区域,以便在视频运行时我们的跟踪窗口也向最大像素分布区域移动。移动的方向取决于我们的跟踪窗口的中心和该窗口内所有 k 像素的质心之间的差异。
Meanshift 是一种非常有用的方法来跟踪视频中的特定对象。 Meanshift 可以分离视频的静态背景和移动的前景对象。

例子:

1.跟踪窗口正在跟踪足球。

2. 跟踪窗口正在跟踪杂耍球。

3. 追踪窗口正在追踪足球运动员。

Python3
# Python program to demonstrate
# meanshift
 
 
import numpy as np
import cv2
  
 
# read video
cap = cv2.VideoCapture('sample.mp4')
  
# retrieve the very first
# frame from the video
_, frame = cap.read()
  
# set the region for the
# tracking window p, q, r, s
# put values according to yourself
p, q, r, s = 150, 150, 460, 100
track_window = (r, p, s, q)
  
     
# create the region of interest
r_o_i = frame[p:p + q, r:r + s]
 
# converting BGR to HSV format
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
  
# apply mask on the HSV frame
mask = cv2.inRange(hsv,
                   np.array((0., 61., 33.)),
                   np.array((180., 255., 255.)))
 
# get histogram for hsv channel
roi = cv2.calcHist([hsv], [0], mask,
                   [180], [0, 180])
 
# normalize the retrieved values
cv2.normalize(roi, roi, 0, 255,
              cv2.NORM_MINMAX)
  
# termination criteria, either 15
# iteration or by at least 2 pt
termination = (cv2.TERM_CRITERIA_EPS |
               cv2.TERM_CRITERIA_COUNT
               , 15, 2 )
  
while(True):
    _, frame = cap.read()
  
    frame = cv2.resize(frame,
                       (1280, 720),
                       fx = 0,
                       fy = 0,
                       interpolation = cv2.INTER_CUBIC)
  
    # convert BGR to HSV format
    hsv = cv2.cvtColor(frame,
                       cv2.COLOR_BGR2HSV)
     
    bp = cv2.calcBackProject([hsv],
                             [0],
                             roi,
                             [0, 180],
                             1)
  
    # applying meanshift to get the new region
    _, track_window = cv2.meanShift(bp,
                                    track_window,
                                    termination)
  
    # Draw track window on the frame
    x, y, w, h = track_window
    vid = cv2.rectangle(frame, (x, y),
                        (x + w, y + h),
                        255, 2)
     
    # show results
    cv2.imshow('tracker', vid)
  
    k = cv2.waitKey(1) & 0xff
    if k == ord('q'):
        break
         
# release cap object
cap.release()
 
# destroy all opened windows
cv2.destroyAllWindows()


输出:输出视频中的一些帧



使用 meanshift 的缺点

使用 Meanshift 进行对象跟踪有两个主要缺点。

  • 无论物体与相机的距离如何,跟踪窗口的大小都保持不变。
  • 仅当对象位于该对象的区域内时,窗口才会跟踪该对象。所以我们必须仔细硬编码我们窗口的位置。