基于均值迁移的对象移动分析(Meanshift)

✏️ ⛳️

概述

本质:

✔️ Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计,在某一连续点处的密度函数值可由该点邻域中的若干样本点估计得出。

直观的理解:

✔️ 一堆点集,一个圆形的窗口在不断的移动,移动的方向是沿着点的密度最大的区域移动,图示如下:

均值迁移

函数

  • 在OpenCV里使用均值平移,首先需要设置目标,找到它的直方图,这样我们可以为了计算均值平移向后投影目标到每一帧上,同时也需要提供窗口的初始位置。
  • 对于直方图,只考虑色调(H),要避免低光线带来的错误值,低光线的值使用 cv2.inRange() 函数来丢弃掉。
ret, track_window = cv2.meanShift(probImage, window, criteria )

输入值

  • probImage --> 输入图像,是直方图反向投影的结果
  • window --> 搜索窗口,ROI对象区域
  • criteria --> 均值迁移停止条件

返回值

  • ret --> 返回迭代次数
  • track_window --> 返回迭代后的窗口

示例代码

import cv2 as cv
cap = cv.VideoCapture('test.mp4')# 读取第一帧
ret,frame = cap.read()
cv.namedWindow("Demo", cv.WINDOW_AUTOSIZE)
# 可以在图片上选择roi区域
x, y, w, h = cv.selectROI("Demo", frame, True, False)
track_window = (x, y, w, h)# 获取ROI直方图
roi = frame[y:y+h, x:x+w]
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)# inRange函数设置亮度阈值
# 去除低亮度的像素点的影响
# 将低于和高于阈值的值设为0
mask = cv.inRange(hsv_roi, (26, 43, 46), (34, 255, 255))# 计算直方图,参数为 图片(可多),通道数,蒙板区域,直方图长度,范围
roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])# 归一化,像素值区间[0,255]
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)# 设置迭代的终止标准,最多十次迭代
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )while True:ret, frame = cap.read()if ret is False:break;hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)# 直方图反向投影dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)# 均值迁移,搜索更新roi区域ret, track_window = cv.meanShift(dst, track_window, term_crit)# 绘制窗口x,y,w,h = track_windowcv.rectangle(frame, (x,y), (x+w,y+h), 255,2)cv.imshow('Demo',frame)k = cv.waitKey(60) & 0xffif k == 27:breakelse:cv.imwrite(chr(k)+".jpg",frame)
cv.destroyAllWindows()
cap.release()

Meanshift

基于连续自适应均值迁移的对象移动分析(Camshift)

概述

✔️ 由于mean-shift算法的窗口是固定大小的,而我们需要让窗口大小和目标的大小以及旋转相适应,因此提出了Camshift。

✔️ CAM是连续自适应的均值迁移跟踪算法,它跟均值迁移相比较有两个改进 - 会根据跟踪对象大小变化自动调整搜索窗口大小 - 返回位置信息更加完整,包含了位置与角度信息。

✔️ CAM先采用均值平移,当平移覆盖后,更新窗口大小,公式如下:

它也计算最适合的椭圆的方向,然后它在使用新的大小的窗口在之前的位置开始进行均值平移,过程不断继续直到到达指定的准确率。

函数

ret, track_box = cv2.CamShift(InputArray probImage,Rect &  window,TermCriteria criteria )

输入

  • probImage --> 输入图像,是直方图反向投影的结果
  • window --> 搜索窗口,ROI对象区域
  • criteria --> 均值迁移停止条件

输出

  • ret --> 返回可变角度的最优外接椭圆
  • track_box --> 返回新的窗口

示例代码

import cv2 as cv
import numpy as npcap = cv.VideoCapture('test.mp4')# 读取第一帧
ret,frame = cap.read()
cv.namedWindow("Demo", cv.WINDOW_AUTOSIZE)# 选择ROI区域
x, y, w, h = cv.selectROI("Demo", frame, True, False)
track_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, (26, 43, 46), (34, 255, 255))
roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)# 设置迭代的终止标准,最多十次迭代
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )
while True:ret, frame = cap.read()if ret is False:break;hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)# 搜索更新roi区域ret, track_box = cv.CamShift(dst, track_window, term_crit)# 可变角度的矩形框pts = cv.boxPoints(ret)pts = np.int0(pts)cv.polylines(frame, [pts], True, (0, 255, 0), 2)# 更新窗口track_window = track_box#print(track_box)# 绘制窗口CAM,目标椭圆图cv.ellipse(frame, ret, (0, 0, 255), 3, 8)cv.imshow('Demo',frame)k = cv.waitKey(50) & 0xffif k == 27:breakelse:cv.imwrite(chr(k)+".jpg",frame)cv.destroyAllWindows()
cap.release()

Camshift

对象移动轨迹绘制

✔️ 移动对象分析,我们可以绘制对象运行轨迹曲线,这个主要是根据移动对象窗口轮廓,获取中心位置,然后使用中心位置进行绘制即可得到。

✔️ 大致的程序步骤如下:

1. 初始化路径点数组

2. 对每帧的预测轮廓提取中心位置添加到路径数组

3. 绘制路径曲线

代码

