Lesson4-3:OpenCV图像特征提取与描述---SIFT/SURF算法

news2025/1/18 17:15:21

学习目标

  • 理解 S I F T / S U R F SIFT/SURF SIFT/SURF算法的原理,
  • 能够使用 S I F T / S U R F SIFT/SURF SIFT/SURF进行关键点的检测

SIFT/SURF算法

1.1 SIFT原理

前面两节我们介绍了 H a r r i s Harris Harris S h i − T o m a s i Shi-Tomasi ShiTomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使用同样的窗口,就检测不到角点了。
在这里插入图片描述
所以,下面我们来介绍一种计算机视觉的算法,尺度不变特征转换即 S I F T ( S c a l e − i n v a r i a n t f e a t u r e t r a n s f o r m ) SIFT (Scale-invariant feature transform) SIFT(Scaleinvariantfeaturetransform)。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对等领域。

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

1.1.1 基本流程

L o w e Lowe Lowe S I F T SIFT SIFT算法分解为如下四步:

  1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点。
  2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
  3. 关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
  4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。

我们就沿着 L o w e Lowe Lowe的步骤,对 S I F T SIFT SIFT算法的实现过程进行介绍:

1.1.2 尺度空间极值检测

在不同的尺度空间是不能使用相同的窗口检测极值点,对小的关键点使用小的窗口,对大的关键点使用大的窗口,为了达到上述目的,我们使用尺度空间滤波器。

高斯核是唯一可以产生多尺度空间的核函数。-《Scale-space theory: A basic tool for analysing structures at different scales》。

一个图像的尺度空间 L ( x , y , σ ) L(x,y,σ) L(x,y,σ),定义为原始图像 I ( x , y ) I(x,y) I(x,y)与一个可变尺度的 2 2 2维高斯函数 G ( x , y , σ ) G(x,y,σ) G(x,y,σ)卷积运算 ,即:

L ( x , y , σ ) = G ( x , y , σ ) ∗ I ( x , y ) L(x,y,σ)=G(x,y,σ)∗I(x,y) L(x,y,σ)=G(x,y,σ)I(x,y)

其中:

G ( x , y , σ ) = 1 2 π σ 2 e x 2 + y 2 2 σ 2 G(x,y,σ)= \frac{1}{2πσ^{2}}e^{\frac{x^{2}+y^{2}}{2σ^{2}}} G(x,y,σ)=2πσ21e2σ2x2+y2

σ σ σ是尺度空间因子,它决定了图像的模糊的程度。在大尺度下( σ σ σ值大)表现的是图像的概貌信息,在小尺度下( σ σ σ值小)表现的是图像的细节信息。

在计算高斯函数的离散近似时,在大概 3 σ 3σ 3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。所以,在实际应用中,只计算 ( 6 σ + 1 ) ∗ ( 6 σ + 1 ) (6σ+1)*(6σ+1) (6σ+1)(6σ+1)的高斯卷积核就可以保证相关像素影响。

下面我们构建图像的高斯金字塔,它采用高斯函数对图像进行模糊以及降采样处理得到的,高斯金字塔构建过程中,首先将图像扩大一倍,在扩大的图像的基础之上构建高斯金字塔,然后对该尺寸下图像进行高斯模糊,几幅模糊之后的图像集合构成了一个 O c t a v e Octave Octave,然后对该 O c t a v e Octave Octave下选择一幅图像进行下采样,长和宽分别缩短一倍,图像面积变为原来四分之一。这幅图像就是下一个 O c t a v e Octave Octave的初始图像,在初始图像的基础上完成属于这个 O c t a v e Octave Octave的高斯模糊处理,以此类推完成整个算法所需要的所有八度构建,这样这个高斯金字塔就构建出来了,整个流程如下图所示:

在这里插入图片描述
利用 L o G LoG LoG(高斯拉普拉斯方法),即图像的二阶导数,可以在不同的尺度下检测图像的关键点信息,从而确定图像的特征点。但 L o G LoG LoG的计算量大,效率低。所以我们通过两个相邻高斯尺度空间的图像的相减,得到 D o G DoG DoG(高斯差分)来近似 L o G LoG LoG

为了计算 D o G DoG DoG我们构建高斯差分金字塔,该金字塔是在上述的高斯金字塔的基础上构建而成的,建立过程是:在高斯金字塔中每个 O c t a v e Octave Octave中相邻两层相减就构成了高斯差分金字塔。如下图所示:在这里插入图片描述

