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

OpenCv高阶(七)——图像拼接

目录

一、图像拼接的原理过程

1. 特征检测与描述(Feature Detection & Description)

2. 特征匹配(Feature Matching)

3. 图像配准(Image Registration)

4. 图像变换与投影(Warping)

5. 图像融合(Blending)

二、图像拼接的简单实现

1、 匹配方法

2、实现上述两个图片的拼接

(1)导入opencv的库以及sys库

(2)定义cv_show()函数

(3)创建特征检测函数detectAndDescribe()

(4)读取待拼接的两张图片并显示在窗口中 

(5)调用detectAndDescribe()函数,获得两个图像的关键点信息,关键点坐标、描述符信息

(6)创建暴力匹配器,进行关键点之间的匹配

(7)绘制匹配成功的关键点之间的连线,使用drawMatchesKnn()匹配方法

(8)透视变换

(9)将图片A填充到指定位置


OpenCV中的图像拼接(Image Stitching)主要基于计算机视觉和图像处理技术,将多张具有重叠区域的图像拼接成一张全景图。其核心原理可以分为以下几个步骤:


一、图像拼接的原理过程

1. 特征检测与描述(Feature Detection & Description)

  • 目标:在不同图像中检测关键特征点(如角点、边缘等),并生成特征描述子。

  • 常用算法

    • SIFT(尺度不变特征变换):对旋转、尺度、光照变化具有鲁棒性。

    • SURF(加速版SIFT):计算速度更快。

    • ORB(Oriented FAST and Rotated BRIEF):轻量级,适合实时应用。

  • 输出:每张图像的特征点坐标及其对应的描述子(特征向量)。

  • 过程:图像拼接的第一步是检测并描述图像中的关键特征点。通过使用如SIFT、SURF或ORB等算法,系统能够提取对尺度、旋转和光照变化具有鲁棒性的特征点(如角点或边缘)。这些算法不仅定位特征点的位置,还会生成对应的特征描述子(如128维的SIFT向量),用于后续的特征匹配。例如,SIFT通过高斯差分金字塔检测极值点并赋予方向,ORB则结合FAST关键点检测和BRIEF二进制描述子以提升效率,从而适应不同场景的需求。下图就是通过sift特征提取找到图像中特征相同的位置。


2. 特征匹配(Feature Matching)

  • 目标:在不同图像的特征点之间建立对应关系。

  • 方法

    • 暴力匹配(Brute-Force Matcher):直接比较所有特征描述子的距离(如欧式距离或汉明距离)。

    • FLANN(快速最近邻搜索):适合大规模数据集,效率更高。

  • 筛选策略

    • 比率测试(Ratio Test):保留匹配距离比值(最近邻/次近邻)小于阈值的匹配对。

    • RANSAC(随机采样一致性):通过迭代剔除误匹配,估计最优几何变换模型(如单应性矩阵)。

  • 过程:在获取特征点后,需在不同图像间建立特征点的对应关系。暴力匹配法直接计算所有特征描述子间的距离(如欧氏距离或汉明距离),而FLANN通过构建高效的数据结构加速最近邻搜索。为排除误匹配,通常会采用比率测试(保留最近邻与次近邻距离比值小于阈值的结果)和RANSAC算法。RANSAC通过随机采样一致性迭代估计最优单应性矩阵,同时剔除不符合几何约束的异常点,确保匹配的准确性。

3. 图像配准(Image Registration)

  • 目标:计算图像间的几何变换关系,对齐图像。

  • 单应性矩阵(Homography Matrix)

    • 描述两个平面之间的透视变换关系(3×3矩阵)。

    • 通过匹配的特征点对求解(至少需要4对点)。

    • 使用 RANSAC 或 LMEDS 算法鲁棒地估计单应性矩阵。

  • 变换模型

    若相机仅旋转(无平移),单应性矩阵能完美对齐图像。若存在视差(如平移),可能需要更复杂的模型(如Bundle Adjustment)。
  • 过程:配准的目标是计算图像间的几何变换关系,通常使用单应性矩阵(3×3矩阵)描述平面间的透视变换。通过至少4对匹配点可求解该矩阵,RANSAC在此过程中进一步优化模型的鲁棒性。若相机仅绕光心旋转(如全景拍摄),单应性矩阵能精确对齐图像;若存在视差(如平移拍摄),则需引入光束法平差(Bundle Adjustment)等优化方法,联合调整多图像的相机参数以减少投影误差。