✔️ 我们只需要在上一节Camshift的代码中添加一个数组存储中心位置,然后使用cv2.line()画出即可。

修改部分:

tracking_path = []
while True:ret, frame = cap.read()if ret is False:break;hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)# ,搜索更新roi区域, 保持运行轨迹ret, track_box = cv.CamShift(dst, track_window, term_crit)track_window = track_box# 椭圆中心pt = np.int32(ret[0])if pt[0] > 0 and pt[1] > 0:tracking_path.append(pt)# 绘制跟踪对象位置窗口与对象运行轨迹#cv.ellipse(frame, ret, (0, 0, 255), 3, 8)for i in range(1, len(tracking_path)):cv.line(frame, (tracking_path[i - 1][0], tracking_path[i - 1][1]),(tracking_path[i][0], tracking_path[i][1]), (0, 255, 0), 2, 6, 0)cv.imshow('Demo',frame)k = cv.waitKey(50) & 0xffif k == 27:breakelse:cv.imwrite(chr(k)+".jpg",frame)

轨迹绘制

------------------------------------------可爱の分割线------------------------------------------

更多Opencv教程可以 Follow github的opencv教程,中文&English 欢迎Star❤️❤️❤️

JimmyHHua/opencv_tutorials​github.com

参考

- OpenCV Tutorial 官网

-[Object Tracking] MeanShift

opencv 的norm_OpenCV视频分析-Meanshift、Camshiftamp;运动轨迹绘制相关推荐

  1. Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取

    Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取 Java OpenCV-4.0.0 图像处理 视频分析和对象跟踪 视频读取 package com.xu.opencv.video; ...

  2. opencv 图像与视频分析教程③

    opencv 图像与视频分析教程 代码: https://github.com/bai1231/opencv-learn_and_pratice 二值图像分析 图像二值化 二值图像轮廓分析 霍夫检测 ...

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

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

  4. OpenCV多目标跟踪与视频分析

    点击我爱计算机视觉标星,更快获取CVML新技术 在视频监控与分析中,视频前后景分析.多目标检测.目标跟踪等算法需要协同工作,今天跟大家分享的开源库,给出了一个基于OpenCV的开源实现.供大家学习参考 ...

  5. python opencv findcontours_OpenCV之视频分析 – 背景消除与前景ROI提取

    python代码: import C++代码: #include OpenCV学习笔记代码,欢迎follow: MachineLP/OpenCV-​github.com

  6. OpenCV视频分析与对象跟踪实战教程-贾志刚-专题视频课程

    OpenCV视频分析与对象跟踪实战教程-1957人已学习 课程介绍         OpenCV视频分析与对象跟踪实战视频培训课程概况:基于OpenCV新版本3.2 从基本的OpenCV视频读写与摄像 ...

  7. OpenCV视频分析背景提取与前景提取

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 基本思想 OpenCV中支持的两种背景提取算法都是基于模型密度评估 ...

  8. 智慧工地AI视频分析系统 opencv

    智慧工地AI视频分析系统通过python+opencv网络模型图像识别技术,智慧工地AI视频分析算法自动识别现场人员穿戴是否合规.本算法模型中用到opencv技术,OpenCV基于C++实现,同时提供 ...

  9. Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景

    Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景 方法 含义 解释 bitwise_and "与"操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制 ...

最新文章

  1. iOS逆向(1)-密码学(RSA)
  2. 自编码网络这样应用到任务上可以吗
  3. 云效DevOps实践-代码评审
  4. java刷卡机_JavaPOS
  5. facebook机器学习_如何为您的页面创建Facebook Messenger机器人
  6. 【OpenGL】顶点变换常用函数总结
  7. AD16自定义板子大小
  8. 5分钟带你入门vuex(vue状态管理)
  9. [论文笔记]JED:Towards Real-Time Multi-Object Tracking
  10. win7资源服务器未响应,win7电脑怎么设置服务器未响应
  11. excel数据分析——贝叶斯分析预估
  12. 小管家进销存_管钱、管货、管顾客,“北漂”京东便利店主点赞掌柜管家
  13. 旅游四天,吃了一顿七千的饭,坐了一趟一万多的地铁,心疼肾更疼
  14. 相对路径与绝对路径的写法
  15. 微信小游戏和小程序的区别
  16. linux 系统命令被后门修改_一次Linux系统被攻击的分析过程
  17. 2020.8.20 斗鱼Android开发一面面经
  18. 音乐欣赏之古典乐曲经典开头
  19. 简单的商品信息爬虫——爬易迅网
  20. 2018 形势、影响与心态

热门文章

  1. element table多选表格_【经验总结】vue + element-ui 踩坑—— table 篇
  2. pgsql函数定时更新表_Postgresql PL/PGSQL 程序语言系列 1 (存储过程过时了吗,与函数)...
  3. C#:安装Windows服务,动态指定服务名及描述
  4. Spring3 MVC 深入研究
  5. 威胁情报基础:爬取、行走、分析
  6. while循环与for循环
  7. Tomcat URL重写
  8. 编译驱动的Makefile解析
  9. 利用条件运算符的嵌套来完成此题:学习成绩 =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。...
  10. Entity Framework 6.x Code First 基础