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

  • 1. 效果图
  • 2. 源码
    • 2.1 MeanShift
    • 2.2 Camshift(Continuously Adaptive Meanshift)持续自适应性均移
  • 3. 参考

这篇博客将介绍如何使用 Meanshift 和 Camshift 算法来查找和跟踪视频中的对象。

MeanShift:均移
Camshift(Continuously Adaptive Meanshift)持续自适应性均移

  • cv2.meanShift(): Meanshift 均移总是能找到一个具有最大像素分布的窗口,并且追踪对象;

  • cv2.CamShift(): CAMshift 是 Meanshift的优化,它会持续性的自动调整窗口的大小,并且计算最佳拟合椭圆的方向。它再次应用具有新缩放搜索窗口和先前窗口位置的均值变换,直到达到所需的精度;

1. 效果图

官方示例——Meanshift 均移效果图如下:

官方示例——CAMshift持续自适应均移效果图如下:

可以看到Camshift会自动调整框的大小及旋转,能更好的拟合追踪的对象;

2. 源码

2.1 MeanShift

# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持续自适应均移以寻找和追踪对象# CAMshift 是 MeanShift的优化,它会持续性的自动调整窗口的大小,并且计算最佳拟合椭圆的方向。它再次应用具有新缩放搜索窗口和先前窗口位置的均值变换,直到达到所需的精度;
import numpy as np
import cv2cap = cv2.VideoCapture('images/slow_traffic_small.mp4')# 获取视频的第一帧
ret, frame = cap.read()# 设置初始窗口位置
x, y, w, h = 300, 200, 100, 50  # 硬编码位置
track_window = (x, y, w, h)# 对追踪对象设置ROI
roi = frame[y:y + h, x:x + w]# 只考虑HSV的色调
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# 为了避免由于低光导致的错误值,使用 cv2.inRange() 函数丢弃低光值。
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)# 设置终止标准,10 次迭代或移动至少 1pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)while (1):ret, frame = cap.read()if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# 应用meanshift获取新位置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.imshow('img2', img2)k = cv2.waitKey(60) & 0xffif k == 27:breakelse:cv2.imwrite(chr(k) + ".jpg", img2)else:breakcv2.destroyAllWindows()
cap.release()

2.2 Camshift(Continuously Adaptive Meanshift)持续自适应性均移

# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持续自适应均移以寻找和追踪对象
# CAMshift 是 MeanShift的优化,它会持续性的自动调整窗口的大小,并且计算最佳拟合椭圆的方向。它再次应用具有新缩放搜索窗口和先前窗口位置的均值变换,直到达到所需的精度;import numpy as np
import cv2cap = cv2.VideoCapture('images/slow_traffic_small.mp4')# 获取视频的第一帧
ret, frame = cap.read()# 设置初始窗口位置
x, y, w, h = 300, 200, 100, 50  # 硬编码位置
track_window = (x, y, w, h)# 对追踪对象设置ROI
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)# 设置终止条件,迭代10次或者至少移动1pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)while (1):ret, frame = cap.read()if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# 应用camshift获取新位置# 返回一个旋转的矩形和框参数(用于在下一次迭代中作为搜索窗口传递)# 它首先应用均值变换。一旦meanshift收敛,它会更新窗口的大小,并且计算最佳拟合椭圆的方向。它再次应用具有新缩放搜索窗口和先前窗口位置的均值变换。该过程一直持续到满足所需的精度。ret, track_window = cv2.CamShift(dst, track_window, term_crit)# 绘制在图像上pts = cv2.boxPoints(ret)pts = np.int0(pts)img2 = cv2.polylines(frame, [pts], True, 255, 2)cv2.imshow('img2', img2)# cv2.waitKey(0)k = cv2.waitKey(60) & 0xffif k == 27:breakelse:cv2.imwrite(chr(k) + ".jpg", img2)else:breakcv2.destroyAllWindows()
cap.release()