4. 图像变换与投影(Warping)

  • 目标:将图像投影到同一坐标系(全景画布)。

  • 方法

    • 使用 cv2.warpPerspective() 对图像应用单应性矩阵变换。

    • 根据所有图像的变换结果,计算全景图的尺寸和偏移量。

  • 优化

    • 曝光补偿:调整不同图像的亮度差异。

    • 相机参数优化:若已知相机参数(如焦距),可提升对齐精度。

  • 配准后,需将图像投影到统一坐标系以构建全景画布。使用cv2.warpPerspective()对图像应用单应性变换,并根据所有图像的变换结果计算全景图的尺寸和偏移量。例如,若将第二张图像投影到第一张的坐标系中,需扩展画布以容纳所有像素。此外,需处理因曝光差异导致的亮度不一致问题,可能通过直方图匹配或全局优化调整颜色平衡。


5. 图像融合(Blending)

  • 目标:消除拼接处的缝隙和光照差异,实现平滑过渡。

  • 常用方法

    • 简单混合(Alpha Blending):在重叠区域对像素进行线性加权平均。

    • 多频段融合(Multi-Band Blending)

      • 将图像分解为不同频率的子带(如拉普拉斯金字塔)。

      • 对各频段分别融合,避免高频细节(如边缘)错位。

    • 光照一致性处理:调整重叠区域的亮度和颜色。

  • 最后一步是消除拼接缝隙与光照差异。简单线性混合(Alpha Blending)在重叠区域对像素加权平均,但可能导致模糊。多频段融合则通过拉普拉斯金字塔分解图像,对不同频率的子带分别融合:低频(如光照)平滑过渡,高频(如边缘)保留细节,从而避免重影和错位。对于动态物体(如行人),可通过分割掩模或运动检测排除干扰,进一步提升视觉效果。

二、图像拼接的简单实现

1、 匹配方法

特征匹配的方法: 关键点A与找到的两个关键点 X、Y的欧氏距离分别 d1、d2,且d1<d2。 欧氏距离(关键点A,关键点X)=d1。 欧氏距离(关键点A,关键点Y)=d2。         (1)d1<d2,比值较大:可能不是匹配点,通常是由噪声引起的。         (2)d1<d2,比值较小:是匹配点。

2、实现上述两个图片的拼接

(1)导入opencv的库以及sys库

import cv2
import numpy as np
import sys

(2)定义cv_show()函数

在做opencv项目时,如果想显示一张图片,总会使用到cv2.imshow()和cv2.waitKey()这两个函数,因此,为了方便将该功能封装成一个小的函数方便使用。

def cv_show(name,value):cv2.imshow(name,value)cv2.waitKey(0)

(3)创建特征检测函数detectAndDescribe()

def detectAndDescribe(image):#将输入的图片转化为灰度图gray=cv2.cvtColor(image,cv2.COLOR_BGRA2GRAY)#创建SIFT特征检测器describe=cv2.SIFT_create()#使用SIFT特征检测器,调用detectAndCompute()函数,获得关键特征点的坐标kps和描述符des(kps,des)=describe.detectAndCompute(gray,None)#使用列表生成式将获得到的坐标信息转化为32位的浮点数kps_float=np.float32([kp.pt for kp in kps])#返回关键点、关键点浮点数坐标、描述符return (kps,kps_float,des)

(4)读取待拼接的两张图片并显示在窗口中 

imageA=cv2.imread("../data/imageA.jpg")
cv_show("imageA",imageA)
imageB=cv2.imread("../data/imageB.jpg")
cv_show("imageB",imageB)

(5)调用detectAndDescribe()函数,获得两个图像的关键点信息,关键点坐标、描述符信息

#计算图片特征点及描述符
(kpsA,kps_floatA,desA)=detectAndDescribe(imageA)
(kpsB,kps_floatB,desB)=detectAndDescribe(imageB)

(6)创建暴力匹配器,进行关键点之间的匹配

