opencv|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 npimg = 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_windowimg2 = cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)cv2.waitKey(0) cv2.destroyAllWindows()

效果演示
  • 下面的图片迭代次数为9
opencv|Mean Shift算法查找物体(Python)
文章图片

opencv|Mean Shift算法查找物体(Python)
文章图片

参考:
【opencv|Mean Shift算法查找物体(Python)】http://docs.opencv.org/3.2.0/db/df8/tutorial_py_meanshift.html

    推荐阅读