3. 参考

  • https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_meanshift/py_meanshift.html#meanshift
  • https://github.com/opencv/opencv/tree/master/samples/python/tutorial_code/video/meanshift
  • 可交互式的Camshift

使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象相关推荐

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

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

  2. (自己编写函数)Python + Opencv 图像边缘检测(模糊算法【老师给的ppt中原理是这样的,但是还有很多不明白,有很多参数老师没说怎么算,只说了每张图片不一样】)

    实验原理 1.首先,用重心法模糊推理图像中任意一像素点的边缘隶属方向,取其最大隶属度的方向为边缘隶属方向. 2.然后,在边缘隶属方向上根据像素点附近灰度分布的特点模糊推理该点的边缘隶属度,进而实现边缘 ...

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

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

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

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

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

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

  6. [转载] 使用Python+OpenCV实现在视频中某对象后添加图像

    参考链接: Python Opencv 基础3 : resize 调整图像大小 概述 在运动物体后面添加图像是一个典型的计算机视觉项目了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一 ...

  7. 使用Python+OpenCV实现在视频中某对象后添加图像

    概述 在运动物体后面添加图像是一个典型的计算机视觉项目 了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一位同事向我提出了一个挑战--建立一个计算机视觉模型,可以在视频中插入任何图像, ...

  8. python诞生的时间地点人物事件_教程|计算任意视频中各人物的出镜时间(附Python实现)...

    ,内容略有删改 前言 简介 当我开始接触深度学习时,学到的第一件事就是图像分类.这个话题非常有趣,包括我在内的很多人都沉浸在它的魅力之中.但是在我处理图像分类时总会思考,如果我能将学到的东西迁移到视频 ...

  9. python opencv立体测距 立体匹配BM算法

    立体标定 应用标定数据 转换成深度图 标定 在开始之前,需要准备的当然是两个摄相头,根据你的需求将两个摄像头进行相对位置的固定,我是按平行来进行固定的(如果为了追求两个双目图像更高的生命度,也可以将其 ...

最新文章

  1. 使用opencv dnn 模块调用darknet模型时候出错,不支持relu激活函数
  2. mysql 存储过程 输出warning_如何抑制MySQL存储过程的输出?
  3. 数据结构 之 并查集
  4. ArcGIS网络分析之构建网络分析数据集(一)
  5. python os.system 512_python os.system os.popen 区别
  6. PHP逻辑运算符如何写,PHP 逻辑运算符
  7. linux企业版5安装卡乱码,linux下安装mysql5.5 乱码问题
  8. 55寸鸿蒙安卓,深网|荣耀智慧屏发布:搭载鸿蒙系统 配55英寸屏3799元起
  9. php跨进程内存共享,进程管理与内存共享
  10. linux 测试t3协议,Yealink网络电话SIP-T38G本地文件包含漏洞
  11. spark streaming之 windowDuration、slideDuration、batchDuration​
  12. 菜鸟抓鸡--各个端口的***总结
  13. 【嵌入式模块】ESP8266完整教程
  14. 【计算情与思】大学生学习和发展的思考和建议
  15. [ExtJS] Tpl模板中的extjs控件无法失焦处理
  16. 74LVC2G14GW 封装 SOT363 栅极/逆变器芯片
  17. Threejs 中的后期处理
  18. 数据分析,怎么做才能有前瞻性?
  19. win ce系统如何知道u盘正版授权_从零开始的电脑系统重装
  20. VUE单页面应用的内页很难被百度收录

热门文章

  1. Mobileye 自动驾驶策略(二)
  2. 生成对抗网络(GAN)
  3. Ubuntu 系统开机黑屏提示the root filesystem on /dev/sdb2 requires a manual fsck
  4. 微信小程序 文字换行
  5. View requires API level 21 (current min is 15): Toolbar
  6. Java面试题之Oracle 支持哪三种事务隔离级别
  7. Django的下载与基本命令
  8. 【模拟】不高兴的津津
  9. 验证插件——jquery.validate.js
  10. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框