这里的匹配器会在指纹识别、指验证项目中详细讲解,其中有关Knnmatch()为什么要选择两个点会详细讲解。

#建立暴力匹配器BFmatcher,在匹配大训练集和时使用flannbasematcher
matcher=cv2.BFMatcher()#使用KNN匹配器,使用B去匹配图片A,每次会选取两个结果,一个最近的点一个次近邻的点
rawMatches=matcher.knnMatch(desB,desA,2)good=[]
matches=[]
for m in rawMatches:if len(m)==2 and m[0].distance < 0.65* m[1].distance:good.append(m)matches.append((m[0].queryIdx,m[0].trainIdx))print(len(good))
print(matches)

        这里进行条件判断,判断m的长度是否为2,m是对rawMatches的遍历,所以取到的每个值都会有两个点的信息,所以长度为2,当某一个图中匹配的关键点缺失时就会出现长度小于2的情况。
         并且如果最近点距离当前点的距离小于次近点的距离当前点距离的0.65,则认定这个点是一个比较优秀的点,并将该点保存到good这个列表中,将最近点的两个索引值放到matches这个列表中,这两个索引分别代表,因为是使用图片B去匹配图片A中的点,所以这里表示的是第一个索引queryIdx表示匹配图片中关键点的索引,第二个索引trainIdx则是待匹配的图片A中的关键点索引。

(7)绘制匹配成功的关键点之间的连线,使用drawMatchesKnn()匹配方法

vis=cv2.drawMatchesKnn(imageB,kpsB,imageA,kpsA,good,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('Keypoint Matches',vis)

(8)透视变换

因为图片拍摄角度的不同所以,使用透视变换将图片扶正,将图片转换成同一个弯曲程度的图像

"""透视变换"""
if len(matches)>4:ptsB=np.float32([kps_floatB[i] for (i,_) in matches])ptsA=np.float32([kps_floatA[i] for (_,i) in matches])(H,mask)=cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)
else:print("图片未找到四个以上的匹配点")sys.exit()result=cv2.warpPerspective(imageB,H,(imageB.shape[1]+imageA.shape[1],imageB.shape[0]))
cv_show('resultB',result)

 

因为透视变换是四个点进行匹配,所以这里使用条件判断,当图片A和B之间有四个以上的匹配点时则依次取出图片A和B中的坐标点信息,matches这个列表中,这两个索引分别代表,因为是使用图片B去匹配图片A中的点,所以这里表示的是第一个索引queryIdx表示匹配图片B中关键点的索引,第二个索引trainIdx则是待匹配的图片A中的关键点索引。因此上面使用列表生成式分别取出图片A和B中的关键点,findHomography函数计算变化矩阵,H是变化矩阵,mask是指外点和内点值,图片的宽变成两图片的宽相加。

(9)将图片A填充到指定位置

result[0:imageA.shape[0],0:imageA.shape[1]]=imageA
cv_show('result',result)

相关文章:

OpenCv高阶(七)——图像拼接

目录 一、图像拼接的原理过程 1. 特征检测与描述&#xff08;Feature Detection & Description&#xff09; 2. 特征匹配&#xff08;Feature Matching&#xff09; 3. 图像配准&#xff08;Image Registration&#xff09; 4. 图像变换与投影&#xff08;Warping&…...

​​电商系统用户需求报告(示例)

目录 电商系统用户需求报告​​ ​​1. 引言​​ 1.1 目的 1.2 范围 ​​2. 用户角色与核心需求​​ ​​2.1 消费者​​ ​​2.2 商家​​ ​​2.3 平台管理方​​ ​​3. 非功能性需求​​ ​​4. 业务流程​​ ​​4.1 消费者购物流程​​ ​​4.2 商家入驻流程…...

图像挖掘课程笔记-第一章:了解机器视觉

一、什么是图像挖掘&#xff08;Image Mining&#xff09;&#xff1f; 图像挖掘是一种从大量图像中自动提取有用信息、知识或模式的技术&#xff0c;它融合了图像处理、机器学习、数据库、人工智能、数据挖掘等多个领域的内容。 &#x1f9e0; 图像挖掘与图像处理的区别 图像…...

Spring集合注入Bean

