【CV】计算机视觉中的特征追踪与背景处理

计算机视觉领域中的重要任务之一是视频特征追踪,它可以用于目标跟踪、运动分析、行为识别等应用。然而,在实际应用中,经常会遇到需要仅处理视频中特定特征物体而忽略背景的情况,这就需要进行背景处理。本文将介绍如何使用Python和OpenCV库进行视频特征追踪,并提供针对特定特征物体的背景处理解决方案和示例。

视频特征追踪

视频特征追踪是指在视频序列中跟踪特定目标或特征的运动轨迹。常见的视频特征包括角点、边缘、光流等。在本文中,我们将以角点为例进行视频特征追踪。

角点检测

首先,需要在视频帧中检测角点,常用的角点检测算法包括Harris角点检测和Shi-Tomasi角点检测。这里以Shi-Tomasi角点检测为例:
实现对视频中角点的追踪,并将角点的运动轨迹绘制在视频帧上。

import cv2# 读取视频
cap = cv2.VideoCapture('video.mp4')# 创建Shi-Tomasi角点检测器
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)
lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 读取第一帧并检测角点
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)# 创建显示颜色
color = (0, 255, 0)# 循环处理视频帧
while True:ret, frame = cap.read()if not ret:breakframe_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算光流p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 选择好的角点good_new = p1[st == 1]good_old = p0[st == 1]# 绘制轨迹for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel()c, d = old.ravel()frame = cv2.line(frame, (a, b), (c, d), color, 2)frame = cv2.circle(frame, (a, b), 5, color, -1)# 显示结果cv2.imshow('frame', frame)if cv2.waitKey(30) & 0xFF == ord('q'):break# 更新前一帧和角点old_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)# 释放资源
cap.release()
cv2.destroyAllWindows()

特定物体背景处理

在实际应用中,我们经常需要仅处理视频中特定特征物体而忽略背景。这可以通过背景减除技术来实现,常见的方法包括基于差值的方法和基于模型的方法。

差值法

通过对当前帧图像与背景图像进行差值运算,得到前景目标。在Python中,我们可以使用OpenCV的absdiff函数实现:

import cv2# 读取视频和背景图像
cap = cv2.VideoCapture('video.mp4')
background = cv2.imread('background.jpg')# 循环处理视频帧
while True:ret, frame = cap.read()if not ret:break# 背景减除diff = cv2.absdiff(frame, background)# 显示结果cv2.imshow('Foreground', diff)if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

background.jpg是背景图像,通过将当前帧图像与背景图像进行差值运算,得到前景目标。

模型法

指通过建立背景模型,将与背景模型差异较大的部分作为前景目标。常见的背景建模算法包括高斯混合模型(Gaussian Mixture Model,GMM)和自适应背景建模。这里我们以GMM为例

import cv2# 创建背景建模器
bg_subtractor = cv2.createBackgroundSubtractorMOG2()# 读取视频
cap = cv2.VideoCapture('video.mp4')# 循环处理视频帧
while True:ret, frame = cap.read()if not ret:break# 背景建模fg_mask = bg_subtractor.apply(frame)# 显示结果cv2.imshow('Foreground', fg_mask)if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

上述代码中,createBackgroundSubtractorMOG2函数创建了一个基于GMM的背景建模器,通过对每一帧图像应用背景建模器,得到前景目标。

注意,如果没有明确的背景图像,差值法就无法直接应用。在这种情况下,可以考虑使用其他技术来区分追踪特征和背景。比如:

移动物体检测

利用运动检测算法,如光流、帧差法或运动检测模型(如移动物体检测器),来检测视频中的移动物体。这些物体可以被视为前景,而静止的部分则可以视为背景。

举例说明:
比如cv2.createBackgroundSubtractorMOG2() 是 OpenCV 中用于创建背景减法器(Background Subtractor)的函数之一。背景减法器主要用于从视频序列中提取前景对象,即与背景不同的移动对象。MOG2 是 Mixture of Gaussians 的简称,它是一种经典的背景减法算法之一。

这个函数返回一个背景减法器对象,可以使用这个对象来对输入的视频帧进行背景减法操作。背景减法器的工作原理是基于统计学的方法,它会根据像素点在时间上的变化情况来对每个像素点进行建模,以便区分前景和背景。

主要参数包括:
history:用于指定背景模型中使用的历史帧数,通常用来平滑背景模型以适应场景中的变化,默认值为500。
varThreshold:用于指定阈值,如果一个像素点在一段时间内的方差超过了这个阈值,就会被认为是前景,默认值为16。
detectShadows:一个布尔值,用于指定是否检测阴影。如果设置为 True,减法器将尝试检测图像中的阴影并将其标记为灰色,默认值为 True。
这个函数返回一个背景减法器对象,可以使用这个对象的 apply() 方法来对输入的视频帧进行背景减法操作。

