【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> <!-- 本地视频元素,用于显示本地视频 --><video ref"r…...
IndyTcpServer使用详解
1、IndyTCPserver的创建 IdTCPServer1.DefaultPort:= 8000; IdTCPServer1.ListenQueue:= 1024; //同时处理请求队列数限制 IdTCPServer1.MaxConnections:= 1024; //同时连接数量限制,为0不限制连接数 IdTCPServer1.ContextClass:= TNewIdServerContext; //设置为自定义TIdSe…...
pytest + yaml 框架 - 参数化读取文件路径优化
针对小伙伴提出参数化时读取外部文件,在项目根路径运行没问题,但是进入到项目下子文件夹运行用例,就会找不到文件问题做了优化。 关于参数化读取外部文件相关内容参考前面这篇pytest yaml 框架 -25.参数化数据支持读取外部文件txt/csv/json/…...
C++:多态-重写和重载
重写(Override)和重载(Overload)是面向对象编程中常用的两个概念,它们虽然都涉及到方法的定义,但是在实现和使用上有着不同的特点。 重写(Override): 重写是指在子类中重…...
element ui的table多选
使用el-table的selection-change事件来获取选中的值; 例: html代码: <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…...
python基础---基础运算
基础运算 可以使用type获取一个变量的类型 常见的数据类型 整形, 可以存储任意大小的整数, 支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)…...
【数学】泰勒公式
目录 引言 一、泰勒公式 1.泰勒公式及推导 (1)推导 (2)公式 2.泰勒中值定理 (1)定理1(佩亚诺余项) (2)定理2(拉格朗日余项) …...
C++基础-编程练习题及答案
文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中, 有这样一种数非常怪, 它们不在第一个, 也不在最后一个&…...
eNSP-抓包解析HTTP、FTP、DNS协议
一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议,建立在TCP协议之上 2.http请求 3.http响应 请求响应报文参考:https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…...
【栈】Leetcode 验证栈序列
题目讲解 946. 验证栈序列 算法讲解 在这里就只需要模拟一下这个栈的出栈顺序即可:使用一个stack,每次让pushed里面的元素入栈,如果当前栈顶的元素等于poped容器中的当前元素,因此就需要让栈顶元素出栈,poped的遍历…...
【数据库原理及应用】期末复习汇总高校期末真题试卷08
试卷 一、选择题(每题 2 分,共 30 分) 1. ___ ____是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 2. 数据库类型是按照 来划分…...
每天五分钟深度学习:数学中的极值
本文重点 在数学领域中,极值是一个极其重要的概念,它不仅在纯数学理论研究中占据核心地位,而且在工程、物理、经济等实际应用领域也发挥着不可替代的作用。极值问题涉及函数的最大值和最小值,是微积分学中的一个基本问题。本文旨在详细介绍数学中的极值概念、性质、求解方…...
【Linux】Linux——Centos7安装Tomcat
1.下载Tomcat 安装包 官网地址:Apache Tomcat - Apache Tomcat 9 Software Downloadshttps://tomcat.apache.org/download-90.cgi 2.将下载的安装包上传到 Xftp 上,我是直接放到 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 结合的项目中实现右侧登录昵称展示,通常涉及到前端的用户界面…...
【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式
文章目录 一、UDP协议1.UDP的传输流程发送方接收方 2.UDP协议报文格式:长度受限校验和如何校验:CRC算法:循环冗余算法md5算法: 2.UDP的特点 二、开发中常见的自定义格式1.xml(古老)2.json(最流行…...
NodeJs入门知识
**************************************************************************************************************************************************************************** 1、配置Node.js与npm下载(精力所致,必有精品) …...
代码随想录学习Day 34
62.不同路径 题目链接 讲解链接 动归五部曲: 1.确定dp数组及其下标的含义:dp[i][j]的含义是从(0, 0)走到(i, j)所需的步数; 2.确定递推公式:因为只能往右或者往下,所以dp[i][j] dp[i - 1][j] dp[i][j - 1]。 3.…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