高斯差分金字塔的第 1 1 1组第 1 1 1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。概括为 D O G DOG DOG金字塔的第 o o o组第 l l l层图像是有高斯金字塔的第 o o o组第 l + 1 l+1 l+1层减第 o o o组第 l l l层得到的。后续 S i f t Sift Sift特征点的提取都是在 D O G DOG DOG金字塔上进行的

D o G DoG DoG 搞定之后,就可以在不同的尺度空间中搜索局部最大值了。对于图像中的一个像素点而言,它需要与自己周围的 8 8 8 邻域,以及尺度空间中上下两层中的相邻的 18 ( 2 x 9 ) 18(2x9) 182x9个点相比。如果是局部最大值,它就可能是一个关键点。基本上来说关键点是图像在相应尺度空间中的最好代表。如下图所示:
在这里插入图片描述
搜索过程从每组的第二层开始,以第二层为当前层,对第二层的 D o G DoG DoG图像中的每个点取一个 3 × 3 3×3 3×3的立方体,立方体上下层为第一层与第三层。这样,搜索得到的极值点既有位置坐标( D o G DoG DoG的图像坐标),又有空间尺度坐标(层坐标)。当第二层搜索完成后,再以第三层作为当前层,其过程与第二层的搜索类似。当 S = 3 S=3 S=3时,每组里面要搜索 3 3 3层,所以在 D O G DOG DOG中就有 S + 2 S+2 S+2层,在初使构建的金字塔中每组有 S + 3 S+3 S+3层。

1.1.3 关键点定位

由于 D o G DoG DoG对噪声和边缘比较敏感,因此在上面高斯差分金字塔中检测到的局部极值点需经过进一步的检验才能精确定位为特征点。

使用尺度空间的泰勒级数展开来获得极值的准确位置, 如果极值点的 灰度值小于阈值(一般为 0.03 0.03 0.03 0.04 0.04 0.04)就会被忽略掉。 在 OpenCV 中这种阈值被称为 contrastThreshold

D o G DoG DoG 算法对边界非常敏感, 所以我们必须要把边界去除。 H a r r i s Harris Harris 算法除了可以用于角点检测之外还可以用于检测边界。从 H a r r i s Harris Harris 角点检测的算法中,当一个特征值远远大于另外一个特征值时检测到的是边界。那在 D o G DoG DoG算法中欠佳的关键点在平行边缘的方向有较大的主曲率,而在垂直于边缘的方向有较小的曲率,两者的比值如果高于某个阈值(在OpenCV中叫做边界阈值),就认为该关键点为边界,将被忽略,一般将该阈值设置为 10 10 10

将低对比度和边界的关键点去除,得到的就是我们感兴趣的关键点。

1.1.4 关键点方向确定

经过上述两个步骤,图像的关键点就完全找到了,这些关键点具有尺度不变性。为了实现旋转不变性,还需要为每个关键点分配一个方向角度,也就是根据检测到的关键点所在高斯尺度图像的邻域结构中求得一个方向基准。

对于任一关键点,我们采集其所在高斯金字塔图像以r为半径的区域内所有像素的梯度特征(幅值和幅角),半径 r r r为:
r = 3 × 1.5 σ r=3×1.5σ r=3×1.5σ

其中σ是关键点所在 o c t a v e octave octave的图像的尺度,可以得到对应的尺度图像。

梯度的幅值和方向的计算公式为:

m ( x , y ) = ( L ( x + 1 , y ) − L ( x − 1 , y ) 2 + ( L ( x , y + 1 ) − L ( x , y − 1 ) ) 2 m(x,y)=\sqrt{(L(x+1,y)-L(x-1,y)^{2}+(L(x,y+1)-L(x,y-1))^{2}} m(x,y)=(L(x+1,y)L(x1,y)2+(L(x,y+1)L(x,y1))2

θ ( x , y ) = a r c t a n ( L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 , y ) ) θ(x,y)=arctan(\frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1,y)}) θ(x,y)=arctan(L(x+1,y)L(x1,y)L(x,y+1)L(x,y1))

邻域像素梯度的计算结果如下图所示:
在这里插入图片描述