import cv2# 读取视频
cap = cv2.VideoCapture('video.mp4')# 创建背景减法器
fgbg = cv2.createBackgroundSubtractorMOG2()# 循环处理视频帧
while True:ret, frame = cap.read()if not ret:break# 应用背景减法fgmask = fgbg.apply(frame)# 显示结果cv2.imshow('frame', fgmask)if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

颜色分割

如果特征物体与背景在颜色上有明显的区别,可以尝试使用颜色分割方法,将特征物体与背景分离开来。例如,可以使用颜色空间转换和阈值化来提取特定颜色的物体。
示例:

import cv2
import numpy as np# 读取视频
cap = cv2.VideoCapture('video.mp4')# 设定颜色阈值
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([140, 255, 255])# 循环处理视频帧
while True:ret, frame = cap.read()if not ret:break# 转换颜色空间hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 根据颜色阈值进行分割mask = cv2.inRange(hsv, lower_blue, upper_blue)# 显示结果cv2.imshow('frame', mask)if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

形态学操作

利用形态学操作(如膨胀、腐蚀、开运算、闭运算等)来处理图像,从而分离特征物体和背景。这些操作可以帮助去除背景中的噪声或填充特征物体中的空洞,从而更好地区分两者。
举例说明:
cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel) 是 OpenCV 中用于执行形态学开运算(Opening operation)的函数之一。形态学操作是一组图像处理操作,主要用于图像的形状分析和提取。开运算是形态学操作的一种,它是先进行腐蚀操作,然后进行膨胀操作的组合。开运算可以用于消除小的噪声点,平滑对象的边缘,以及分离接触的对象等。

参数:
gray:输入的灰度图像,通常是经过预处理后的图像,如转换为灰度、二值化等。
cv2.MORPH_OPEN:指定进行开运算操作。
kernel:形态学操作的结构元素(kernel),它决定了腐蚀和膨胀操作的形状和大小。在这个函数中,kernel 是一个二维数组,用来定义腐蚀和膨胀操作的卷积核。

在开运算中,首先对图像进行腐蚀操作,然后再进行膨胀操作。腐蚀操作会使图像中的边缘变细,噪声点被去除,而膨胀操作则会使图像中的边缘变粗,对象的形状得到平滑。这种组合操作可以消除小的对象,填补小的孔洞,并平滑对象的边缘。

下面是一个简单的示例,演示如何使用开运算对灰度图像进行处理:

import cv2
import numpy as np# 读取视频
cap = cv2.VideoCapture('video.mp4')# 循环处理视频帧
while True:ret, frame = cap.read()if not ret:break# 转换为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 应用形态学操作kernel = np.ones((5,5),np.uint8)opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)# 显示结果cv2.imshow('frame', opening)if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

机器学习方法

使用机器学习方法训练一个分类器来区分特征物体和背景。通过提取图像特征并训练一个分类器,可以实现对特征物体的识别和分割。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux子进程通过“信号”终止父进程

背景指示:守护进程守护进程_amdaemon-CSDN博客 一种方法是通过kill命令发送特定的信号给父进程。如果子进程在其终止处理程序(atexit或sigterm处理程序)中调用kill命令,并且指定父进程的进程ID,那么父进程就可以被终止…

如何确保UDP文件传输工具有最低稳定的传输速度?

在当前日新月异的数字时代背景下,文件传输工具已经成为我们日常生活与工作中不可或缺的一部分,尤其针对那些频繁涉及即时数据交互与多媒体流通的场景。 UDP协议,以其突出的高速传输与低延迟特性,脱颖而出成为众多用户的首选。不过…

Python管理PVE(Proxmox VE)云平台--节点资源统计

一、前言 写本脚本的初衷是因手动查看统计已分配的PVE资源过于耗时,因此写一个脚本一劳永逸,具体实现方法:利用Python的paramiko模块进行远程命令查看、统计PVE平台各节点已分配的cpu、内存、磁盘空间。 二、步骤 1.构建shell脚本 1.1 统计…

Ubuntu系统下编译OpenCV4.8源码

OpenCV4.8源码编译与安装 其实很简单,只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;第三步就是编译OpenCV源码包生成安装文件并安装。 01下载OpenCV4.8源码包 在Ubunt…

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念,而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中,高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者,西门子Insight楼宇自动化…

KMeans,KNN,Mean-shift算法的学习

1.KMeans算法是什么? 在没有标准标签的情况下,以空间的k个节点为中心进行聚类,对最靠近他们的对象进行归类。 2.KMeans公式: 2. 1.关键分为三个部分: 1.一开始会定义n个中心点,然后计算各数据点与中心点…

jenkins使用gitLab(极狐)认证登陆

