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

OpenCv高阶(十一)——物体跟踪

文章目录

  • 前言
  • 一、OpenCV 中的物体跟踪算法
    • 1、均值漂移(Mean Shift):
    • 2、CamShift:
    • 3、KCF(Kernelized Correlation Filters):
    • 4、MIL(Multiple Instance Learning):
  • 二、物体跟踪方法
    • 1、基于特征的跟踪方法
      • (1)光流法:
      • (2)特征点跟踪法:
    • 2、基于模型的跟踪方法
    • 3、基于外观模型的跟踪方法
    • 4、基于深度学习的跟踪方法
    • 5、基于检测的跟踪方法
    • 物体跟踪的一般步骤
  • 三、常见的物体跟踪器介绍
  • 四、调用摄像头物体跟踪
    • 1、分步讲解
      • (1)导库并创建
      • (2)读取摄像头对象或者读取视频
      • (3)循环读取视频的每一帧
      • (4)当按下键盘中的S键时,开始追踪
        • cv2.selectROI() 函数
        • tracker.init(frame, roi)
      • (5)当Tracking为True时条件满足,更新位置,绘制被追踪物体的外接矩形
      • (6)这里表示摄像头显示每一毫秒读取一帧画面,当按下ESC键时跳出循环,停止读取,并释放摄像头资源,摧毁窗口,减少内存的占用。
    • 完整代码
  • 五、应用
    • 视频监控领域
    • 智能交通领域
    • 体育领域
    • 虚拟现实和增强现实领域
    • 医学领域


前言

物体跟踪是在视频序列或图像流中持续监测和定位特定物体的过程。通过分析相邻帧之间物体的特征和位置变化,实现对物体运动的跟踪。

一、OpenCV 中的物体跟踪算法

1、均值漂移(Mean Shift):

基于概率分布的跟踪算法。它通过计算目标区域的颜色直方图,在后续帧中搜索与该直方图最匹配的区域,从而实现目标跟踪。该算法计算速度快,但对目标的尺度变化和旋转不鲁棒。

2、CamShift:

是均值漂移算法的扩展。它不仅能跟踪目标的位置,还能根据目标的大小和形状自适应地调整搜索窗口的大小和方向,对目标的尺度变化有一定的适应性。

3、KCF(Kernelized Correlation Filters):

基于相关滤波的跟踪算法。它利用核函数将目标特征映射到高维空间,通过学习目标的外观模型,在后续帧中快速定位目标。KCF 算法具有较高的跟踪精度和速度,对光照变化和部分遮挡有较好的鲁棒性。

4、MIL(Multiple Instance Learning):

采用多示例学习的方法来训练目标模型。它将目标区域划分为多个子区域,通过学习这些子区域的特征来跟踪目标。MIL 算法对遮挡和背景干扰具有较好的鲁棒性,但计算复杂度较高,跟踪速度相对较慢。

二、物体跟踪方法

1、基于特征的跟踪方法

(1)光流法:

光流是指图像中物体表面上的点在图像平面上的运动速度。通过计算相邻帧之间像素点的光流场,可以得到物体的运动信息,进而实现物体跟踪。该方法对物体的运动较为敏感,但对光照变化和噪声的鲁棒性相对较差。

(2)特征点跟踪法:

首先在图像中提取一些具有独特性和稳定性的特征点,如 SIFT、SURF、ORB 等特征点。然后在后续帧中通过匹配这些特征点来跟踪物体的运动。这种方法对物体的旋转、尺度变化和光照变化有一定的适应性,但当特征点被遮挡或丢失时,可能会影响跟踪效果。

2、基于模型的跟踪方法

模板匹配法:在第一帧中手动或自动选择一个目标模板,然后在后续帧中通过搜索与模板最相似的区域来定位目标。常用的相似性度量方法有归一化互相关(NCC)等。该方法简单直观,但对目标的尺度变化、旋转和光照变化的适应性较差,且计算量较大。

3、基于外观模型的跟踪方法

通过学习目标物体的外观模型来进行跟踪。例如,使用主成分分析(PCA)等方法对目标的图像特征进行降维,建立目标的外观模型。在跟踪过程中,根据当前帧的图像特征与外观模型的匹配程度来确定目标的位置。这种方法对目标的外观变化有一定的适应性,但需要大量的训练数据来建立准确的外观模型。