Spring框架中实现Bean集合注入的详细方法 1. 基础自动注入方式1.1 使用Autowired注入List1.2 使用Autowired注入Map 2. 更精细的控制方式2.1 使用Qualifier进行筛选2.2 使用自定义注解筛选 3. Java配置类方式4. 排序注入的Bean集合4.1 使用Order注解4.2 实现Ordered接口 5. 条件…...

实验一 进程控制实验

一、实验目的 1、掌握进程的概念&#xff0c;理解进程和程序的区别。 2、认识和了解并发执行的实质。 3、学习使用系统调用fork()创建新的子进程方法&#xff0c;理解进程树的概念。 4、学习使用系统调用wait()或waitpid()实现父子进程同步。 5、学习使用getpid()和getppi…...

[预备知识]4. 概率基础

概率基础 本章节介绍深度学习中的概率基础知识&#xff0c;包括基本概念、概率分布和统计推断。 1. 概率基础 1.1 基本概念 随机变量&#xff1a;可以取不同值的变量&#xff0c;其值由随机试验的结果决定概率分布&#xff1a;描述随机变量取值的可能性分布条件概率&#x…...

第33周JavaSpringCloud微服务 电商进阶开发

一、课程介绍 1. 定时任务 课程主题 &#xff1a;Spring Cloud 电商进阶开发定时任务定义 &#xff1a;学习什么是定时任务。定时任务学习内容 &#xff1a;定时任务实现方法、cron 表达式。定时任务实践 &#xff1a;在 Spring 中使用 schedule 注解&#xff0c;定期关闭过期…...

基于cubeMX的hal库STM32实现硬件IIC通信控制OLED屏

1、通常的方法是使用软件模拟IIC来实现OLED屏的显示控制&#xff0c;这里用STM32单片机的硬件IIC来实现OLED屏的显示&#xff0c;主控芯片为STM32F103RCT6&#xff0c;正点原子mini开发板。 2、cubemx配置过程 &#xff08;1&#xff09;配置时钟和下载 &#xff08;2&#x…...

游戏工作室为何要更换IP进行多开?工作室使用代理IP要注意什么?

在当今的游戏产业中&#xff0c;游戏工作室为了提升效率、规避风险或突破平台限制&#xff0c;常常需要通过更换IP进行多开操作。这一现象背后涉及技术、商业规则和网络安全等多重因素&#xff0c;而代理IP的选择与使用也成为工作室运营中的关键环节。以下是关于游戏工作室为何…...

postgreSQL 如何使用 dblink