jenkins安装 GitLab Authentication插件 我因为java版本和最新GitLab Authentication 1.19版本不兼容,选择了本地安装 找个历史版本1.13版本,然后下载到电脑上 - 本地上传插件并安装 在极狐上创建一个应用 - 配置应用信息 应用名:jenkinsLo…

设计模式学习笔记 - 回顾总结:如何将设计思想、原则、模式等理论知识应用到项目中?

概述 上篇文章,我们第整个专栏的理论知识点做了串讲,不知道你掌握的如何?对于上节课总结的重点内容,希望你能多花点时间搞透彻,对于一些不那么重要的内容,你可以把它们当做资料,用到的时候随手…

你以为是个黄金程序员,结果是个王者

玩过王者荣耀的同学都知道,从青铜到王者,过程中需要步步修炼,可以说等级的提升是胜利的积累,也可以说是技术的提升。 而程序员行业也是这样,技术越高段位越高,当然段位越高技术也越高,这个行业大…

[力扣题解]37. 解数独

题目&#xff1a;37. 解数独 思路 回溯法 代码 class Solution { public:bool function(vector<vector<char>>& board){int i, j;char k;for(i 0; i < 9; i){for(j 0; j < 9; j){// 为空if(board[i][j] .){for(k 1; k < 9; k){if(right(board…

Oracle -在线回缩表

conn scott/tiger DROP TABLE EMP1 PURGE; CREATE TABLE EMP1 AS SELECT * FROM EMP; alter table emp1 enable row movement; -- 启动回缩特性 insert into emp1 select * from emp1; / / commit; -- 增加到14000行 -- 分析表的结构 analyze table emp1 comput…

小程序如何确定会员身份并批量设置会员积分或余额

因为一些原因&#xff0c;商家需要从其它系统里面批量导入会员&#xff0c;确定会员身份&#xff0c;然后给他们设置对应的账户余额。下面&#xff0c;就具体介绍如何进行这种操作。 一、客户进入小程序并绑定手机号 进入小程序&#xff1a;客户打开小程序&#xff0c;系统会自…

赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 100道 Java 基础面试题&#xff08;三十九&#xff09;-CSDN博客 七十九、forward和redirect的区别&#xff1f; 在Java Web应用程序中&#xff0c;forward和redirect是两种不同的服务器端重定向机制&#xff0c;它…

【leetcode】栈题目总结

普通栈 先进后出的特点 ​​​​​​20. 有效的括号 class Solution { public:unordered_map<char, char> mp {{), (},{], [},{}, {}};bool isValid(string s) {stack<char> st;for (char c : s) {if (c ( || c [ || c {) {st.push(c);} else {if (!st.empty…

between函数为导致索引失效吗?

当BETWEEN函数用于WHERE条件时&#xff0c;索引可能会失效的情况是当被比较的列&#xff08;例如日期或数字列&#xff09;上存在索引&#xff0c;但是BETWEEN的范围涵盖了索引中的大部分数据。这会导致MySQL优化器放弃使用索引而选择全表扫描&#xff0c;因为对于优化器来说&a…

C++关联容器2——map,multimap,set,multiset基本操作

目录 关联容器操作 关联容器迭代器 set 的迭代器是const的 遍历关联容器 关联容器和算法 添加元素 向map添加元素 检测insert的返回值 向multiset或 multimap添加元素 std::multiset 例子 std::multimap 例子 删除元素 std::set 和 std::multiset 示例 std::map 和…

leetcode47-Permutations II

分析 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] 题目 由于元素是重复的&#xff0c;要求返回不重复的&#xff0c;所以一定会有…

代码随想录算法训练营 总结篇

代码随想录算法训练营 总结篇 历时两个月的算法训练结束了&#xff01;首先恭喜我自己&#xff0c;中间虽然拖拉了几天&#xff0c;但总是补上了&#xff0c;也算是成功完成了训练。 虽然已经大三了&#xff0c;但是没有系统的刷过算法。之前在课上也是老师讲完就完了&#x…

交友软件源码-源码+搭建+售后,上线即可运营聊天交友源码 专业语聊交友app开发+源码搭建-快速上线

交友小程序源码是一种可以帮助开发者快速搭建交友类小程序的代码模板。它通常包括用户注册、登录、个人信息编辑、匹配推荐、好友聊天等常见功能&#xff0c;以及与后台数据交互的接口。使用这种源码可以极大地缩短开发时间&#xff0c;同时也可以根据自己的需求进行二次开发和…

从0到1开发一个vue3+ts项目(一)

1. 环境配置 1.1 安装node 使用官方安装程序 前往 Node.js 官网&#xff1a;访问 Node.js 官网&#xff0c;下载适合你操作系统的安装程序。运行安装程序&#xff1a;下载完成后&#xff0c;双击安装程序并按照提示进行安装。验证安装&#xff1a;安装完成后&#xff0c;在终…