4、基于深度学习的跟踪方法

孪生网络:孪生网络是一种基于深度学习的物体跟踪方法,它通过孪生结构的神经网络学习目标与搜索区域之间的相似性度量。在训练过程中,孪生网络通过大量的图像对来学习如何区分目标物体和背景,从而能够在新的视频序列中快速准确地定位目标。孪生网络具有较高的跟踪精度和速度,对各种复杂场景和目标变化具有较好的鲁棒性。

5、基于检测的跟踪方法

利用深度学习目标检测算法,如 Faster R-CNN、YOLO 等,在每一帧中对目标进行检测,然后通过数据关联算法将不同帧中的检测结果进行关联,实现物体跟踪。这种方法能够利用深度学习强大的特征提取能力,对目标的检测和跟踪效果较好,但计算量较大,实时性相对较差。

物体跟踪的一般步骤

目标初始化:在第一帧图像中指定要跟踪的目标物体,可以通过手动选择目标区域或使用目标检测算法来确定目标的初始位置和大小。
特征提取:根据选择的跟踪算法,提取目标物体的特征,如颜色、纹理、形状等。这些特征将用于在后续帧中识别和定位目标。
跟踪过程:在后续的视频帧中,根据上一帧的跟踪结果,利用选定的跟踪算法在当前帧中搜索目标物体的新位置。算法会根据目标的特征和运动模型,预测目标可能出现的位置,并在该区域内进行匹配和定位。
结果更新:将当前帧中目标的位置和状态信息更新到跟踪器中,以便为下一帧的跟踪提供初始条件。同时,根据需要可以对目标的特征模型进行在线学习和更新,以适应目标外观的变化。

三、常见的物体跟踪器介绍

1、BOOSTING 跟踪器
原理:基于 AdaBoost 算法,通过迭代训练多个弱分类器并组合成强分类器。在跟踪过程中,不断利用样本更新分类器,以区分目标和背景。
特点:
精度较低,在目标外观变化、光照变化或存在遮挡时,容易丢失目标。
计算速度较慢,实时性较差。
对目标外观变化的适应性较弱。
适用场景:适用于目标外观相对稳定、光照变化小且对精度要求不高的简单场景。

import cv2boosting_tracker = cv2.legacy.TrackerBoosting_create()

2、MIL(Multiple Instance Learning)跟踪器
原理:采用多示例学习方法,将目标区域划分为多个子区域(示例),通过学习这些子区域的特征来训练目标模型。在跟踪时,根据模型匹配目标位置。
特点:
对部分遮挡有一定的鲁棒性,能够在目标被部分遮挡时继续跟踪。
跟踪精度一般,当目标快速运动或外观变化剧烈时,跟踪效果不佳。
计算复杂度较高,速度较慢。
适用场景:适用于目标可能会被部分遮挡,但运动速度相对较慢、外观变化不太剧烈的场景。

import cv2mil_tracker = cv2.legacy.TrackerMIL_create()

3、 KCF(Kernelized Correlation Filters)跟踪器
原理:基于相关滤波的方法,通过核函数将目标特征映射到高维空间,学习目标的外观模型,在后续帧中利用相关滤波快速定位目标。
特点:
跟踪速度快,具有较好的实时性。
对目标的尺度变化和部分遮挡有一定的适应性。
精度相对较高,但在目标外观发生较大变化时,跟踪效果会受到影响。

适用场景:适用于对实时性要求较高,目标外观变化不大、运动速度适中的场景。

import cv2kcf_tracker = cv2.TrackerKCF_create()

4、CSRT(Discriminative Correlation Filter with Channel and Spatial Reliability)跟踪器
原理:同样基于相关滤波,通过引入通道和空间可靠性信息,提高目标跟踪的精度和鲁棒性。
特点:
跟踪精度高,在目标外观变化、尺度变化和遮挡等情况下,都能保持较好的跟踪效果。
计算速度相对较慢,实时性不如 KCF 跟踪器。
适用场景:适用于对跟踪精度要求较高,目标外观和尺度可能会发生变化,且存在一定遮挡的复杂场景。

import cv2csrt_tracker = cv2.legacy.TrackerCSRT_create()

