opencv python 多帧降噪算法_OpenCV-Python中用于视频跟踪的Meanshift和Camshift算法介绍...
学习目标
在本章中,
- 我们将学习用于跟踪视频中对象的Meanshift和Camshift算法。
Meanshift
Meanshift背后的直觉很简单,假设你有点的集合。(它可以是像素分布,例如直方图反投影)。你会得到一个小窗口(可能是一个圆形),并且必须将该窗口移到最大像素密度(或最大点数)的区域。如下图所示:
初始窗口以蓝色圆圈显示,名称为“C1”。其原始中心以蓝色矩形标记,名称为“C1o”。但是,如果找到该窗口内点的质心,则会得到点“C1r”(标记为蓝色小圆圈),它是窗口的真实质心。当然,它们不匹配。因此,移动窗口,使新窗口的圆与上一个质心匹配。再次找到新的质心。很可能不会匹配。因此,再次移动它,并继续迭代,以使窗口的中心及其质心落在同一位置(或在很小的期望误差内)。因此,最终您获得的是一个具有最大像素分布的窗口。它带有一个绿色圆圈,名为“C2”。正如您在图像中看到的,它具有最大的点数。整个过程在下面的静态图像上演示:
因此,我们通常会传递直方图反投影图像和初始目标位置。当对象移动时,显然该移动会反映在直方图反投影图像中。结果,meanshift算法将窗口移动到最大密度的新位置。
OpenCV中的Meanshift
要在OpenCV中使用meanshift,首先我们需要设置目标,找到其直方图,以便我们可以将目标反投影到每帧上以计算均值偏移。我们还需要提供窗口的初始位置。对于直方图,此处仅考虑色相。另外,为避免由于光线不足而产生错误的值,可以使用cv.inRange()函数丢弃光线不足的值。
import numpy as npimport cv2 as cvimport argparseparser = argparse.ArgumentParser(description='This sample demonstrates the meanshift algorithm. The example file can be downloaded from: https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4')parser.add_argument('image', type=str, help='path to image file')args = parser.parse_args()cap = cv.VideoCapture(args.image)# 视频的第一帧ret,frame = cap.read()# 设置窗口的初始位置x, y, w, h = 300, 200, 100, 50 # simply hardcoded the valuestrack_window = (x, y, w, h)# 设置初始ROI来追踪roi = frame[y:y+h, x:x+w]hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)# 设置终止条件,可以是10次迭代,也可以至少移动1 ptterm_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )while(1): ret, frame = cap.read() if ret == True: hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1) # 应用meanshift来获取新位置 ret, track_window = cv.meanShift(dst, track_window, term_crit) # 在图像上绘制 x,y,w,h = track_window img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2) cv.imshow('img2',img2) k = cv.waitKey(30) & 0xff if k == 27: break else: break
我使用的视频中的三帧如下:
Camshift
您是否密切关注了最后结果?这儿存在一个问题。无论汽车离相机很近或非常近,我们的窗口始终具有相同的大小。这是不好的。我们需要根据目标的大小和旋转来调整窗口大小。该解决方案再次来自“ OpenCV Labs”,它被称为Gary布拉德斯基(Gary Bradsky)在其1998年的论文“用于感知用户界面中的计算机视觉面部跟踪”中发表的CAMshift(连续自适应均值偏移)[26]。它首先应用Meanshift。一旦Meanshift收敛,它将更新窗口的大小为s = 2 times sqrt{frac{M_{00}}{256}}。它还可以计算出最合适的椭圆的方向。再次将均值偏移应用于新的缩放搜索窗口和先前的窗口位置。该过程一直持续到达到要求的精度为止。
OpenCV中的Camshift
它与meanshift相似,但是返回一个旋转的矩形(即我们的结果)和box参数(用于在下一次迭代中作为搜索窗口传递)。请参见下面的代码:
import numpy as npimport cv2 as cvimport argparseparser = argparse.ArgumentParser(description='This sample demonstrates the camshift algorithm. The example file can be downloaded from: https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4')parser.add_argument('image', type=str, help='path to image file')args = parser.parse_args()cap = cv.VideoCapture(args.image)# 获取视频第一帧ret,frame = cap.read()# 设置初始窗口x, y, w, h = 300, 200, 100, 50 # simply hardcoded the valuestrack_window = (x, y, w, h)# 设置追踪的ROI窗口roi = frame[y:y+h, x:x+w]hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)# 设置终止条件,可以是10次迭代,有可以至少移动1个像素term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )while(1): ret, frame = cap.read() if ret == True: hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1) # 应用camshift 到新位置 ret, track_window = cv.CamShift(dst, track_window, term_crit) # 在图像上画出来 pts = cv.boxPoints(ret) pts = np.int0(pts) img2 = cv.polylines(frame,[pts],True, 255,2) cv.imshow('img2',img2) k = cv.waitKey(30) & 0xff if k == 27: break else: break
三帧的结果如下
附加资源
- French Wikipedia page on Camshift:http://fr.wikipedia.org/wiki/Camshift. (The two animations are taken from there)
- 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
Exercises
- OpenCV comes with a Python :https://github.com/opencv/opencv/blob/master/samples/python/camshift.py for an interactive demo of camshift. Use it, hack it, understand it.
opencv python 多帧降噪算法_OpenCV-Python中用于视频跟踪的Meanshift和Camshift算法介绍...相关推荐
- 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象
使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...
- OpenCV均值移位(Meanshift)和Camshift算法
OpenCV Meanshift和Camshift算法 Meanshift和Camshift算法 目标 均值漂移Meanshift OpenCV中的Meanshift Camshift OpenCV中 ...
- opencv python 多帧降噪算法_防抖技术 | OpenCV实现视频稳流
在这篇文章中,我们将学习如何使用OpenCV库中的点特征匹配技术来实现一个简单的视频稳定器.我们将讨论算法并且会分享代码(python和C++版),以使用这种方法在OpenCV中设计一个简单的稳定器. ...
- opencv python 多帧降噪算法_实战 | OpenCV实现视频防抖
点击上方"计算机视觉life",选择"星标" 快速获得最新干货 本文转自OpenCV学堂 这篇文章分享了一个视频防抖的策略,这个方法同样可以应用到其他领域,比如 ...
- opencv python 多帧降噪算法_使用OpenCV和Python构建自己的车辆检测模型
介绍 我喜欢智慧城市的理念.自动智能能源系统.电网.一键接入端口的想法等等.这是一个令人着迷的概念!老实说,这是一个数据科学家的梦想,我很高兴世界上很多城市都在朝着更智能的方向发展. 智能城市的核心组 ...
- python opencv入门 Meanshift 和 Camshift 算法(40)
内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 在本章,学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体. Meanshift算法: mean ...
- python语言的取余运算符_Python 中用于整数除法取余的运算符是()_学小易找答案...
[填空题]隐球菌病多由()传播. [单选题]下列选项中,哪一个符号是管道符号. ( ) [多选题]可采用分批法计算产品成本的企业有( ) [填空题]现有字符串 s="1234567" ...
- python 获取用户的一个输入值_Python中,用于获取用户输入的命令为:
[多选题]以下关于机器学习说法正确的是? [判断题]Python内置函数sum____用来返回数值型序列中所有元素之和. [单选题]关于自定义函数的下列说法不正确的是: [判断题]Python内置函数 ...
- python数据可视化库_python和r中用于数据可视化的前9个库
python数据可视化库 In the rapidly growing world of today, when technology is expanding at a rate like neve ...
最新文章
- 邮箱自动转发攻击邮件服务器
- 计算机网络本地连接被禁用说明什么,win10系统网络被禁用重新启用本地连接的设置技巧...
- Magento多图导入
- 八、给小白看的第一篇Python基础教程
- 【Linux系统编程】特殊进程之孤儿进程
- java中间语言汇编语言_中间语言(IL) | 学步园
- Js Vue 对象数组的创建方式
- java选择排序算法实现
- VBS 与 VBA 的区别
- java常用的date类
- 微信公众号h5开发流程
- 86版五笔字根表(JPG版)
- WARNING: The scripts f2py, f2py3 and f2py3.6 are installed in ‘/home/nano/.local/bin‘ which is not o
- 苹果设备验证是否正品
- 数据库事务的四大特性和隔离级别,一文带你看通透
- 不用梯子——每日领取5块钱的ChatGPT体验券
- 计算机打开查看方式默认是什么样,如何更改win10系统电脑图片的查看方式 怎么将电脑图片查看方式改成缩略图...
- ae,me,pr功能区别
- 使用LiveServer打开Chrome浏览器是无痕模式时,关掉无痕模式的方法
- java基于微信小程序的培训机构报名作业管理系统 uniapp 小程序
热门文章
- Spring@主要注释
- JDK 11:新的默认收集方法toArray(IntFunction)
- apache camel_Apache Camel –从头开始开发应用程序(第2部分/第2部分)
- 无状态会话的ejb_Java EE状态会话Bean(EJB)示例
- 将Swagger与Spring Boot REST API集成
- JDK 9中已弃用Java的Observer和Observable
- java 使用jasper_使用Jasper Reports以Java创建报告
- guava 集合转换_Guava的Collections2:过滤和转换Java集合
- 庞佐错觉_水晶球错觉
- spring tiles_Spring MVC 3模板和Apache Tiles