SELECT b.id, flow_name, user_id,u.name FROM bpm_form_info b JOIN vrms_user u on b.user_idu.id dblink SELECT b.id, flow_name, user_id,u.name FROM bpm_form_info b – vrms_user u on b.user_idu.id JOIN dblink( ‘dbnameuser_db userpostgres passwordWs199612’,…...

121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息

🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…...

复盘20250422

深度分析及个股推荐 1. 行业前景与个股逻辑梳理 从提供的股票信息来看&#xff0c;主要涉及以下行业&#xff1a;合成尼古丁&#xff08;电子烟&#xff09;、化工、跨境支付、跨境电商、农药、食品饮料、光刻机、电子商务、造纸等。需结合行业景气度、政策支持、公司核心竞争…...

MQ底层原理

RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件&#xff08;Message Broker&#xff09;&#xff0c;实现了 Advanced Message Queuing Protocol&#xff08;AMQP&#xff09;协议&#xff0c;可以帮助不同应⽤程序之间进⾏通信和数据交换。RabbitMQ 是由 E…...

30分钟编写十大排序算法完成

import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;//排序算法 public class test_04_22 {public static void swap(int[] nums, int i, int j){int temp nums[i];nums[i] nums[j];nums[j] temp;}//冒泡排序-稳定…...

为什么家电主板采用GND走线而不是整面铺GND铜

不管什么接地方式&#xff0c;本质是为了使得电流的回流路径最短。只要电流的回流路径最短&#xff0c;怎么都可以&#xff01; 如下图的芯片的一个信号的回流路径&#xff0c;是一个很糟糕的接地&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&a…...

NVIDIA 自动驾驶技术见解

前言 参与 NVIDIA自动驾驶开发者实验室 活动&#xff0c;以及解读了 NVIDIA 安全报告 自动驾驶 白皮书&#xff0c;本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞&#xff0c;重塑更安全、高效、包容的交通生态。在这一领域&#xff0c;NVI…...

真我推出首款 AI 翻译耳机,支持 32 种语言翻译

2025 年 4 月 22 日&#xff0c;真我手机官微宣布&#xff0c;其首款 AI 翻译耳机 Buds Air7 Pro 将于 4 月 23 日 16 时正式上市1。这款耳机接入了讯飞星火认知大模型 4.0 Ultra&#xff0c;支持中文与 32 种语言面对面翻译&#xff0c;以及同声传译功能。 除了 AI 翻译功能&a…...

如何简化复杂流程提升执行效率

简化复杂流程、提升执行效率的关键在于&#xff1a;聚焦核心目标、减少冗余环节、推动系统自动化、赋能一线决策、流程分级设计。其中&#xff0c;聚焦核心目标 是流程优化的第一步。流程不该为了“流程而流程”&#xff0c;而应服务于业务目标。Gartner在《数字化运营报告》中…...

动态规划算法:完全背包类问题

前言 现在我们考虑下面的问题&#xff1a; &#xff08;1&#xff09;小明有一个背包&#xff0c;背包容积为v&#xff0c;有m种物品&#xff0c;其中第i种物品的价值为val[i]&#xff0c;体积为t[i]&#xff0c;每样物品有无限个&#xff0c;请问背包内物品总价值最大为多少?…...

数据存储方式补码原码反码

1. 关于数据存储&#xff08;补码、原码、反码&#xff09; 有符号类型&#xff08;Signed Types&#xff09; 存储方式&#xff1a;现代计算机普遍采用 补码&#xff08;Two’s Complement&#xff09; 存储有符号整数。 原码&#xff1a;最高位为符号位&#xff08;0正&…...

【AAudio】A2dp sink创建音频轨道的源码流程分析

一、AAudio概述 AAudio 是 Android 8.0(API 级别 26)引入的 C/C++ 原生音频 API,专为需要低延迟、高性能音频处理的应用设计,尤其适用于实时音频应用(如音频合成器、音乐制作工具、游戏音效等)。 1.1 主要特点 低延迟:通过减少音频数据在内核与用户空间之间的拷贝,直…...

黑马点评之Feed流技术实现关注推送与滚动分页查询

Feed流 关注推送也叫做Feed流&#xff0c;直译为“投喂”。为用户持续的提供“沉浸式体验”&#xff0c;通过无限下拉刷新获取新的信息。 Feed流&#xff08;信息流&#xff09;是一种常见的内容分发形式&#xff0c;通过动态更新的内容列表向用户展示个性化或实时信息。典型应…...

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…...

Python 设计模式:模板模式

1. 什么是模板模式&#xff1f; 模板模式是一种行为设计模式&#xff0c;它定义了一个操作的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板模式允许子类在不改变算法结构的情况下&#xff0c;重新定义算法的某些特定步骤。 模板模式的核心思想是将算法的固定部分提取…...

usb2.0的硬件知识(一)

一、USB2.0的硬件知识 1.1 USB2.0速率 USB 2.0协议支持3种速率&#xff1a;低速(Low Speed&#xff0c;1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps)&#xff1b;USB Hub、USB设备&#xff0c;也分为低速、全速、高速三种类型。 1.2 USB2.0硬件线序组成 U…...

LangGraph(二)——QuickStart样例中的第二步

目录 1. 添加依赖2. 官网QuickStart——第二步&#xff1a;用工具增强聊天机器人2.1 Tavily Search2.2 简单测试Tavily Search2.3 添加带工具的ChatBot node2.4 添加tool node2.5 添加条件边2.6 可视化StateGraph2.7 构建聊天循环 参考 1. 添加依赖 LangGraph(一)——QuickStar…...

机器学习第二篇 多变量线性回归

数据集&#xff1a;世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom&#xff0c;来预测幸福指数得分。 文件一&#xff1a;linear&#xff0c;…...

【MCP Node.js SDK 全栈进阶指南】中级篇(3):MCP高级资源设计

前言 在MCP TypeScript-SDK的初级篇中,我们介绍了资源开发的基础知识,包括静态资源与动态资源的创建、资源模板设计与参数提取,以及基本的资源列表与发现机制。随着应用规模的扩大和复杂性的提高,我们需要更加高级的资源设计方案来应对各种挑战。 本文作为中级篇的第三篇…...

PostgreSQL 常用日志

PostgreSQL 常用日志详解 PostgreSQL 提供了多种日志类型&#xff0c;用于监控数据库活动、排查问题和优化性能。以下是 PostgreSQL 中最常用的日志类型及其配置和使用方法。 一、主要日志类型 日志类型文件位置主要内容用途服务器日志postgresql-<日期>.log服务器运行…...

PostgreSQL认证培训推荐机构

首先来看一张2025年4月份db-engines上的数据库排行情况&#xff0c;前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server&#xff0c;排名第四的就是我们今天的主角 - PostgreSQL数据库&#xff0c;从这张图上可以看出&#xff0c;PostgreSQL数据库的上升超非常明显&#x…...

2025年NISP一级题库试题

NISP一级考试只考50道单选题&#xff0c;难度不算大&#xff0c;话不多说&#xff0c;直接上硬菜&#xff01; 1、物理销毁的方式不包括&#xff08;&#xff09; .消磁 B.焚化炉烧毀 C.反复覆写数据 &#xff24;.机器硏磨粉碎 2、信息安全应该建立贯穿信息系统的整个生命周期…...

pip install pymysql报错

python安装pymysql报错解决 【现象】 很多时候会出现安装pip包报错的问题&#xff0c;看过很多网上教程以及ai都是如下说法&#xff1a; 镜像问题pip版本问题ssh证书问题网络问题… 在遇见这些情况时&#xff0c;上述的各种解决方法都一一实验过但最后都是ERROR。 【解决办…...

达梦官方管理工具 SQLark 更新--不仅支持达梦、Oracle、MySQL,还新增 PostgreSQL 数据库!

SQLark 是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;已支持达梦、Oracle、MySQL数据库&#xff1b;在最新的 V3.4 版本中&#xff0c;SQLark 新增了对 PostgreSQL 的支持&#xff0c;兼容 PostgreSQL…...

Windows 同步-互锁变量访问

互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行&#xff08;完全或根本不执行&#xff09;。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说&#xff0c;你最终不会只更新变量的一部分;所有位都以…...

前端学习笔记

文章目录 前端主要内容基于脚手架创建前端工程vue的基本使用axios 路由Vue-Router路由组成嵌套路由 状态管理 vuex心得 前端主要内容 HTML、CSS JavaScript axios Vue基础语法&#xff08;router、vuex、typescript&#xff09; Element UI 基于脚手架创建前端工程 node.js …...

2025-04-22| Docker: --privileged参数详解

在 Docker 中&#xff0c;--privileged 是一个运行容器时的标志&#xff0c;它赋予容器特权模式&#xff0c;大幅提升容器对宿主机资源的访问权限。以下是 --privileged 的作用和相关细节&#xff1a; 作用 完全访问宿主机的设备&#xff1a; 容器可以访问宿主机的所有设备&am…...

Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子

目录 概念 AOP 术语 1. 连接点&#xff08;Jointpoint&#xff09;&#xff1a; 2. 切入点&#xff08;Pointcut&#xff09;&#xff1a; 3. 通知&#xff08;Advice&#xff09;&#xff1a; 4. 方面/切面&#xff08;Aspect&#xff09;&#xff1a; 5. 引入&#xff…...

macOS安全隐私最佳实践分析

1. 引言 随着数字世界的不断扩展&#xff0c;个人和组织面临的安全与隐私威胁也日益增加。作为专业的安全合规与隐私保护研究团队&#xff0c;Kaamel 对 macOS 系统的安全隐私现状进行了全面分析&#xff0c;并提出了一系列最佳实践建议&#xff0c;旨在帮助用户更好地保护自己…...

WeakSet:JavaScript 中容易被忽视的“弱集合”

目录 WeakSet 详解 基本概念 创建 WeakSet WeakSet 的主要方法 WeakSet 的特性 WeakSet 的使用场景 1. 避免内存泄漏&#xff08;DOM 元素管理&#xff09; 2. 临时缓存系统 3. 私有属性模拟 4. 防止循环引用 与其他数据结构的对比 1. WeakSet 没有实例属性 2. We…...

Discuz!+DeepSeek:传统论坛的智能化蜕变之路

在数字化浪潮中&#xff0c;社区论坛作为互联网早期的产物&#xff0c;面临着功能单一、用户体验滞后的发展瓶颈。虎跃办公&#xff08;https://www.huyueapp.com&#xff09;通过Discuz!搭建的网址导航网站&#xff0c;在集成DeepSeek的AI能力后&#xff0c;成功实现了从工具导…...

vs2017中,将CMake构建目录设置在项目目录下

修改CMake构建目录位置 在Visual Studio 2017中&#xff0c;可以通过以下方法将CMake构建目录设置在项目目录下&#xff1a; 修改CMakeSettings.json文件‌&#xff1a; 在VS中生成CMakeSettings.json文件&#xff08;通过点击编译平台按钮如x64-Debug或x64-Release&#xf…...

跨平台.NET 版本 使用率排名

截至2025年4月&#xff0c;跨平台.NET版本的安装使用率排名主要基于版本支持状态、性能优化和企业迁移趋势。以下是结合微软官方政策、行业动态及开发者行为分析的综合结论&#xff1a; 1. .NET 8 (LTS) 占据主导地位 支持周期&#xff1a;作为2023年11月发布的长期支持&…...

基于无障碍跳过广告-基于节点跳过广告

2025-04-22 一些广告的关闭是叉图标&#xff0c;获取到的信息也没什么特征&#xff0c;这种广告怎么跳过 用autojs无障碍的节点定位ui控件位置&#xff0c;点击...

STM32提高篇: WIFI通讯

STM32提高篇: WIFI通讯 一.WIFI通讯介绍1.WiFi的频段5G和2.4G2.WiFi的信道二.ESP32固件烧录及驱动1.一个AT指令响应的完成2.测试其他指令三.Wifi功能初始化和TCP通讯四.volatile关键字一.WIFI通讯介绍 Wi-Fi,又称“无线网路”,是Wi-Fi联盟的商标,一个基于IEEE 802.11标准的…...

资本怪兽贝莱德投资数据分析报告-独家

贝莱德概述 贝莱德集团是全球最大的资产管理公司&#xff0c;其管理的资产规模达到了11.6万亿美元(约合人民币84.18万亿元)&#xff0c;这个数字相当于中国2024年GDP的62%。贝莱德通过收购李嘉诚旗下的43个全球港口资产&#xff0c;将在全球运营约100个港口。此外&#xff0c;…...

操作系统-用户级-内核级线程

一、先明确几个基本概念&#xff1a; 用户级线程&#xff08;ULT&#xff09;&#xff1a; 完全由用户空间的线程库&#xff08;如 pthread 或 green threads&#xff09;管理。 操作系统内核对此一无所知。 切换线程时&#xff0c;不需要进入内核&#xff0c;效率高&#xf…...

【深度学习】LoRA:低秩适应性微调技术详解

LoRA&#xff1a;低秩适应性微调技术详解 文章目录 LoRA&#xff1a;低秩适应性微调技术详解1. 引言2. LoRA原理解析2.1 核心思想2.2 数学表达 3. LoRA实现细节3.1 适用层选择3.2 缩放因子3.3 初始化策略 4. 代码实现示例5. LoRA在实际应用中的优势5.1 内存效率5.2 训练速度5.3…...

研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

树莓派超全系列教程文档--(40)树莓派config.txt旧版GPIO控制、超频及条件过滤器

树莓派config.txt旧版GPIO控制、超频及条件过滤器 传统GPIO控制enable_jtag_gpio 传统超频选项超频never_over_voltagedisable_auto_turbo 遗留条件过滤器The [HDMI:*] 过滤器 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 传统GPIO控制 &…...

网络基础概念(下)

网络基础概念&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147261091?sharetypeblogdetail&sharerId147261091&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 网络传输的基本流程 局域网网络传输流…...