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 进行对象跟踪有两个主要缺点。
- 无论物体与相机的距离如何,跟踪窗口的大小都保持不变。
- 仅当对象位于该对象的区域内时,窗口才会跟踪该对象。所以我们必须仔细硬编码我们窗口的位置。