基本原理 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)】http://docs.opencv.org/3.2.0/db/df8/tutorial_py_meanshift.html
推荐阅读
- 机器学习|机器学习:1、线性回归--波士顿房价预测
- py|第十三届蓝桥杯大赛软件赛省赛 Python 大学 B 组
- python-pygame实现飞机大战-5-屏幕渲染绘制分数生命数超级炸弹数以及暂停功能
- #导入MD文档图片# 推荐一款阿里最新 Python 自动化开源工具!
- 如何执行Python脚本并检索Node.js中的输出(数据和错误)
- 如何使用Python检查字符串是否是回文
- 如何使用WxPython创建HTML文件查看器
- 如何在Python中创建QR Code图像或SVG
- 为什么要学习Python编程语言()