5、MEDIANFLOW 跟踪器
原理:基于光流法,通过计算目标区域内像素点的光流,预测目标在后续帧中的位置。使用中值流的方法来提高跟踪的稳定性。
特点:
跟踪速度快,能够实时处理视频流。
对目标的运动速度和方向变化较为敏感,在目标运动平稳时,跟踪效果较好。
对遮挡和外观变化的鲁棒性较差,容易丢失目标。
适用场景:适用于目标运动平稳、无明显遮挡和外观变化的场景,如监控视频中的静态场景跟踪。

import cv2medianflow_tracker = cv2.legacy.TrackerMedianFlow_create()

6、TLD(Tracking - Learning - Detection)跟踪器
原理:结合了跟踪(Tracking)、学习(Learning)和检测(Detection)三个模块。跟踪模块负责在当前帧中预测目标的位置;学习模块不断更新目标的外观模型;检测模块用于在整个图像中搜索目标,以应对目标丢失或遮挡的情况。
特点:
对目标的长期跟踪效果较好,能够在目标长时间消失后重新检测到目标。
容易产生漂移问题,即跟踪结果逐渐偏离真实目标。
计算量较大,实时性较差。
适用场景:适用于需要对目标进行长时间跟踪,且目标可能会暂时消失或被遮挡的场景。

import cv2tld_tracker = cv2.legacy.TrackerTLD_create()

四、调用摄像头物体跟踪

1、分步讲解

(1)导库并创建

import cv2tracker=cv2.TrackerCSRT_create()	#创建CRST跟踪器
tracking=False	#tracking 一般用来表示是否处于跟踪状态。False 意味着当前并未开始跟踪目标。

(2)读取摄像头对象或者读取视频

cap=cv2.VideoCapture(0)	

写零表示调用电脑自身的摄像头,里面还可以传视频文件(传入参数为视频的保存路径)

(3)循环读取视频的每一帧

while True:ret,frame=cap.read()	#使用read读取,视频或摄像头中的每一帧,ret表示视频是否读取成功,frame是指每一帧图像画面。if not ret:		#表示视频读取失败,则跳出循环break

(4)当按下键盘中的S键时,开始追踪

if cv2.waitKey(1)==ord('s'):tracking=Trueroi=cv2.selectROI('Tracking',frame,showCrosshair=False)tracker.init(frame,roi)
cv2.selectROI() 函数

其作用是让用户手动选取视频帧里的一个感兴趣区域(Region of Interest,简称 ROI)。
1、 ‘Tracking’:这是弹出的选择窗口的标题,当运行代码时,会出现一个名为 Tracking 的窗口,用户可以在这个窗口里进行 ROI 的选择操作。
2、frame:这是当前要处理的视频帧,也就是用户选择 ROI 所基于的图像。
3、showCrosshair=False:这个参数控制在选择 ROI 时是否显示十字线。设置为 False 表示不显示十字线;若设置为 True,在选择 ROI 的过程中会显示十字线,方便用户更精准地定位 ROI 的中心位置。
4、cv2.selectROI() 函数在用户完成 ROI 选择后,会返回一个包含 ROI 位置和大小信息的元组 (x, y, w, h),其中:
x 和 y 是 ROI 左上角的坐标。
w 和 h 分别是 ROI 的宽度和高度。

tracker.init(frame, roi)

调用了跟踪器对象 tracker 的 init() 方法,其作用是使用用户选择的 ROI 来初始化跟踪器。
1、frame:这是当前的视频帧,也就是用户选择 ROI 所在的那一帧图像。跟踪器会以这一帧为基准,对后续视频帧里的目标进行跟踪。
2、roi:这是前面通过 cv2.selectROI() 函数得到的 ROI 信息,跟踪器会根据这个 ROI 来确定要跟踪的目标。

(5)当Tracking为True时条件满足,更新位置,绘制被追踪物体的外接矩形

if tracking:success,box=tracker.update(frame)if success:x,y,w,h=[int(v) for v in box]cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow('Tracking',frame)

success, box = tracker.update(frame)
调用了跟踪器对象 tracker 的 update() 方法,用于在当前视频帧 frame 中更新目标的位置。

