import numpy as np
import cv2 as cv
# opencv实现meanshift的api
# cv.meanShift(probImage,window,criteria)
# 参数一:roi区域,目标直方图的反向投影
# 参数二:初始搜索窗口,就是定义roi的rect
# 参数三: 确定窗口搜索的停止准则,主要有迭代数达到最大值,窗口中心的漂移值大于某个设定的限值
# 实现Meanshift的主要流程是∶
# 1.读取视频文件:cv.videoCapture()
# 2.感兴趣区域设置:获取第一帧图像,q并设置目标区域,即感兴趣区域3.计算直方图:计算感兴趣区域的HSV直方图,并进行归一化
# 4.目标追踪∶设置窗口搜索停止条件,直方图反向投影,进行目标追踪,并在目标位置绘制矩形框。
# 1 获取视频
cap = cv.VideoCapture('./DOG.mp4')
# 2 指定追踪目标
ret,frame = cap.read()
r,h,c,w = 197,141,0,208
win = (c,r,w,h)
roi = frame[r:r+h,c:c+w]
# 3 计算直方图
hsv_roi = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
roi_hist = cv.calcHist([hsv_roi],[0],None,[180],[0,180])
#归一化
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
# 4 目标追踪 ,最大迭代10,漂移1
term = (cv.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT,10,1)
while(True):ret,frame = cap.read()if ret==True:hst=cv.cvtColor(frame,cv.COLOR_BGR2HSV)dst=cv.calcBackProject([hst],[0],roi_hist,[0,180],1)ret,win = cv.meanShift(dst,win,term)x,y,w,h = winimg2 = cv.rectangle(frame,(x,y),(x+w,y+h),255,2)cv.imshow("frame",img2)if cv.waitKey(60)&0xFF == ord('q'):break
# 5 释放资源
cap.release()
cv.destroyAllWindows()

camshift算法全称“continuously adaptive mean-shift”(连续自适应meanshift算法),是对meanshift算法的改进算法,可随着跟踪目标的大小变化实时调整搜索窗口的大小,具有较好的跟踪效果。

Camshift算法首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。如下图所示:

Camshift在opencv中实现时,只需要将上述的meanshift改为camshaft函数即可

在绘制矩形框时有所不同,meanshift是直接画出矩形框,而camshift则是根据求出的点来进行绘制的。

将camshift中:

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)

改为:

#进行camshift追踪
ret, track_window = cv.CamShift(dst, track_window, term_crit)
#绘制追踪结果
pst = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.ploylines(frame,[pts],True,255,2)

算法总结:
Meanshift和camshift算法都各有优势,自然也有劣势:

  • . Meanshift算法:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。
  • . camshift算法∶可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。

总结

1.meanshift
        原理:一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。
APl: cv.meanshift()
        优缺点∶简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化
2.camshift
        原理:对meanshift算法的改进,首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。
APl: cv.camshift()
优缺点∶可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失

视频追踪(meanshift和camshift算法)相关推荐

  1. 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

    使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...

  2. opencv python 多帧降噪算法_OpenCV-Python中用于视频跟踪的Meanshift和Camshift算法介绍...

    学习目标 在本章中, 我们将学习用于跟踪视频中对象的Meanshift和Camshift算法. Meanshift Meanshift背后的直觉很简单,假设你有点的集合.(它可以是像素分布,例如直方图 ...

  3. OpenCV均值移位(Meanshift)和Camshift算法

    OpenCV Meanshift和Camshift算法 Meanshift和Camshift算法 目标 均值漂移Meanshift OpenCV中的Meanshift Camshift OpenCV中 ...

  4. python opencv入门 Meanshift 和 Camshift 算法(40)

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 在本章,学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体. Meanshift算法: mean ...

  5. opencv 图像上画出目标运动的轨迹_OpenCV视频分析-Meanshift、Camshift运动轨迹绘制...

    基于均值迁移的对象移动分析(Meanshift) ✏️ ⛳️ 概述 本质: ✔️ Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数 ...

  6. 视频操作_02视频追踪:meanshift算法+Camshift算法

    1.meanshift 1.1原理 meanshift算法的原理很简单.假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中. 如下图: 最开始的 ...

  7. OpenCV—用meanshift和Camshift进行目标追踪

    学习目标 理解meanshift的原理 知道camshift算法 能够使用meanshift和Camshift进行目标追踪 1.meanshift 1.1原理 meanshift算法的原理很简单.假设 ...

  8. opencv-Python 目标跟踪(一)《Meanshift算法、Camshift算法》

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 Meanshift算法 Meanshift算法原理: 追踪一个运动的物体大致流程 ...

  9. opencv实现camshift算法,以及代码详解

    大家好哦,小编来讲程序啦,好好看哦,慢慢体会...一.说明实验介绍本次实验将使用利用 OpenCV 来实现对视频中感兴趣的动态物体的追踪. 首先我贴出我的水下追踪效果图吧 在图中我们可以看到鱼的追踪轨 ...

  10. OpenCV系列之Meanshift和Camshift | 四十七

    学习目标 在本章中, 我们将学习用于跟踪视频中对象的Meanshift和Camshift算法. Meanshift Meanshift背后的直觉很简单,假设你有点的集合.(它可以是像素分布,例如直方图 ...

最新文章

  1. python arp脚本_Python scapy 实现一个简易 arp 攻击脚本
  2. sqlerver 字符串转整型_字符串转换成整型并求和
  3. 世界杯座位选择顺序总数
  4. java sjis_Java Charset availableCharsets()用法及代码示例
  5. mod sim tcp配置_ModSim32-ModScan32Modbus调试工具使用及配置说明
  6. 税控系统链接服务器失败,税控系统连接服务器安全地址
  7. 魔兽世界模型文件.m2 在D3D下的渲染
  8. linux查看nginx昅 电视,PHP实现查询汉字笔画、笔画排序、笔画统计
  9. PyQt环境的搭建:安装python+pyqt+eric
  10. 兆比特每秒和兆字节每秒_Mbps和MB/S一样吗?我们平时经常说的多少M带宽是哪个?...
  11. 关于网站项目计划书的写法
  12. 算法系列(一):分治策略--棋盘覆盖
  13. item_sku - 获取sku详细信息
  14. Android 禁止状态栏下拉
  15. 异常检测|深度学习(李宏毅)(二十一)
  16. 【U8+】卸载远程通后,U8提示错误无法加载DLL“UFPAClient.dll”找不到指定的模块。
  17. Mybatis-Plus引入后出错的原因
  18. 安装SDK MANAGER + Jetpack 4.5刷机
  19. 2020秋季C语言综合练习题(节选)
  20. Bia布刷题日记 LC-1

热门文章

  1. 任务调度框架 Quartz 用法指南「超详细」
  2. android框架揭秘!连续四年百度Android岗必问面试题!实战篇
  3. 《Java开发实战经典》笔记
  4. cadence基础学习
  5. 关于理财的一点点学习成果(先写这些吧)
  6. html页面打开前判断session,js判断session过期
  7. .vbb文件转换为.txt文件
  8. Smart3D系列教程
  9. 三种短链接生成源码-iApp源码
  10. Android开发简易计算器