Mean Shift算法查找物体(Python)

基本原理

Mean Shift算法是通过多次迭代移动获得图片中最大概率的位置。
一般都是采用色调(H)直方图作为作为算法的输入,所以需要将opencv的BGR图片转为HSV格式。并且还需要去除低饱和度对运算结果的影响。

opencv函数

  • meanShift函数原型
def meanShift(probImage, window, criteria)
# 第一个参数为输入直方图
# 第二个参数为需要移动的矩形(ROI)
# 第三个参数为迭代终止条件
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
# 这就是迭代终止条件
# 第一参数是迭代终止类型,有COUNT和EPS,COUT|EPS。COUT是指达到最大迭代次数停止,EPS是指达到指定收敛阈值后停止
# 第二个参数是指定最大迭代次数
# 第三个参数是指定收敛阈值

上代码

import cv2
import numpy as np

img = cv2.imread('messi.jpg')
r,h,c,w=43,70,275,70
# 建立移动的矩形
track_window = (c,r,w,h)
#选取图片上刚兴趣的区域
roi = img[r:r+h, c:c+w] 
hsv_roi =  cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# 下面是去除低亮度和低饱和度,相当于一个滤波
mask = cv2.inRange(hsv_roi, np.array((0., 130.,32.)), np.array((180.,255.,255.)))
# 获取色调直方图
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
# 直方图归一化
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
cv2.imshow('roi_hist',roi_hist)
# 定义迭代终止条件
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )
# 读入目标图片
frame = cv2.imread('messi4.jpg')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 获取目标图片的反向投影直方图
dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)
# 计算得到迭代次数和矩阵位置
ret, track_window = cv2.meanShift(dst, track_window, term_crit)

x,y,w,h = track_window

img2 = cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果演示

  • 下面的图片迭代次数为9

Mean Shift算法查找物体(Python)_第1张图片
Mean Shift算法查找物体(Python)_第2张图片

参考:

http://docs.opencv.org/3.2.0/db/df8/tutorial_py_meanshift.html

你可能感兴趣的:(opencv,python,opencv,python)