完成关键点梯度计算后,使用直方图统计关键点邻域内像素的梯度幅值和方向。具体做法是,将 360 ° 360° 360°分为 36 36 36柱,每 10 ° 10° 10°为一柱,然后在以r为半径的区域内,将梯度方向在某一个柱内的像素找出来,然后将他们的幅值相加在一起作为柱的高度。因为在r为半径的区域内像素的梯度幅值对中心像素的贡献是不同的,因此还需要对幅值进行加权处理,采用高斯加权,方差为 1.5 σ 1.5σ 1.5σ。如下图所示,为简化图中只画了 8 8 8个方向的直方图。
在这里插入图片描述
每个特征点必须分配一个主方向,还需要一个或多个辅方向,增加辅方向的目的是为了增强图像匹配的鲁棒性。辅方向的定义是,当一个柱体的高度大于主方向柱体高度的80%时,则该柱体所代表的的方向就是给特征点的辅方向。

直方图的峰值,即最高的柱代表的方向是特征点邻域范围内图像梯度的主方向,但该柱体代表的角度是一个范围,所以我们还要对离散的直方图进行插值拟合,以得到更精确的方向角度值。利用抛物线对离散的直方图进行拟合,如下图所示:

在这里插入图片描述
获得图像关键点主方向后,每个关键点有三个信息 ( x , y , σ , θ ) (x,y,σ,θ) (x,y,σ,θ):位置、尺度、方向。由此我们可以确定一个 S I F T SIFT SIFT特征区域。通常使用一个带箭头的圆或直接使用箭头表示 S I F T SIFT SIFT区域的三个值:中心表示特征点位置,半径表示关键点尺度,箭头表示方向。如下图所示:
在这里插入图片描述

1.1.5 关键点描述

通过以上步骤,每个关键点就被分配了位置,尺度和方向信息。接下来我们为每个关键点建立一个描述符,该描述符既具有可区分性,又具有对某些变量的不变性,如光照,视角等。而且描述符不仅仅包含关键点,也包括关键点周围对其有贡献的的像素点。主要思路就是通过将关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对图像信息进行抽象。

描述符与特征点所在的尺度有关,所以我们在关键点所在的高斯尺度图像上生成对应的描述符。以特征点为中心,将其附近邻域划分为 d ∗ d d∗d dd个子区域(一般取 d = 4 d=4 d=4),每个子区域都是一个正方形,边长为 3 σ 3σ 3σ,考虑到实际计算时,需进行三次线性插值,所以特征点邻域的为 3 σ ( d + 1 ) ∗ 3 σ ( d + 1 ) 3σ(d+1)∗3σ(d+1) 3σ(d+1)3σ(d+1)的范围,如下图所示:
在这里插入图片描述
为了保证特征点的旋转不变性,以特征点为中心,将坐标轴旋转为关键点的主方向,如下图所示:
在这里插入图片描述
计算子区域内的像素的梯度,并按照 σ = 0.5 d σ=0.5d σ=0.5d进行高斯加权,然后插值计算得到每个种子点的八个方向的梯度,插值方法如下图所示:
在这里插入图片描述

每个种子点的梯度都是由覆盖其的 4 4 4个子区域插值而得的。如图中的红色点,落在第 0 0 0行和第 1 1 1行之间,对这两行都有贡献。对第 0 0 0行第 3 3 3列种子点的贡献因子为 d r dr dr,对第 1 1 1行第3列的贡献因子为 1 − d r 1-dr 1dr,同理,对邻近两列的贡献因子为 d c dc dc 1 − d c 1-dc 1dc,对邻近两个方向的贡献因子为 d o do do 1 − d o 1-do 1do。则最终累加在每个方向上的梯度大小为:

w e i g h t = w ∗ d r k ( 1 − d r ) 1 − k d c m ( 1 − d c ) 1 − m d o n ( 1 − d o ) 1 − n weight=w*dr^{k}(1-dr)^{1-k}dc^{m}(1-dc)^{1-m}do^{n}(1-do)^{1-n} weight=wdrk(1dr)1kdcm(1dc)1mdon(1do)1n

其中 k , m , n k,m,n kmn 0 0 0或为 1 1 1。 如上统计4∗4∗8=128个梯度信息即为该关键点的特征向量,按照特征点的对每个关键点的特征向量进行排序,就得到了SIFT特征描述向量。

1.1.6 总结

S I F T SIFT SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在实时性不高,有时特征点较少,对边缘光滑的目标无法准确提取特征点等缺陷,自 S I F T SIFT SIFT算法问世以来,人们就一直对其进行优化和改进,其中最著名的就是 S U R F SURF SURF算法。

1.2 SURF原理

使用 S I F T SIFT SIFT 算法进行关键点检测和描述的执行速度比较慢, 需要速度更快的算法。 2006 年 Bay提出了 S U R F SURF SURF 算法,是 S I F T SIFT SIFT算法的增强版,它的计算量小,运算速度快,提取的特征与 S I F T SIFT SIFT几乎相同,将其与 S I F T SIFT SIFT算法对比如下:

在这里插入图片描述

1.3 实现

在OpenCV中利用SIFT检测关键点的流程如下所示:

1.实例化sift

sift = cv.xfeatures2d.SIFT_create()

2.利用sift.detectAndCompute()检测关键点并计算

kp,des = sift.detectAndCompute(gray,None)

参数:

  • gray: 进行关键点检测的图像,注意是灰度图像

返回:

  • kp: 关键点信息,包括位置,尺度,方向信息
  • des: 关键点描述符,每个关键点对应128个梯度信息的特征向量

3.将关键点检测结果绘制在图像上

cv.drawKeypoints(image, keypoints, outputimage, color, flags)

参数:

  • image: 原始图像
  • keypoints:关键点信息,将其绘制在图像上
  • outputimage:输出图片,可以是原始图像
  • color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
  • flags:绘图功能的标识设置
    1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
    2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
    3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
    4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制

S U R F SURF SURF算法的应用与上述流程是一致,这里就不在赘述。

示例:

利用 S I F T SIFT SIFT算法在中央电视台的图片上检测关键点,并将其绘制出来:

import cv2 as cv 
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./image/tv.jpg')
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 sift关键点检测
# 2.1 实例化sift对象
sift = cv.xfeatures2d.SIFT_create()

# 2.2 关键点检测:kp关键点信息包括方向,尺度,位置信息,des是关键点的描述符
kp,des=sift.detectAndCompute(gray,None)
# 2.3 在图像上绘制关键点的检测结果
cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 3 图像显示
plt.figure(figsize=(8,6),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('sift检测')
plt.xticks([]), plt.yticks([])
plt.show()

结果:

在这里插入图片描述


总结

SIFT原理:

  • 尺度空间极值检测:构建高斯金字塔,高斯差分金字塔,检测极值点。

  • 关键点定位:去除对比度较小和边缘对极值点的影响。

  • 关键点方向确定:利用梯度直方图确定关键点的方向。

  • 关键点描述:对关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对关键点信息进行描述。

API:cv.xfeatures2d.SIFT_create()

SURF算法:

对SIFT算法的改进,在尺度空间极值检测,关键点方向确定,关键点描述方面都有改进,提高效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

城市白模三维重建

收费工具,学生党勿扰,闹眼子当勿扰 收费金额:2000元,不能开发票 1 概述 几个月前,一家小公司找我帮忙给他们开发一个程序,可以将一个城市进行白模的三维重建。 报酬大约5K。经过不懈的努力,终于…

亚马逊广告收入突破百亿美元,有望成为下一个收入支柱来源?

据外媒报道,亚马逊新兴的广告业务已经价值数百亿美元,很可能成为其下一个收入支柱来源。 市场研究公司Insider Intelligence的分析师Andrew Lipsman表示,按照目前的发展轨迹,亚马逊广告业务甚至可以与其云计算业务相互抗衡。“毫…

21 自定义miniweb框架|闭包装饰器|log输出

文章目录 前情知识介绍WSIG-miniWeb框架服务器动态资源请求浏览器请求动态页面的全流程WSGIWSGI接口的定义 静态服务器回顾以及改造web 服务器 和 逻辑处理代码 分离 web动态服务器的基本实现带参数的web动态服务器 闭包装饰器闭包闭包的基础使用函数、匿名函数、闭包、对象修改…

Locked勒索病毒:最新变种.locked袭击了您的计算机?

导言: 在今天的数字时代,勒索病毒已经不再是仅仅让数据变得不可访问的小威胁。 .locked 勒索病毒,作为其中的一种,以其高度复杂的加密算法和迅速变化的攻击手法而备受恶意分子喜爱。本文91数据恢复将带您深入了解 .locked 勒索病毒…

【Linux】简单的小程序:进度条

在学习进度条之前,需要学一点预备知识。 1. 预备知识 回车换行 现在的换行符(\n)其实就是回车式换行符,另起一行,光标指向最新一行的开头。回车符(\r)是光标指向这一行的开头。 缓冲区 &a…

springboot封装查询快递物流

目录 一、ApiClient代码解读二、ApiService代码解读三、HomeController代码解读四、整体代码五、结果展示 一、ApiClient代码解读 这是一个简单的Spring Boot的RestTemplate客户端,用于执行HTTP请求。 首先,这个类被Component注解标记,这意味…

销量蹭蹭上涨!亚马逊上这几款宿舍神器火爆了!

一、BedShelfie床边置物架 每年返校季,收纳工具都是最畅销的产品。在亚马逊床头柜热销榜单中,这款产品位居第二。过去一个月里,有1000多名用户购买了这件产品。 二、U Brands磁性干擦日历板 目前,亚马逊上这款产品已经卖到断货。…

ubuntu下Anaconda安装与使用教程

前言 好久没用anaconda了,还记得之前用anaconda的欢乐时光。pytorch和paddlepaddle(飞浆),怀念,可生活(换了ubuntu系统之后)教会了我残忍(可能很难有机会再用windows的anaconda了)。找个时间&a…

C语言:动态内存(一篇拿捏动态内存!)

目录 学习目标: 为什么存在动态内存分配 动态内存函数: 1. malloc 和 free 2. calloc 3. realloc 常见的动态内存错误: 1. 对NULL指针的解引用操作 2. 对动态开辟空间的越界访问 3. 对非动态开辟内存使用free释放 4. 使用free释…

代码随想录—力扣算法题:24两两交换链表中的节点.Java版(示例代码与导图详解)

版本说明 当前版本号[20230903]。 版本修改说明20230903初版 24. 两两交换链表中的节点 力扣题目链接 更多内容可点击此处跳转到代码随想录,看原版文件 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变…

淘宝/天猫获得淘宝商品详情 API 接口文档

item_get-获得淘宝商品详情 API测试工具 注册开通 taobao.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_sear…

Google colab部署VITS——零门槛快速克隆任意角色声音

目录 序言 查看GPU配置 复制代码库并安装运行环境 选择预训练模型 上传视频链接(单个不应长于20分钟) 自动处理所有上传的数据 训练质量相关:实验发现目前使用CJ模型勾选ADD_AUXILIARY,对于中/日均能训练出最好的效果&#x…

【数据结构】 二叉树面试题讲解->叁

文章目录 🌏引言🌲[根据二叉树创建字符串](https://leetcode.cn/problems/construct-string-from-binary-tree/submissions/)🐱‍👤题目描述:🐱‍🐉示例:📌示例一&#x…

1921. 消灭怪物的最大数量

文章目录 Tag题目来源题目解读解题思路方法一:贪心排序 复杂度分析写在最后 Tag 【贪心】【排序】【数组】 题目来源 1921. 消灭怪物的最大数量 题目解读 dist[i] 是第 i 个怪兽与城市的初始距离,speed[i] 是第 i 个怪兽的移动距离。怪兽的目的是攻击…

Mybatis学习|注解开发、lombok

1.使用注解开发 无需再编写相应的Mapper.xml文件,直接将sql用注解的形式写在Mapper接口的对应方法上即可。 然后因为没有xml文件,所以要在mybatis-config.xml核心配置文件中注册这个Mapper接口,而不用去注册之前的Mapper.xml,这里其实如果用…

04_22 vma(进程下的每个虚拟内存区域查看)对象实战

前言 vma不太懂的可以往前翻 03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用及物理内存结构体完全分析 vam 虚拟内存区域 每个进程下有多个vma 这次是查看每个vma的起始地址 结束地址和大小使用 1.进程在用户空间调用mmap也就是上面那个函数。 2.在当前…

一个集成的BurpSuite漏洞探测插件1.2

4、DNSLog查询漏报 注:扫描结束后才会在BurpSuite的Target、Dashboard模块显示高危漏洞,进程扫描中无法进行同步,但可以在插件中查看(涉及到DoPassive方法问题)。

[足式机器人]Part3 变分法Ch01-2 数学预备知识——【读书笔记】

本文仅供学习使用 本文参考: 《变分法基础-第三版》老大中 《变分学讲义》张恭庆 《Calculus of Variations of Optimal Control Theory》-变分法和最优控制论-Daneil Liberzon Ch01-2 数学基础-预备知识1 1.3.2 向量场的通量和散度1.3.3 高斯定理与格林公式 1.3.2 …

js:创建一个基于vite 的React项目

相关文档 Vite 官方中文文档React 中文文档React RouterRedux 中文文档Ant Design 5.0Awesome React 创建vite react项目 pnpm create vite react-app --template react# 根据提示,执行命令 cd react-app pnpm install pnpm run dev项目结构 $ tree -L 1 . ├─…

java基础-----第九篇

系列文章目录 文章目录 系列文章目录前言一、GC如何判断对象可以被回收前言 一、GC如何判断对象可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收, 可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的…