Python OpenCV实现视频追踪
作者:sxqczzxsh 发布时间:2021-09-29 23:04:27
本文实例为大家分享了Python OpenCV实现视频追踪的具体代码,供大家参考,具体内容如下
1. MeanShift
假设有一堆点集和一个圆形的小窗口。现在需要将此窗口移动到具有最高点集密度的区域,如下图:
第一个窗口C1是蓝色圆圈的区域。蓝色环的中心用蓝色矩形标记并命名为 C1_o。窗口中所有点的点集形成的质心在蓝色圆形点C1_r。显然,质心和环的质心不重合。移动蓝色窗口,使质心与先前获得的质心重合。在新移动的圆环的区域内再次找到圆环包围的点集的质心,然后再次移动。通常,形心和质心不重合。继续执行上述移动过程,直到形心与质心大致重合。这样,最终的圆形窗口就会落到像素分布最大的地方,也就是图中的绿色圆圈C2。
除了用于视频跟踪之外,MeanShift算法在涉及数据和无监督学习的各种场景中都有重要的应用,例如聚类、平滑等。它是一种广泛使用的算法。
图像是信息矩阵。如何使用MeanShift算法跟踪视频中的移动物体?一般流程如下:
1)在图像上选择一个目标区域,
2)计算选中区域的直方图分布,一般是HSV颜色空间的直方图。
3)计算下一帧图像 b 的直方图分布。
4)计算图像b中与所选区域的直方图分布最相似的区域,并使用MeanShift算法将所选区域沿最相似的部分移动,直到找到最相似的区域。
5)重复3到4的过程,完成整个视频目标跟踪。
一般情况下,我们使用直方图反投影得到的图像和目标物体在第一帧的起始位置。当目标物体的运动会在直方图反投影图像中反映出来时,MeanShift算法会将窗口移动到反投影图像中灰度密度最高的区域。
假设我们有一个 100x100 的输入图像和一个 10x10 的模板图像,直方图反投影的过程是这样的:
1)从输入图像的左上角(0,0)开始,从(0,0)到(10,10)剪切一张临时图像。
2)生成临时图像的直方图。
3)将临时图像的直方图与模板图像的直方图进行比较,比较结果标记为c。
4)直方图比较结果c为结果图像中(0,0)处的像素值。
5)将输入图像的临时图像从(0,1)剪切到(10,11),对比直方图,记录结果图像。
6)重复步骤1到5,直到输入图像的右下角,形成直方图的反投影。
cv.meanShift(probImage, window, criteria)
参数:
probImage ROI区域,即目标的直方图的反向投影。
window 初始搜索窗口,就是定义ROI的rect。
criteria 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等。
2. CamShift
MeanShift的结果有一个问题,检测窗口的大小是固定的,而狗是一个由近到远逐渐变小的过程,固定的窗口是不合适的。 所以需要根据目标的大小和角度来修正窗口的大小和角度。
CamShift(Continuously Adaptive Mean-Shift algorithm)是MeanShift算法的改进算法,可以解决这个问题。它可以随着跟踪目标大小的变化实时调整搜索窗口的大小,具有更好的跟踪效果。 Camshift 算法首先应用MeanShift。 一旦MeanShift收敛,它就会更新窗口的大小,同时计算出最佳拟合椭圆的方向,从而根据目标的位置和大小来更新搜索窗口。
例:使用MeanShift和CamShift方法获取视频中的狗,并标注。
import cv2 as cv
import numpy as np
# 获取视频
cap = cv.VideoCapture('image/DOG.wmv')
# 指定追踪目标
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]
# 计算直方图
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)
# 目标追踪
term = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
# meanshift
while True:
ret, frame = cap.read()
if ret:
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 = win
img2 = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
cv.imshow("frame", img2)
if cv.waitKey(60) & 0xFF == ord('q'):
break
# camshift
while True:
ret, frame = cap.read()
if ret:
hst = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hst], [0], roi_hist, [0, 180], 1)
ret, track_window = cv.CamShift(dst, win, term)
# 绘制追踪结果
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame, [pts], True, 255, 2)
cv.imshow("frame", img2)
if cv.waitKey(60) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv.destroyAllWindows()
来源:https://blog.csdn.net/Amzmks/article/details/119855545


猜你喜欢
- ASP中RegExp是什么 '名字字符检验Public Function CheckName(Str) &nbs
- 按住Ctrl,点击函数名称,即可跳转到该函数的代码文件中选中后,函数显示有下划线:点击函数名称,跳转到该函数所在的文件里:补充:pychar
- ASCII(str) 返回字符串str的第一个字符的ASCII值(str是空串时返回0)mysql> select ASCII(
- 一、记事本源码#python简易记事本from tkinter import *from tkinter import messagebox
- 学习目标:对二值图进行分析,设定最大最小面积区间保留该面积区间内的区域示例代码//src为二值图,minArea、maxArea为面积阈值,
- 问题官网中给的picker例子,每项只能是个字符串,但我需要它返回每个字符串对应的自定义ID,而不是index。vantUI官网:picke
- 前言最近无意间发现mysql的coalesce,又正好有时间,就把mysql中coalesce()的使用技巧总结下分享给大家,下面来一起看看
- 概述从今天开始, 小白我将带领大家一起来补充一下 数据库的知识.数据控制语言数据控制语言 (Data Control Language) 是
- 10个杀手级应用的Python自动化脚本重复的任务总是耗费时间和枯燥的。想象一下,逐一裁剪100张照片,或者做诸如Fetching APIs
- 本文实例讲述了php中正则替换函数ereg_replace用法。分享给大家供大家参考。具体如下:下面的实例是利用php 正则替换函数 ere
- python3.7 打包成exe程序环境:pycharm2018.1+win7+python3.7工具:pyinstaller1、安装pyi
- 常见的误解有: 1. 只用 ado.net ,无法进行动态 SQL 拼接。 2. 有几个动态参数,代码的重复量就成了这些参数的不同数量的组合
- 一、简介从Python2.6开始,新增了str.format(),它增强了字符串格式化的功能。基本语法是通过 {} 和 : 来代替以前的 %
- 本文实例讲述了python操作redis的方法。分享给大家供大家参考。具体如下:#!/usr/bin/python#coding=utf-8
- 声明定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。平台:win/I
- 什么是正则表达式?正则表达式(Regular Expression)通常被用来检索、替换那些符合某个模式(规则)的文本。此处的Regular
- 本文要点:爬虫的基本流程requests模块的使用保存csv可视化分析展示环境介绍python 3.8pycharm 2021专业版 激活码
- 本文实例讲述了Go语言压缩和解压缩tar.gz文件的方法。分享给大家供大家参考。具体分析如下:golang处理压缩包,最常用的就是tar.g
- 简易画图工具(Python),供大家参考,具体内容如下小黑最近在努力的入门python,正好学习到了Python的tkinker模块下的Ca
- help函数是python的一个内置函数(python的内置函数可以直接调用,无需import),它是python自带的函数,任何时候都可以