当前位置: 首页 > news >正文

【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()

机器学习方法

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

相关文章:

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

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

CAPL如何实现TLS握手认证

CAPL有专门的章节介绍如何实现TLS握手认证的函数: CAPL调用哪些函数实现TLS握手认证,需要了解TLS在整个通信过程的哪个阶段。 首先TCP需要建立连接,这是TLS握手的前提。当TLS握手认证完成后,可以传输数据。 所以TLS握手开始前需要确保TCP建立连接,TCP传输数据前需要确保…...

Linux -- 日志

一 日志的重要性 在之前的编程经历中,如果我们的程序运行出现了问题,都是通过 标准输出 或 标准错误 将 错误信息 直接输出到屏幕上,以此来排除程序中的错误。 这在我们以往所写的程序中使用没啥问题,但如果出错的是一个不断在运行…...

WebRtc 视频通话,语音通话实现方案

先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素&#xff0c;用于显示本地视频 --><video ref"r…...

IndyTcpServer使用详解

1、IndyTCPserver的创建 IdTCPServer1.DefaultPort:= 8000; IdTCPServer1.ListenQueue:= 1024; //同时处理请求队列数限制 IdTCPServer1.MaxConnections:= 1024; //同时连接数量限制,为0不限制连接数 IdTCPServer1.ContextClass:= TNewIdServerContext; //设置为自定义TIdSe…...

pytest + yaml 框架 - 参数化读取文件路径优化

针对小伙伴提出参数化时读取外部文件&#xff0c;在项目根路径运行没问题&#xff0c;但是进入到项目下子文件夹运行用例&#xff0c;就会找不到文件问题做了优化。 关于参数化读取外部文件相关内容参考前面这篇pytest yaml 框架 -25.参数化数据支持读取外部文件txt/csv/json/…...

C++:多态-重写和重载

重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;是面向对象编程中常用的两个概念&#xff0c;它们虽然都涉及到方法的定义&#xff0c;但是在实现和使用上有着不同的特点。 重写&#xff08;Override&#xff09;&#xff1a; 重写是指在子类中重…...

element ui的table多选

使用el-table的selection-change事件来获取选中的值&#xff1b; 例&#xff1a; html代码&#xff1a; <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…...

python基础---基础运算

基础运算 可以使用type获取一个变量的类型 常见的数据类型 整形, 可以存储任意大小的整数, 支持二进制&#xff08;如0b100&#xff0c;换算成十进制是4&#xff09;、八进制&#xff08;如0o100&#xff0c;换算成十进制是64&#xff09;、十进制&#xff08;100&#xff09;…...

【数学】泰勒公式

目录 引言 一、泰勒公式 1.泰勒公式及推导 &#xff08;1&#xff09;推导 &#xff08;2&#xff09;公式 2.泰勒中值定理 &#xff08;1&#xff09;定理1&#xff08;佩亚诺余项&#xff09; &#xff08;2&#xff09;定理2&#xff08;拉格朗日余项&#xff09; …...

C++基础-编程练习题及答案

文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中&#xff0c; 有这样一种数非常怪&#xff0c; 它们不在第一个&#xff0c; 也不在最后一个&…...

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在TCP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…...

【栈】Leetcode 验证栈序列

题目讲解 946. 验证栈序列 算法讲解 在这里就只需要模拟一下这个栈的出栈顺序即可&#xff1a;使用一个stack&#xff0c;每次让pushed里面的元素入栈&#xff0c;如果当前栈顶的元素等于poped容器中的当前元素&#xff0c;因此就需要让栈顶元素出栈&#xff0c;poped的遍历…...

【数据库原理及应用】期末复习汇总高校期末真题试卷08

试卷 一、选择题(每题 2 分&#xff0c;共 30 分)    1. ___ ____是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 2. 数据库类型是按照 来划分…...

每天五分钟深度学习:数学中的极值

本文重点 在数学领域中,极值是一个极其重要的概念,它不仅在纯数学理论研究中占据核心地位,而且在工程、物理、经济等实际应用领域也发挥着不可替代的作用。极值问题涉及函数的最大值和最小值,是微积分学中的一个基本问题。本文旨在详细介绍数学中的极值概念、性质、求解方…...

【Linux】Linux——Centos7安装Tomcat

1.下载Tomcat 安装包 官网地址&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloadshttps://tomcat.apache.org/download-90.cgi 2.将下载的安装包上传到 Xftp 上&#xff0c;我是直接放到 usr 下了 3.将安装包解压到 /usr/local/ tar -zxvf apache-tomcat-9.0.8…...

SpringBoot+vue实现右侧登录昵称展示

目录 1. 定义User数据 1.1.在created方法获取数据 1.2.头部导航栏绑定User数据 1.3.在data中定义User数据 2. 获取数据 2.1.接收父组件传递的值 2.2.展示数据 3. 页面效果 在SpringBoot和 Vue.js 结合的项目中实现右侧登录昵称展示&#xff0c;通常涉及到前端的用户界面…...

【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式

文章目录 一、UDP协议1.UDP的传输流程发送方接收方 2.UDP协议报文格式&#xff1a;长度受限校验和如何校验&#xff1a;CRC算法&#xff1a;循环冗余算法md5算法&#xff1a; 2.UDP的特点 二、开发中常见的自定义格式1.xml&#xff08;古老&#xff09;2.json&#xff08;最流行…...

NodeJs入门知识

**************************************************************************************************************************************************************************** 1、配置Node.js与npm下载&#xff08;精力所致&#xff0c;必有精品&#xff09; …...

代码随想录学习Day 34

62.不同路径 题目链接 讲解链接 动归五部曲&#xff1a; 1.确定dp数组及其下标的含义&#xff1a;dp[i][j]的含义是从(0, 0)走到(i, j)所需的步数&#xff1b; 2.确定递推公式&#xff1a;因为只能往右或者往下&#xff0c;所以dp[i][j] dp[i - 1][j] dp[i][j - 1]。 3.…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...