Opencv计算机视觉编程攻略-第十三节 跟踪视频中的物品
这是opencv系列的最后一节,主要学习视频序列,上一节介绍了读取、处理和存储视频的工具,本文将介绍几种跟踪图像序列中运动物体的算法。可见运动或表观运动,是物体以不同的速度在不同的方向上移动,或者是因为相机在移动(或者两者都有)。在很多应用程序中,跟踪表观运动都是极其重要的。它可用来追踪运动中的物体,以测定它们的速度、判断它们的目的地。对于手持摄像机拍摄的视频,可以用这种方法消除抖动或减小抖动幅度,使视频更加平稳。运动估值还可用于视频编码,用以压缩视频,便于传输和存储。
目录
1. 跟踪视频中的特征点
2. 估算光流
3. 跟踪视频中的物体
1. 跟踪视频中的特征点
被跟踪的运动可以是稀疏的(图像的少数位置上有运动,称为稀疏运动),也可以是稠密的(图像的每个像素都有运动,称为稠密运动)。在启动跟踪过程时,首先要在最初的帧中检测特征点,然后在下一帧中跟踪这些特征点,如果想找到特征点在下一帧的新位置,就必须在它原来位置的周围进行搜索。这个功能由函数cv::calcOpticalFlowPyrLK 实现。在函数中输入两个连续的帧和第一幅图像中特征点的向量,将返回新的特征点位置的向量。
要逐帧地跟踪特征点,就必须在后续帧中定位特征点的新位置。假设每个帧中特征点的强度
值是不变的,这个过程就是寻找如下的位移(u, v):
其中It 和It+1 分别是当前帧和下一个瞬间的帧。强度值不变的假设普遍适用于相邻图像上的
微小位移。我们可使用泰勒展开式得到近似方程式(包含图像导数):
根据第二个方程式,可以得到另一个方程式(根据强度值不变的假设,去掉了两个表示强度
值的项)
这就是基本的光流约束方程,也称作亮度恒定方程,Lukas-Kanade 特征跟踪算法使用了这个约束方程。除此之外,该算法还做了一个假设,即特征点邻域中所有点的位移量是相等的。因此,我们可以将光流约束应用到所有位移量为(u, v)的点(u 和v 还是未知的)。这样就得到了更多的方程式,数量超过未知数的个数(两个),因此可以在均方意义下解出这个方程组。
在实际应用中,我们采用迭代的方法来求解。为了使搜索更高效且适应更大的位移量,OpenCV 还提供了在不同分辨率下进行计算的方法:默认的图像等级数量为3,窗口大小为15,还可以设定一个终止条件,符合这个条件时就停止迭代搜索。
cv::calcOpticalFlowPyrLK 函数的第六个参数是剩余均方误差,用于评定跟踪的质量。第五个参数包含二值标志,表示是否成功跟踪了对应的点。
// 1. 特征点检测方法
void detectFeaturePoints() {// 检测特征点cv::goodFeaturesToTrack(gray, // 图像features, // 输出检测到的特征点max_count, // 特征点的最大数量qlevel, // 质量等级minDist); // 特征点之间的最小差距
}// 2 法根据应用程序定义的条件剔除部分被跟踪的特征点。这里剔除静止的特征点(还有不能被cv::calcOpticalFlowPyrLK 函数跟踪的特征点)。我们假定静止的点属于背景部分,可以忽略:
// 判断需要保留的特征点
bool acceptTrackedPoint(int i) {return status[i] &&// 如果特征点已经移动(abs(points[0][i].x-points[1][i].x)+(abs(points[0][i].y-points[1][i].y))>2);
}// 3 处理被跟踪的特征点,具体做法是在当前帧画直线,连接特征点和它们的初始位置(即第一次检测到它们的位置):
// 处理当前跟踪的特征点
void handleTrackedPoints(cv:: Mat &frame, cv:: Mat &output) {// 遍历所有特征点for (int i= 0; i < points[1].size(); i++ ) {// 画线和圆cv::line(output, initial[i], // 初始位置points[1][i], // 新位置cv::Scalar(255,255,255));cv::circle(output, points[1][i], 3,cv::Scalar(255,255,255),-1);
}
}
2. 估算光流
通常关注视频序列中运动的部分,即场景中不同元素的三维运动在成像平面上的投影。三维运动向量的投影图被称作运动场。但是在只有一个相机传感器的情况下,是不可能直接测量三维运动的,我们只能观察到帧与帧之间运动的亮度模式,亮度模式上的表观运动被称作光流。通常认为运动场和光流是等同的,但其实不一定:典型的例子是观察均匀的物体;例如相机在白色的墙壁前移动时就不产生光流。
估算光流其实就是量化图像序列中亮度模式的表观运动。首先来看视频中某个时刻的一帧画
面。观察当前帧的某个像素(x, y),我们要知道它在下一帧会移动到哪个位置。也就是说,这个点
的坐标在随着时间变化(表示为(x(t), y(t))),而我们要估算出这个点的速度(dx/dt, dy/dt),对应的帧中获取这个点在t 时刻的亮度,表示为I(x(t), y(t),t),根据图像亮度恒定的假设:
这个约束条件可以用基于光流的拉普拉斯算子的公式表示:
现在要做的就是找到光流场,使亮度恒定公式的偏差和光流向量的拉普拉斯算子都达到最
小值,估算稠密光流的方法有很多,可以使用cv::Algorithm的子类cv::DualTVL1OpticalFlow。
所得结果是二维向量(cv::Point)组成的图像,每个二维向量表示一个像素在两个帧之
间的变化值。要展示结果,就必须显示这些向量。为此我们创建了一个函数,用来创建光流场的图像映射。为控制向量的可见性,需要使用两个参数:步长(间隔一定像素)和缩放因子,
// 1. 创建光流算法
cv::Ptr<cv::DualTVL1OpticalFlow> tvl1 = cv::createOptFlow_DualTVL1();
这个实例已经可以使用了,所以只需调用计算两个帧之间的光流场的方法即可:
cv::Mat oflow; // 二维光流向量的图像
// 计算frame1 和frame2 之间的光流
tvl1->calc(frame1, frame2, oflow);// 2. 绘制光流向量图
void drawOpticalFlow(const cv::Mat& oflow, // 光流
cv::Mat& flowImage, // 绘制的图像
int stride, // 显示向量的步长
float scale, // 放大因子
const cv::Scalar& color) // 显示向量的颜色
{
// 必要时创建图像
if (flowImage.size() != oflow.size()) {
flowImage.create(oflow.size(), CV_8UC3);
flowImage = cv::Vec3i(255,255,255);
}
// 对所有向量,以stride 作为步长
for (int y = 0; y < oflow.rows; y += stride)
for (int x = 0; x < oflow.cols; x += stride) {
// 获取向量
cv::Point2f vector = oflow.at< cv::Point2f>(y, x);
// 画线条
cv::line(flowImage, cv::Point(x,y),
cv::Point(static_cast<int>(x + scale*vector.x + 0.5),
static_cast<int>(y + scale*vector.y + 0.5)),
color);
// 画顶端圆圈
cv::circle(flowImage,
cv::Point(static_cast<int>(x + scale*vector.x + 0.5),
static_cast<int>(y + scale*vector.y + 0.5)),
1, color, -1);
}
}
前面使用的方法被称作双DV L1 方法,由两部分组成。第一部分使用光滑约束,使光流梯度的绝对值(不是平方值)最小化;选用绝对值可以削弱平滑度带来的影响,尤其是对于不连续的区域,运动物体和背景部分的光流向量的差别很大。第二部分使用一阶泰勒近似,使亮度恒定约束公式线性化。
3. 跟踪视频中的物体
在很多应用程序中,更希望能够跟踪视频中一个特定的运动物体。为此要先标识出该物体,然后在很长的图像序列中对它进行跟踪。这是一个很有挑战性的课题,因为随着物体在场景中的运动,物体的图像会因视角和光照改变、非刚体运动、被遮挡等原因而不断变化。
import cv2 # type: ignore
import numpy as np
# Illustration of the Median Tracker principle
image1 = cv2.imread("E:/CODE/images/goose/goose130.bmp", 0)
image_show = cv2.imread("E:/CODE/images/goose/goose130.bmp")
#define a regular grid of points
grid = []
x,y,width,height = 290, 100, 65, 40
for i in range(10):for j in range(10):p = (x+i*width/10,y+j*height/10)grid.append(p)
grid = np.array(grid, dtype=np.float32)
#track in next image
image2 = cv2.imread("E:/CODE/images/goose/goose131.bmp",0)
lk_params = []lk_params = dict(winSize=(10, 10),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# ShiTomasi corner detection的参数
feature_params = dict(maxCorners=300,qualityLevel=0.3,minDistance=7,blockSize=7)p0 = cv2.goodFeaturesToTrack(image1, mask=None, **feature_params)
#grid 从22*2 维度调整为22*1*2
grid = grid.reshape(-1,1,2)
kp2, st, err =cv2.calcOpticalFlowPyrLK(image1, image2, grid, None, **lk_params)
#good_new = kp2[st == 1]
for i in grid:cv2.circle(image_show, (int(i[0][0]),int(i[0][1])), 1, (255, 255, 255), 3)for i in kp2:cv2.circle(image_show, (int(i[0][0]),int(i[0][1])), 1, (255, 0, 255), 3)cv2.imshow("Tracked points", image_show)cv2.waitKey()
开始跟踪前,要先在一个帧中标识出物体,然后从这个位置开始跟踪。标识物体的方法就是指定一个包含该物体的矩形(YOLO),而跟踪模块的任务就是在后续的帧中重新识别出这个物体。OpenCV 中的物体跟踪框架类cv::Tracker 包含两个主方法,一个是init 方法,用于定义初始目标矩形;另一个是update 方法,输出新的帧中对应的矩形。中值流量跟踪算法的基础是特征点跟踪。它先在被跟踪物体上定义一个点阵。你也可以改为检测物体的兴趣点,例如采用第8 章介绍的FAST 算子检测兴趣点。但是使用预定位置的点有很多好处:它不需要计算兴趣点,因而节约了时间;它可以确保用于跟踪的点的数量足够多,还能确保这些点分布在整个物体上。默认情况下,中值流量法采用10×10 的点阵。
相关文章:
Opencv计算机视觉编程攻略-第十三节 跟踪视频中的物品
这是opencv系列的最后一节,主要学习视频序列,上一节介绍了读取、处理和存储视频的工具,本文将介绍几种跟踪图像序列中运动物体的算法。可见运动或表观运动,是物体以不同的速度在不同的方向上移动,或者是因为相机在移动…...
10 个最新 CSS 功能已在所有主流浏览器中得到支持
前言 CSS 不断发展,新功能使我们的工作更快、更简洁、更强大。得益于最新的浏览器改进(Baseline 2024),许多新功能现在可在所有主要引擎上使用。以下是您可以立即开始使用的10 CSS新功能。 1. Scrollbar-Gutter 和 Scrollbar-Co…...
[特殊字符] 企业级Docker私有仓库实战:3步搭建Harbor安全仓库,镜像管理从此高效无忧
本文提供 一站式Docker私有仓库部署指南,聚焦企业级镜像管理需求,深入解析Harbor私有仓库的搭建、运维与安全加固全流程。内容涵盖 轻量级Registry快速部署与 Harbor企业级方案对比,手把手演示SSL证书配置、多租户权限控制、镜像漏洞扫描等核…...
一个基于Django的进销存管理系统Demo实现
第一步:创建 Django 项目 bash 复制 django-admin startproject inventory_system cd inventory_system python manage.py startapp erp 第二步:定义数据模型(models.py) python 复制 from django.db import models from d…...
wsl2+ubuntu22.04安装blender教程(详细教程)
本章教程介绍,如何在Windows操作系统上通过wsl2+ubuntu安装blender并运行教程。Blender 是一款免费、开源的 3D 创作套件,广泛应用于建模、动画、渲染、视频编辑、特效制作等领域。它由全球开发者社区共同维护,支持跨平台(Windows、macOS、Linux),功能强大且完全…...
netty中的ChannelPipeline详解
Netty中的ChannelPipeline是事件处理链的核心组件,负责将多个ChannelHandler组织成有序的责任链,实现网络事件(如数据读写、连接状态变化)的动态编排和传播。以下从核心机制、执行逻辑到应用场景进行详细解析: 1. 核心结构与组成 双向链表结构 组成单元:ChannelPipeline…...
使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构
使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构 在现代应用程序中,实时数据处理和高并发性能是至关重要的。本文将介绍如何使用 Python 的多进程和 Socket 技术来接收和解析数据,并将处理后的数据推送到 Kafka,从而实现高效的…...
WinForm真入门(14)——ListView控件详解
一、ListView 控件核心概念与功能 ListView 是 WinForm 中用于展示结构化数据的多功能列表控件,支持多列、多视图模式及复杂交互,常用于文件资源管理器、数据报表等场景。 核心特点: 支持 5种视图模式:Details&…...
FastAPI用户认证系统开发指南:从零构建安全API
前言 在现代Web应用开发中,用户认证系统是必不可少的功能。本文将带你使用FastAPI框架构建一个完整的用户认证系统,包含注册、登录、信息更新和删除等功能。我们将采用JWT(JSON Web Token)进行身份验证,并使用SQLite作…...
【BUG】阿里云服务器数据库远程连接报错
当你遇到 ERROR 2003 (HY000): Cant connect to MySQL server on 47.100.xxx.xx (10061) 错误,这个错误代码 10061 通常意味着客户端无法连接到指定的 MySQL 服务器,原因可能有多种,下面为你分析可能的原因及对应的解决办法。 1. 网络连接问…...
【前端】【React】性能优化三件套useCallback,useMemo,React.memo
一、总览:性能优化三件套 useCallback(fn, deps):缓存函数,避免每次渲染都新建函数。useMemo(fn, deps):缓存值(计算结果),避免重复执行计算。React.memo(Component):缓存组件的渲染…...
Vue3性能优化终极指南:编译策略、运行时调优与全链路监控
一、Vue3性能优化体系框架 1.1 性能优化全景图谱 1.2 关键性能指标定义表 指标测量方式优化目标核心影响因子FCPLighthouse<1.5s资源加载速度LCPPerformance API<2.5s关键资源大小TTIWebPageTest<3.5s主线程阻塞时间Memory UsageChrome DevTools<50MB对象引用策略…...
FISCO BCOS技术架构解析:从多群组设计到性能优化实践
目录 FISCO BCOS整体架构设计 多群组架构与数据隔离机制 交易流程与执行机制 安全架构与隐私保护 性能优化与压测实践 应用案例与生态工具 FISCO BCOS作为中国领先的金融级开源联盟链平台,自2017年由金链盟开源工作组推出以来,已在政务、金融、医疗、版权等众多领域实现…...
Ceph异地数据同步之- S3对象异地同步复制
#作者:闫乾苓 文章目录 关键组件说明数据流说明部署步骤配置主区域配置次要区域S3对象文件同步测试 关键组件说明 在Ceph RGW的多站点复制架构中,Realm、Zonegroup 和 Zone 是关键的组织结构,用于管理多站点的配置和数据同步 Realm(领域)&a…...
iOS按键精灵辅助工具在游戏开发中的创新应用
一、iOS自动化测试辅助工具 在移动游戏开发领域,iOS按键精灵类辅助工具不同于传统的安卓自动化方案,iOS环境下的自动化测试面临更严峻的技术挑战,但通过创新方法仍可实现精准控制。 # 基于图像识别的智能定位算法示例 def find_button(butt…...
3D案例丨多个3D工业相机拼接检测 开启360°新视界
在高速生产线上,经常需要在极短的时间内对工件进行全方位的外观检测,如:线缆直径和直线度检测、锂电池外观缺陷检测、铁轨截面尺寸检测等。 这需要传感器完整还原被测物的截面面轮廓形状,并获取精准的截面轮廓数据。但单一相机的…...
打分函数分类
在分子对接中,打分函数用于评估配体与受体结合的亲和力。不同类型的打分函数有各自的优势和应用场景。常见的打分函数主要分为以下几类: 1. 基于物理(力场)的打分函数 (Force/physics-field-based scoring functions) 这种打分…...
实践 DevOps 项目:使用 Terraform、Helm、SonarQube 和 GitLab CI/CD 在 AWS EKS 上实践全栈部署
在当今快节奏的软件开发领域,自动化至关重要。在本文中,我将向您展示如何构建一个全面的 DevOps 流水线,该流水线能够: 使用 Terraform 预置完整的 AWS 基础设施。部署一个包含私有子网和公共子网、RDS PostgreSQL 以及完整配置的…...
EFT干扰和共模干扰
EFT干扰本质上属于共模干扰的一种具体表现形式,但严格来说不能简单等同于共模干扰。以下从原理、特征及区别角度展开分析: 1. EFT干扰的原理 定义:EFT(Electrical Fast Transient,电快速瞬变脉冲群)干扰是…...
android 下提示 SQLITECIPHER driver not loaded
问题描述: 在android下出现 SQLITECIPHER driver not loaded 错误 解决办法: 在QT的Android目录下面放入 libplugins_sqldrivers_sqlitecipher_arm64-v8a.so...
[D1,2]回溯刷题
文章目录 组合 组合 回溯的基础结构 #组合总和 注意startIndex的更新是用i来更新的,不然会产生重复的组合...
使用 VBA 宏创建一个选择全部word图片快捷指令,进行图片格式编辑
使用 VBA 宏批量选择图片 ✅ 第一步:创建 .dotm 加载项文件 1、使用环境 office word 365,文件格式为.docx 图片格式为.PNG 2、创建 .dotm 加载项文件 打开 Word,新建一个空白文档。 按下 Alt F11 打开 VBA 编辑器。 点击菜单栏ÿ…...
SQL 关键字
SQL 包含许多关键字,这些关键字用于执行各种数据库操作。以下是主要的 SQL 关键字分类: 数据查询语言 (DQL) SELECT - 从数据库中选择数据 FROM - 指定要查询的表 WHERE - 指定查询条件 GROUP BY - 对结果集进行分组 HAVING - 对分组结果进行过滤 …...
从PPT到PNG:Python实现的高效PPT转图工具
从PPT到PNG:Python实现的高效PPT转图工具 在日常工作中,PPT(PowerPoint)文件是我们常用的演示工具。然而,有时候我们需要将PPT的内容提取为图片格式(如PNG)以便于展示或保存。手动将每一页PPT保…...
TCP和UDP协议
前言 TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议;它们在连接方式、可靠性、效率等方面有显著区别。 关键对比 差异总结 可靠性: TCP通过确认应答、重传等机制确保数据可靠传输&#…...
高并发内存池(三):PageCache(页缓存)的实现
前言: 在前两期内容中,我们深入探讨了内存管理机制中在 ThreadCache 和 CentralCache两个层级进行内存申请的具体实现。这两层缓存作为高效的内存分配策略,能够快速响应线程的内存需求,减少锁竞争,提升程序性能。 本期…...
使用pybind11开发可供python使用的c++扩展模块
在做紫微斗数程序的时候用到了padas库,不过也只用了它下面几个功能: 1、读入csv文件,构造DataFrame; 2、通过行列标题查找数据; 3、通过行标题读取一行数据。 用这几个功能却导入了pandas、numpy、dateutil、pytz等一堆库,多少有点划不来,于是想用c++开发一个实现这几…...
系统与网络安全------网络通信原理(5)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 传输层解析 传输层 传输层的作用 IP层提供点到点的连接传输层提供端到端的连接 端口到端口的连接(不同端口号,代表不同的应用程序) TCP协议概述 TCP(Transm…...
JavaScript防抖与节流
目录 防抖(Debounce) 一、防抖的定义 二、防抖的实现原理 三、防抖的代码实现 四、代码解析 五、使用示例 1. 输入框实时搜索(延迟执行模式) 2. 按钮防重复点击(立即执行模式) 六、总结 节流&…...
Java网络编程实战(多人聊天室-CS模式)
一、C/S模式核心原理 1.1 基本架构 C/S(Client/Server)模式采用客户端-服务器架构: 服务器端:持续运行,负责消息路由和广播客户端:用户交互界面,连接服务器进行通信通信协议:TCP&…...
Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类
Vue3.5 Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类型 一、完整依赖安装 npm install --save-dev stylelint stylelint-config-standard postcss-html # 解析 Vue/HTML 文件中的样式postcss-scss …...
23种设计模式Java版(带脑图,带示例源码)
设计模式 1、创建型 1.1、单例模式(Singleton pattern) 确保一个类只有一个实例,并提供该实例的全局访问点。 1.2、工厂方法(Factory Method) 它定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 1.3、抽象…...
mapbox高阶,使用graphology、graphology-shortest-path前端插件和本地geojson数据纯前端实现路径规划
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️graphology 插件1.3.1 ☘️概念1.3.2 ☘…...
【已解决】vscode升级后连接远程异常:“远程主机可能不符合XXX的先决条件”解决方法
vscode提示升级,每次都升了,突然某次关闭后无法连接远程,查询资料是因为从VS Code 1.86.1版本开始(2024年1月)要求glibc版本>2.28。 命令“ ldd --version”可查看glibc版本为2.27: rootXXXXXXX:~$ ld…...
Springboot整合JAVAFX
Springboot整合JAVAFX 实体与VO设计 pom.xml文件如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...
【算法】——一键解决动态规划
前言 动态规划是一种高效解决重叠子问题和最优子结构问题的算法思想。它通过分治记忆化,将复杂问题分解为子问题,并存储中间结果,避免重复计算,从而大幅提升效率。 为什么重要? 优化…...
Git使用与管理
一.基本操作 1.创建本地仓库 在对应文件目录下进行: git init 输入完上面的代码,所在文件目录下就会多一个名为 .git 的隐藏文件,该文件是Git用来跟踪和管理仓库的。 我们可以使用 tree 命令(注意要先下载tree插件)…...
npm、nvm、nrm
NVM (Node Version Manager) 常见指令 NVM 是一个用于管理 Node.js 版本的流行工具,允许你在同一台机器上安装和切换不同版本的 Node.js。以下是 NVM 的常见指令: 安装与卸载 nvm install <version> - 安装指定版本的 Node.js 例如:…...
Java 文件内容转换为MD5哈希值
若要把读取到的 files 列表里的内容转换为 MD5 哈希值,你可以逐个遍历 files 列表中的元素,将每个元素的内容计算成 MD5 哈希值。 以下是一个完整的 Java 示例代码,展示了如何实现这一功能: import java.io.BufferedInputStream…...
未来郴州:科技与自然的交响诗篇
故事背景 故事发生在中国湖南郴州,描绘了未来城市中科技与自然共生共荣的奇妙图景。通过六个充满诗意的场景,展现雾能转化系统、立体生态书库、智能稻田等创新设计,编织出一曲人类智慧与自然韵律共鸣的未来交响。 故事内容 在东江湖的晨雾中&…...
UE5 运行时动态将玩家手部模型设置为相机的子物体
在编辑器里,我们虽然可以手动添加相机,但是无法将网格体设置为相机的子物体,只能将相机设置为网格体的子物体 但是为了使用方便,我们希望将网格体设置为相机的子物体,这样我们直接旋转相机就可以旋转网格体࿰…...
Ubuntu系统下的包管理器APT
Ubuntu系统下的包管理器APT 在Linux操作系统生态中,软件包管理工具是连接用户与系统功能的桥梁。Ubuntu作为基于Debian的流行发行版,其强大的包管理系统APT(Advanced Packaging Tool)为开发者与系统管理员提供了便捷的软件生命周…...
超级码科技发布镂空AI保险胶带,重塑包装防伪新标准
在酒类、物流、奢侈品、电子产品等领域,包装安全与防伪需求日益迫切。传统封箱胶带易被转移或重复利用,导致商品被仿冒的风险居高不下。 为此,超级码科技推出镂空型防揭AI数字身份保险封箱胶带——一款集结构防伪、信息追踪与增值服务于一体的…...
微软Exchange管理中心全球范围宕机
微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖Exchange Online的企业造成广…...
前端通信库fetch-event-source实现丰富的SSE
环境:SpringBoot3.4.0 + Vue3 1. 简介 SSE(Server-Sent Events)是一种基于HTTP的服务器向客户端单向推送实时数据的轻量级协议,配合浏览器原生EventSource API,可实现高效实时通信。前端通过创建EventSource对象订阅服务端流,自动处理连接、重试与数据解析;服务端设置C…...
JVM 中Minor GC、Major GC、Full GC 的区别?
Minor GC、Major GC 和 Full GC 是 Java 虚拟机 (JVM) 垃圾回收 (Garbage Collection) 中的不同类型的 GC 事件,它们在范围、触发条件、停顿时间等方面有所不同。 1. Minor GC (Young GC): 范围: 只针对新生代 (Young Generation) 进行垃圾回收。触发条…...
2747. 统计没有收到请求的服务器数目
文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> countServers(int n, vector<vector<int>>& logs, int x, vector<int>& queries) {sort(logs.begin(), logs.end(), [](vector<int> &a, v…...
设计模式:抽象工厂 - 掌控多产品族的创建之道
一、什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。 核心思想 1.定义多个产品的抽象接口,统一管理具体产品和工厂的创建逻辑。…...
图神经网络+多模态:视频动作分割的轻量高效新解法
一、引言 在智能监控、自动驾驶、人机交互等领域,准确理解视频中的动作序列至关重要。然而,传统方法依赖复杂的视觉模型,计算成本高且难以捕捉长时依赖。近期,一项名为 Semantic2Graph 的研究通过图神经网络(GNN&am…...
技术与情感交织的一生 (五)
目录 初入“江湖” 分工 陌生 CraneOffice 内功 宝典 枪手 回到大二 通关 小聚 唱一首歌 初入“江湖” 分工 软件工作室是坐落在和平区宜昌道的一间民房,和我想象中的公司形象多少有些偏差。天津的道路有点凌乱,初次的时候不太好找…...