返回值:
1、success:一个布尔值,用于表示目标跟踪是否成功。如果成功跟踪到目标,success 为 True;否则为 False。
2、 box:一个包含目标位置和大小信息的元组,通常格式为 (x, y, w, h),其中 x 和 y 是目标矩形框左上角的坐标,w 和 h 分别是矩形框的宽度和高度。

(6)这里表示摄像头显示每一毫秒读取一帧画面,当按下ESC键时跳出循环,停止读取,并释放摄像头资源,摧毁窗口,减少内存的占用。

if cv2.waitKey(1)==27:break
cap.release()
cv2.destroyAllWindows()

完整代码

import cv2tracker=cv2.TrackerCSRT_create()
tracking=Falsecap=cv2.VideoCapture(0)		#写零表示调用电脑自身的摄像头,里面还可以传视频文件(传入参数为视频的保存路径)
while True:ret,frame=cap.read()if not ret:breakif cv2.waitKey(1)==ord('s'):tracking=Trueroi=cv2.selectROI('Tracking',frame,showCrosshair=False)tracker.init(frame,roi)if tracking:success,box=tracker.update(frame)if success:x,y,w,h=[int(v) for v in box]cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow('Tracking',frame)if cv2.waitKey(1)==27:break
cap.release()
cv2.destroyAllWindows()

五、应用

物体跟踪在多个领域都有广泛的应用

视频监控领域

行为分析:通过对监控视频中人物或物体的跟踪,分析其行为模式,如是否有异常徘徊、奔跑等行为,可用于公共场所的安全监控,及时发现潜在的安全威胁。
事件检测:检测特定事件的发生,如检测商场中的顾客摔倒、打架等行为,以便及时采取相应措施。

智能交通领域

车辆跟踪与流量监测:在交通路口或高速公路上,对车辆进行跟踪,获取车辆的行驶速度、轨迹等信息,从而实现交通流量的统计和分析,为交通管理部门提供决策依据,优化交通信号灯时长和道路规划。
辅助自动驾驶:在自动驾驶车辆中,物体跟踪技术可以实时跟踪周围的车辆、行人、交通标志等物体,为车辆的决策和控制提供重要信息,帮助车辆避免碰撞、规划行驶路径等。

体育领域

运动员表现分析:在体育比赛中,通过跟踪运动员的运动轨迹和动作,可以对运动员的表现进行分析,帮助教练和运动员了解技术动作的优缺点,制定训练计划,提高运动成绩。
比赛转播:在体育赛事转播中,物体跟踪技术可以实时跟踪运动员和球的位置,为观众提供更丰富的比赛信息,如球员的跑动距离、速度、传球路线等,增强比赛的观赏性和专业性。

虚拟现实和增强现实领域

交互体验:在虚拟现实和增强现实应用中,通过跟踪用户的头部、手部等身体部位的运动,实现与虚拟环境的自然交互。例如,用户可以通过头部转动来观察虚拟场景,通过手部动作来操作虚拟物体。
场景重建:物体跟踪技术可以帮助重建真实场景的三维模型,将虚拟元素与真实场景更好地融合,提高增强现实应用的沉浸感。

医学领域

手术导航:在手术过程中,通过跟踪手术器械和患者体内的器官、组织等,为医生提供实时的位置信息,辅助医生进行精确的手术操作,提高手术的安全性和准确性。
康复治疗:在康复治疗中,跟踪患者的肢体运动,评估康复训练的效果,为康复治疗方案的调整提供依据。

相关文章:

OpenCv高阶(十一)——物体跟踪

文章目录 前言一、OpenCV 中的物体跟踪算法1、均值漂移(Mean Shift):2、CamShift:3、KCF(Kernelized Correlation Filters):4、MIL(Multiple Instance Learning)&#xf…...

第一章:Model Context Protocol (MCP)

