OpenCV41:Meanshif和Camshift
学习目标
在本章中,将学习
- 用于跟踪视频中对象的Meanshift和Camshift算法
Meanshift
Meanshift背后的原理很简单,假设有点的集合(它可以是像素分布,例如直方图反投影)。
给定一个小窗口(可能是一个圆形),必须将该窗口移动到最大像素密度(或最大点数)的区域。如下图所示:
初始窗口以蓝色圆圈显示,名称为“C1”。其原始中心以蓝色矩形标记,名称为“C1_o”。但是,如果找到该窗口内点的质心,则会得到点“C1_r”(标记为蓝色小圆圈),它是窗口的真实质心。当然,二者是不匹配的。因此,移动窗口使新窗口的圆与上一个质心匹配。再次找到新的质心。很可能不会匹配。因此,再次移动它,并继续迭代,以使窗口的中心及其质心落在同一位置(或在很小的期望误差内)。因此,最终获得的是一个具有最大像素分布的窗口。它带有一个绿色圆
圈,名为“C2”。正如您在图像中看到的,它具有最大的点数。整个过程在下面的静态图像上演示:
因此,通常会传递直方图反投影图像和初始目标位置。当对象移动时,显然该移动会反映在直方图反投影图像中。因此,Meanshift算法就是将窗口移动到最大密度的新位置的算法。
重心计算公式:xc,ycx_c, y_cxc,yc
OpenCV中的Meanshift
要在OpenCV中使用Meanshift,首先需要设置目标,找到其直方图,以便可以将目标反投影到每帧上以计算均值偏移。我们还需要提供窗口的初始位置。对于直方图,此处仅考虑色相(Hue)。另外,为避免由于光线不足而产生错误的值,可以使用cv2.inRange()
函数丢弃光线不足的值。
使用的视频中的三帧如下:
import cv2
import numpy as npvideo_file = 'slow_traffic_small.mp4'
cap = cv2.VideoCapture(video_file)# take first frame of the video
ret, frame = cap.read()# setup initial location of window
x, y, w, h = 300, 200, 100, 50 # simply hardcoded the values
track_window = (x, y, w, h)# setup the roi for tracking
roi = frame[y:y+h, x:x+w]hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv_roi, np.array((0., 60.,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)# setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = (cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT, 10, 1)
while True:ret, frame = cap.read()if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# apply meansift to get the new locationret, track_window = cv2.meanShift(dst, track_window, term_crit)# draw it on imagex, y, w, h = track_windowimg2 = cv2.rectangle(frame, (x, y), (x+w, y+h), 255, 2)cv2.imshow('img2', img2)cv2.waitKey(0)else:cv2.destroyAllWindows()break
Camshift
从上面的结果可以看到,这儿存在一个问题。无论汽车离相机很近或非常近,窗口始终具有相同的大小。这是不好的。需要根据目标的大小和旋转来调整窗口大小。该解决方案来自“ OpenCV Labs”,由Gary Bradsky提出的CAMshift (Continuously Adaptive Meanshift) (Gary Bradsky)算法,论文题目《Computer Vision Face Tracking for Use in a Perceptual User Interface》。
它首先应用Meanshift,一旦Meanshift收敛,它将更新窗口的大小为w=2×M00256w = 2 \times \sqrt{\frac{M_{00}}{256}}w=2×256M00, h=1.2×wh=1.2\times wh=1.2×w 。它还可以计算出最合适的椭圆的方向。再次将均值偏移应用于新的缩放搜索窗口和先前的窗口位置。该过程一直持续到达到要求的精度为止。
OpenCV中的Camshift
它与Meanshift相似,但是返回一个旋转的矩形和box参数(用于在下一次迭代中作为搜索窗口传递)。
import cv2
import numpy as npvideo_file = 'slow_traffic_small.mp4'
cap = cv2.VideoCapture(video_file)# take first frame of the video
ret, frame = cap.read()# setup initial location of window
x, y, w, h = 300, 200, 100, 50 # simply hardcoded the values
track_window = (x, y, w, h)# setup the roi for tracking
roi = frame[y:y+h, x:x+w]hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv_roi, np.array((0., 60.,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)# setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = (cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT, 10, 1)
while True:ret, frame = cap.read()if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# apply meansift to get the new locationret, track_window = cv2.CamShift(dst, track_window, term_crit)# draw it on imagepts = cv2.boxPoints(ret) # find four points of the boxpts = np.int0(pts)img2 = cv2.polylines(frame, [pts], True, 255, 2)cv2.imshow('img2', img2)cv2.waitKey(0)else:cv2.destroyAllWindows()break
三帧的结果如下:
附加资源
- French Wikipedia page on Camshift
- Bradski, G.R., “Real time face and object tracking as a component of a perceptual user interface,” Applications of Computer Vision, 1998. WACV '98. Proceedings., Fourth IEEE Workshop on , vol., no., pp.214,219, 19-21 Oct 1998
OpenCV41:Meanshif和Camshift相关推荐
- 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象
使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...
- 目标跟踪之camshift---opencv中meanshift和camshift例子的应用
在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...
- OpenCV camshift目标追踪
camshift算法是对meanshift算法的改进,首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口. c ...
- OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc
OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...
- 有关camshift的知识点
目录(?)[-] OpenCV实现的mean shift filteringsegmentation解析 1 Meanshift推导 2meanshift在图像上的聚类 Camshift算法原理及其O ...
- 目标跟踪:CamShift算法
1.前言 camshift利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的中心位置. ...
- OpenCV camshift算法的实例(附完整代码)
OpenCV camshift算法的实例 OpenCV camshift算法的实例 OpenCV camshift算法的实例 #include <iostream> #include &l ...
- OpenCV均值移位(Meanshift)和Camshift算法
OpenCV Meanshift和Camshift算法 Meanshift和Camshift算法 目标 均值漂移Meanshift OpenCV中的Meanshift Camshift OpenCV中 ...
- Mean Shift算法(CamShift)
转自http://hi.baidu.com/www_djh/blog/item/6ff6c063b060d454eaf8f85e.html /***************************** ...
- 图像处理理论(八)——Meanshift, Camshift, Optical flow
Meanshift Meanshift聚类 Meanshift(均值漂移)首先是个聚类算法,然后才应用到目标跟踪领域.它是Keinosuke Fukunaga和Larry D. Hostetler于1 ...
最新文章
- ue4商城素材 Cyberpunk City / Recife Environment 赛博朋克城市场景
- 程序员远程办公_如何从办公室变成远程程序员
- 源文件的编码会对编译结果有影响
- 工程师男友如何反窃听?趣聊密码学入门科普
- 每天一道LeetCode-----回文链表
- 影响用户体验的4个因素
- 矩阵快速幂及斐波那契数列模板
- linux设备驱动开发专业论坛www.linuxdriver.cn诚征斑竹
- Python3安装openpyxl
- 计算机一级要下什么软件练习,国家计算机一级MS OFFICE练习软件
- HTML背景图片的设置
- html tooltips效果,CSS3+jQuery轻松实现工具提示(Tooltips)
- 使用 Visio 绘制卷积示意图
- Hyperopt的使用
- Frida-Dexdump 脱壳工具下载使用以及相关技术介绍
- H - Unloaded Die
- 矩阵求导解最小二乘问题
- 证券基础--股票发行上市
- Android 11 WiFi开启流程
- GOJS入门三-如何设置节点间的连线
热门文章
- (完整版)环境工程学复习资料资料
- python 下载股票数据_「Python量化资料」用Python抓取Yahoo、investing平台股票数据
- Hyperion神器之SmartView产品(中篇)
- 微软surface屏幕测试软件,Soomal作品 - Microsoft 微软 Surface Book 笔记本电脑屏幕测评报告和色彩校正 [Soomal]...
- Eclipse汉化教程
- CSDN VIP 常见问题解答
- 计算机java二级_关于Java计算机二级考试内容。
- c语言实现统计过程控制,SPC统计过程控制的课程
- 如何翻滚截屏_怎么进行滚动截屏
- arcgis之建模实现矢量图层批量按属性分割导出Kmz文件