Chapter 1: Model Context Protocol (MCP) 🌟 为什么需要MCP? 想象你正在训练一只小狗,希望它能听懂你的指令并执行任务。但如果你和小狗用不同语言交流,它可能完全不知道你的意思。类似地,大型语言模型(L…...

【SAP PP】COOIS报表分析

本文目录 一、基本查询操作 二、订单参数文件 三、COOIS报表增强BADI COOIS报表是PP模块核心报表,是系统中一个功能强大的标准报表,COOIS可查询查询生产订单的状态、进度、组件、工序、报工等信息的综合型报表,,关联了生产订单…...

2025上海车展|紫光展锐发布新一代旗舰级智能座舱芯片平台A888

4月24日,在第二十一届上海国际汽车工业展览会(以下简称“上海车展”)期间,紫光展锐重磅推出新一代旗舰级智能座舱芯片平台A8880,以强劲实力全面助力汽车座舱智能化迈向新征程。 三大核心能力,紧抓市场机遇 …...

蓝牙4.0与蓝牙5.0的区别

蓝牙4.0与蓝牙5.0的主要区别: 传输速度:蓝牙5.0的传输速度是蓝牙4.0的两倍,理论速率可达2Mbps,而蓝牙4.0为1Mbps。 传输距离:蓝牙5.0的传输距离是蓝牙4.0的四倍,在开放空间可达300米,而蓝牙4.0…...

Vue 的单文件组件(.vue 文件)script 标签的使用说明

在 Vue 的单文件组件&#xff08;.vue 文件&#xff09;中&#xff0c;最多可以编写 2 个 <script> 标签&#xff0c;但需要满足特定条件&#xff1a; 1. Vue 3 的情况&#xff08;主流用法&#xff09; 从 Vue 3.2 开始&#xff0c;官方支持以下两种形式共存&#xff1…...

TIM输入捕获知识部分

越往左&#xff0c;频率越高&#xff1b;越往右&#xff0c;频率越低。【越紧凑&#xff0c;相同时间&#xff0c;次数越多】 计算频率的方法&#xff1a;测评法、测周法、中界频率。 频率的定义&#xff1a;1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…...

【数据可视化-30】Netflix电影和电视节目数据集可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

多线程事务?拿捏!

场景:有一批1万或者10万数据&#xff0c;插入数据库&#xff0c;怎么做 事务中进行批量提交 publList<List<OrderPo>> partition Lists.partition(list, 450);StopWatch stopWatch new StopWatch();stopWatch.start();// 顺序插入for (List<OrderPo> sub…...

Spring Boot 自动配置深度解析:从源码结构到设计哲学

Spring Boot 自动配置深度解析&#xff1a;从源码结构到设计哲学 为什么自动配置如此重要&#xff1f; 在传统 Spring 开发中&#xff0c;开发者要手动配置大量 XML 或 JavaConfig&#xff0c;过程繁琐、重复且容易出错。Spring Boot 引入自动配置机制&#xff0c;极大地简化…...

Linux下载与安装——笔记

Linux 是一种自由和开放源代码的 操作系统&#xff08;OS&#xff09;&#xff0c;其核心&#xff08;Kernel&#xff09;由 Linus Torvalds 于 1991 年首次发布。 1、选择适合的 Linux 发行版 根据使用场景和技术水平选择&#xff1a; 新手入门&#xff1a;Ubuntu&#xff08…...

09前端项目----分页功能

分页功能 分页器的优点实现分页功能自定义分页器先实现静态分页器调试分页器动态数据/交互 Element UI组件 分页器的优点 电商平台同时展示的数据很多&#xff0c;所以采用分页功能实现分页功能 Element UI已经有封装好的组件&#xff0c;但是也要掌握原理&#xff0c;以及自定…...

头歌之动手学人工智能-机器学习 --- PCA

目录 第1关&#xff1a;维数灾难与降维 第2关&#xff1a;PCA算法流程 任务描述 编程要求 测试说明 第3关&#xff1a;sklearn中的PCA 任务描述 编程要求 测试说明 第1关&#xff1a;维数灾难与降维 第2关&#xff1a;PCA算法流程 任务描述 本关任务&#xff1a;补充…...

Spring 中的循环引用问题

本章来聊聊Spring 中的循环引用问题该如何解决。这里聊的很粗糙&#xff0c;并没有那么细节&#xff0c;只是大概了解了一点。 什么是循环引用&#xff1f; 如下图所示&#xff1a; 图中有两个类&#xff0c;一个 Class A &#xff0c;A 中又引用了 B&#xff0c;Class B 中又…...

SIGGRAPH投稿相关官方指导

author instruction https://www.siggraph.org/preparing-your-content/author-instructions/ 使用latex模板 https://research.siggraph.org/blog/guides/how-to-use-the-acm-siggraph-tog-latex-template/ 格式要求&#xff08;字体、页面大小等&#xff09; https://sa202…...

Python学习笔记(三)(程序流程控制)

文章目录 一、条件语句&#xff08;if/elif/else&#xff09;语法&#xff1a;示例&#xff1a; 二、循环语句1. for 循环语法&#xff1a;示例&#xff1a; 2. while 循环语法&#xff1a;示例&#xff1a; 三、循环控制语句1. break&#xff1a;立即终止循环2. continue&…...

onnx注册cpu版flashattention

摘要 本教程展示了如何在 ONNX Runtime 中注册一个 CPU 可执行的 FlashAttention 算子。首先,可以直接升级到 ONNX Runtime v1.16 及以上,以获得内置的 FlashAttention CPU 实现citeturn0search2;其次,演示了如何通过 ONNX Runtime 的 Custom Op 接口自定义实现并注…...

WebAssembly:开启高性能Web应用新时代

一、引言 随着互联网技术的飞速发展&#xff0c;Web应用的复杂度和性能要求越来越高。传统的Web开发技术&#xff0c;如JavaScript&#xff0c;虽然功能强大&#xff0c;但在处理复杂计算和高性能需求时仍存在一些局限性。WebAssembly&#xff08;简称Wasm&#xff09;作为一种…...

【前端】手写代码输出题易错点汇总

不定期补充。 目录 异步事件循环this作用域/变量提升/闭包原型/继承 异步事件循环 const promise new Promise((resolve, reject) > {console.log(1);console.log(2); }); promise.then(() > {console.log(3); }); console.log(4); //1 //2 //4promise.then 是微任务&…...

STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer

导言 如上所示&#xff0c;在[[STM32F103_HAL库寄存器学习笔记19 - CAN发送中断CAN接收中断接收所有CAN报文ringbuffer数据结构]]的基础上&#xff0c;为CAN发送端也引入了ringbuffer&#xff08;环形缓冲区&#xff09;机制。CAN发送有三个发送邮箱&#xff0c;为什么还另外需…...

小白自学python第二天

学习python的第二天 一、判断语句 1、布尔类型和比较运算符 1、布尔类型 表示现实生活中的逻辑&#xff0c;真&#xff08;True&#xff0c;用数字1表示&#xff09;和假&#xff08;False&#xff0c;用数字0表示&#xff09; 2、布尔类型变量的定义 变量的名称 布尔类…...

JavaScript 异步编程与请求取消全指南

JavaScript 异步编程与请求取消全指南 涵盖&#xff1a;同步/异步、Promise、async/await、AbortController、前后端协作 一、同步与异步 1. 同步&#xff08;Synchronous&#xff09; 定义&#xff1a;代码按顺序执行&#xff0c;前一步完成才能执行下一步。特点&#xff1…...

Redis 核心应用场景

高性能缓存 Redis 作为内存数据库&#xff0c;读写性能可达10万 QPS&#xff0c;适合缓存热点数据&#xff08;如商品详情、用户会话&#xff09;&#xff0c;显著降低数据库压力。通过设置过期时间&#xff08;TTL&#xff09;自动清理非热点数据&#xff0c;推荐结合allkeys-…...

KMS工作原理及其安全性分析

在当今数字化时代&#xff0c;数据安全已经成为企业和个人最为关注的话题之一。随着云计算和大数据的快速发展&#xff0c;如何安全地管理密钥成为了一个重要的挑战。KMS&#xff08;Key Management Service&#xff0c;密钥管理服务&#xff09;作为一种专业的密钥管理解决方案…...

施磊老师基于muduo网络库的集群聊天服务器(六)

文章目录 客户端开发开始客户端首页面功能为何不逐行开发&#xff1f;客户端CMake代码搭配知识补充--有很多漏的客户端main-登录,注册,退出群组有问题测试 客户端好友添加与聊天功能表驱动设计&#xff1a;commandMapcommandHandlerMap为什么都是int, string添加好友和聊天功能…...

有关字体,语言,字符编码相关的基础知识,询问chatgpt所得

学习这个知识点的背景是&#xff0c;我需要做一个 在canvas 上书写矢量文本的功能&#xff0c; 使用opentype来加载字体文件&#xff0c;并将内容转换为 svg&#xff0c;导入画布。 但是有些字体文件 是不包含 一些其他语言的字符的。就可能出现 “无效字符”。 花了点时间研究…...

Obsidian和Ollama大语言模型的交互过程

之前的文章中介绍了Obsidian配合Ollama的使用案例&#xff0c;那么它们是如何配合起来的呢&#xff1f;其实这个问题并不准确&#xff0c;问题的准确描述应该是Obsidian的Copilot插件是如何与Ollama大语言模型交互的。因为Obsidian在这里只是一个载体&#xff0c;核心功能还是C…...

架构-数据库系统

数据库系统 一、数据库系统概述 &#xff08;一&#xff09;课程核心模块 覆盖数据库设计、关系代数、规范化理论、数据控制四大核心模块&#xff0c;旨在构建从理论到实践的完整知识体系至。 &#xff08;二&#xff09;典型应用场景 数据管理&#xff1a;学生信息管理&a…...

【C到Java的深度跃迁:从指针到对象,从过程到生态】第三模块·面向对象深度进化 —— 第十二章 接口:比C函数指针更强大的契约

一、从函数指针到接口契约 1.1 C函数指针的本质限制 C语言通过函数指针实现回调机制&#xff0c;但存在根本性缺陷&#xff1a; 回调函数示例&#xff1a; typedef void (*Logger)(const char*); void process_data(int data, Logger logger) { // ... logger("Pro…...

【HFP】蓝牙语音通话控制深度解析:来电拒接与通话终止协议

目录 一、来电拒接的核心流程与信令交互 1.1 拒接场景的分类与触发条件 1.2 HF 端拒接流程 1.3 AG 端拒接流程 二、通话终止流程&#xff1a;主动断开与异常中断 2.1 终止场景的界定 2.2 HF 端终止流程 2.3 AG 端终止流程 三、信令协议的核心要素&#xff1a;AT 命令与…...

linux 中断子系统 层级中断编程

虚拟中断控制器代码&#xff1a; #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #include<linux/io.h> #include<linu…...

continue插件实现IDEA接入本地离线部署的deepseek等大模型

文章目录 前言一、IDEA安装continue二、continue部署本地大模型三、continue聊天窗口使用deepseek R1四、continue批量接入硅基流动的模型API 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0c;您的关注是我…...

Redis-缓存应用 本地缓存与分布式缓存的深度解析

Redis缓存场景与策略&#xff1a;本地缓存与分布式缓存的深度解析 在当今高并发、低延迟的互联网架构中&#xff0c;缓存技术是优化系统性能的核心手段之一。Redis作为分布式缓存的标杆&#xff0c;与本地缓存共同构成了缓存体系的两大支柱。然而&#xff0c;两者的适用场景与…...

关于按键映射软件的探索(其一)

那么先说结论——重构了一次&#xff0c;我还是失败了&#xff0c;失败于拓展调整个性化的设计&#xff0c;不过我还是实现了按键监测然后显示的功能。只不过是说我对于WPF软件等的封装和软窗口的功能还是不怎么熟悉。 引言 在许多游戏玩家中&#xff0c;高难度操作&#xff08…...

测试基础笔记第十一天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、查询连接1.内连接2.左连接3.右连接4.左右连接的必要性5.自关联6.普通查询7.子查询8.子查询充当数据源 二、数据库高级扩展内容1.外键2.索引3.验证索引效果案例实…...

优选算法第十讲:字符串

优选算法第十讲&#xff1a;字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘...

RK3588芯片NPU的使用:官方rknn_yolov5_android_apk_demo运行与解读

一、本文的目标 本文将完成两项任务: 官方的调用摄像头动态目标识别例子运行在rk3588的开发板上。解读源码以增加对rknn开发的认识。二、开发环境说明 主机系统:Windows 11目标设备:搭载RK3588芯片的安卓开发板核心工具:Android Studio Koala | 2024.1.1 Patch 2,NDK 27.…...

面试篇:Spring Boot

基础概念 Spring Boot的核心优势是什么&#xff1f; Spring Boot 的核心优势如下&#xff1a; 自动配置&#xff1a;根据项目中的依赖自动进行配置&#xff0c;减少了大量的手动配置工作。 内嵌服务器&#xff1a;内置 Tomcat、Jetty 等容器&#xff0c;应用可以直接运行为一…...

开源漏洞扫描器:OpenVAS

一、OpenVAS介绍 OpenVAS (Open Vulnerability Assessment System) 是一款功能强大的开源漏洞扫描器。它由 Greenbone Networks 开发和维护&#xff0c;是 Greenbone 安全管理器 (GSM) 产品的基础&#xff0c;同时也有免费的社区版本&#xff08;Greenbone Community Edition&…...

PCB封装主要组成元素

PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;封装是指将电子元件固定在 PCB 上&#xff0c;并实现电气连接的方式。主要包括以下几类。 1. 焊盘&#xff08;Pad&#xff09; 作用&#xff1a;焊盘是 PCB 封装中最重要的元素之一&#xff0c;它是…...

STC8H DMA 串口1全双工中断方式收发通讯C语言

/************* 功能说明 ************** 本例程基于STC8H8K64U为主控芯片的实验箱9进行编写测试&#xff0c;STC8H系列带DMA模块的芯片可通用参考. 串口1全双工中断方式收发通讯程序。 通过PC向MCU发送数据, MCU将收到的数据自动存入DMA空间. 当DMA空间存满设置大小的…...

考研英一学习笔记

2024 年全国硕士研究生招生考试 英语&#xff08;一&#xff09;试题 &#xff08;科目代码&#xff1a;201&#xff09; Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANS…...

深度理解spring——BeanFactory的实现

BeanFactory Spring之BeanFactory什么是BeanFactoryApplicationContext相对BeanFactory实现的功能性扩展1. MessageSource2. ResourcePatternResolver3. ApplicationEventPublisher4. EnvironmentCapable通用ApplicationContext实践实现BeanFactoryBeanFactory后处理器排序让谁…...

半导体---检测和量测

目录 1.简介2.AOI(检测) 1.简介 半导体晶圆制造前道量测和检测设备。 公司产品涵盖光学薄膜量测、光学关键尺寸量测、光学衍射套刻量测、光学集成量测、X射线薄膜量测、X射线材料性能量测、X射线成分及表面污染量测等系列产品及解决方案。 半导体领域的量测和AOI如同半导体制造…...

CentOS 7 磁盘分区详细教程

CentOS 7 磁盘分区详细教程 在服务器管理和运维过程中&#xff0c;磁盘分区是一项基础且重要的操作。合理的磁盘分区可以提高数据存储的安全性、高效性&#xff0c;方便系统管理与维护。本文将详细介绍在 CentOS 7 系统中进行磁盘分区的具体步骤和方法。 一、准备工作 1.1 确…...

EasyRTC音视频实时通话在线教育解决方案:打造沉浸式互动教学新体验

一、方案概述 EasyRTC是一款基于WebRTC技术的实时音视频通信平台&#xff0c;为在线教育行业提供了高效、稳定、低延迟的互动教学解决方案。本方案将EasyRTC技术深度整合到在线教育场景中&#xff0c;实现师生间的实时音视频互动等核心功能&#xff0c;打造沉浸式的远程学习体…...

栈(Stack)和队列(Queue)

栈 栈&#xff08;stack&#xff09;是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。 我们可以将栈近似看作一个桶&#xff0c;要取出桶底的元素&#xff0c;就要将桶顶的元素先取出&#xff0c;再将底部元素取出&#xff0c;也可以叫做后进先出。 这…...

1、AI及LLM基础:Python语法入门教程

Python语法入门教程 ​ 这是一份全面的Python语法入门教程,涵盖了注释、变量类型与操作符、逻辑运算、list和字符串、变量与集合、控制流和迭代、模块、类、继承、进阶等内容,通过详细的代码示例和解释,帮助大家快速熟悉Python语法。 文章目录 Python语法入门教程一、注释二…...

跨境电商关键词分类打标

你是一名顶级的亚马逊关键词分析专家,你将用你的亚马逊运营专业的经验帮助我做精准的关键词打标。 首先你会学习以下的知识内容,以便于你后续的关键词分析。 人群词是什么? 是指直接描述或定位特定用户群体的关键词或标签,用于精准识别目标受众的身份、需求或行为特征。 …...

C# 结构(Struct)

原文&#xff1a;C# 结构&#xff08;Struct&#xff09;_w3cschool 在 C# 中&#xff0c;结构是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构。 结构是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本…...