ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...

本文为大家介绍一篇入选ICCV 2023的论文,《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》, 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。

36aac781fe1da456cda145cf336000ab.png

论文链接:https://arxiv.org/abs/2308.16160

开源代码:https://github.com/megvii-research/Occ2net/tree/main

总体思路

图像匹配是各种视觉应用中的基础和关键任务,如:同时定位和映射(SLAM),图像检索等,这些任务都需要精确的姿态估计。然而,大多数现存的方法忽视了由相机运动和场景结构引起的对象间的遮挡关系。在本文中,我们提出了一种新颖的图像匹配方法Occ2Net,该方法使用3D占位图模型来描述遮挡关系,并推断出被遮挡区域的匹配点。借助占位估计(OE)模块编码来归纳偏差,它大大简化了构建一个多视图一致的3D表示的过程,同时该表示能够整合多视图信息。再结合遮挡感知(OA)模块,通过引入注意力层和旋转对齐,实现了被遮挡点和可见点的匹配。我们在真实世界和模拟数据集上评估了我们的方法,结果显示其在多项指标上,尤其是在遮挡场景下,优于当前最先进的方法。

任务背景以及解决思路

图像匹配是各种视觉应用中的基础和关键任务,例如SLAM(同时定位与地图创建)和图像检索等。它的目标是在两幅或更多的图像中识别和对应相同或相似的结构/内容。图像匹配可以分为两类:基于特征的方法和密集式方法。基于特征的方法从图像中提取稀疏的关键点和描述符,然后基于相似性指标进行匹配;而密集式方法是估计图像像素或区块之间的密集对应关系。

042439a459b140a23a1fa7d4ce73658b.png

然而,这两种方法都无法很好地应对遮挡情况,遮挡在真实世界环境中是常见的。上图展示了这些挑战的一个例子。由于相机运动,两个图像的视差很大。尽管存在大量的重叠区域,但大的视差导致了遮挡,大大减少了可见匹配对的数量。此外,在这个例子中,场景中的地面和墙壁纹理都比较低,两个可以辨别的显示器被标记为绿色和红色的遮罩,指示在图像(b)中可见但在图像(a)中被遮挡的区域。这些因素使得现有的算法难以提取出足够的匹配对进行相机姿态估计。类似的情况在室内导航或自动驾驶中也很常见。为了解决这些问题,我们提出了一种新的图像匹配方法,称为Occ2Net。它不仅匹配可见的点对,还可以匹配被遮挡的点和可见的点。

基于这个观察,我们设计了Occ2Net来匹配3D点。参照NeRF,我们将每个像素视为从相应相机发出的一条射线。NeRF通过在射线上等间隔采样来获取3D点,并通过可微分渲染学习它们的信息。然而,在匹配算法中,我们在推理时没有姿态信息,所以我们将射线上的采样简化为两个点:一个可见点和一个被遮挡的点。在训练时,我们使用真实深度和姿态来重新投影并确定一个3D点是被遮挡还是可见。

基于这些简化,Occ2Net将可见点之间的匹配扩展到可见点与遮挡点之间的匹配。为了实现带有3D显著性的匹配,我们使用了一个3D占用估计(OE)模块,这大大简化了多视角3D表示方法。由于3D匹配的难度、占用大量存储空间以及占用估计的误差,我们没有使用整个图像的3D占用来估计匹配,而是采用了粗到精的结构。在粗糙的步骤中,我们使用了遮挡感知(OA)模块来获取每个子块之间的匹配,OE模块则用于获取每个子块中的精细匹配。

我们在两个数据集上评估我们的提出的方法:ScanNet[1]和 TartanAir[2],这些数据集包含了各种程度遮挡的现实和模拟场景。我们使用了几种衡量标准,将我们的方法与几种最先进的基于特征的方法以及密集方法进行了比较。实验结果显示,我们的方法在这两个数据集上都取得了优越的准确度,超过了现有方法很多。而且,我们的方法在处理遮挡情况下展示出了高的稳健性和效率。

总的来说,我们提出了一种能够识别遮挡点的图像匹配算法,该算法在真实世界和合成数据集上均优于最先进的方法。具体来说,我们的贡献如下:我们提出了一种新颖的能够识别遮挡的图像匹配算法Occ2Net,该算法使用3D占用模型来描绘物体之间的遮挡关系,并推断出被遮挡区域内匹配点的位置。我们将一个占用估计(Occupancy Estimation, OE)模块和一个遮挡感知(Occlusion-Aware, OA)模块结合起来,使用具有占用估计的粗到精结构,实现可见-被遮挡匹配。我们的实验显示Occ2Net在真实世界数据集ScanNet和模拟数据集TartanAir上都实现了最好的姿态估计精度。

实现方法

51e2a2fa6df15b1131747494d38eb779.png

上图展示了我们的Occ2Net的概述,它通过隐式模拟物体-遮挡关系,帮助在遮挡下进行匹配。我们的方法已经在各种可见-可见和可见-遮挡的情况下进行了广泛的测试,取得了与最新技术方法相当的成果。然而,在这一部分里,我们的主要关注点主要是挑战性较高的可见-遮挡匹配问题。

特征提取模块

我们的特征提取有三个主要功能:粗特征F的提取,精细特征FG的提取,以及生成用于3D占据估计的张量OF和OV。为了匹配可见点和遮蔽点,我们使用了一个大感受野的金字塔结构,并为不同的尺度添加位置编码。由于相机距离的不同,金字塔结构有助于识别不同尺度的同一物体。为了成功地匹配遮蔽区域和可见区域,我们扩大了金字塔结构的感知范围,并在匹配过程中使用了更多周围信息。如图1所示,图像中包含椅子的周边区域,在椅子部分有所不同,但周围区域非常相似。这是一种常见的现象,即匹配到的遮挡区域和可见区域周围的图像特征是相似的。我们还添加了不同尺度的位置编码,这丰富了特征的位置信息,以便从上述相似的周围区域准确推断出遮挡点的偏移量。

OA模块

我们设计了OA模块来实现粗略的匹配。OA模块主要由两部分组成:注意力组件和旋转对齐。注意力组件通过自注意力和交叉注意力,加深了对整个图像结构信息的理解,使得特征更有利于粗略匹配。旋转对齐旨在更好地适应不同视角之间的不同旋转,使得可见和被遮挡的部分更易于匹配。

  • 旋转对齐

c731b256b59186ef14d682fad3b927bf.png

旋转对齐选择具有适当旋转角度的特征。在注意力组件之后,每个特征保留其接受区域的子块信息。左图的特征经过适当的旋转后,会更接近于右图的特征,这进一步可以感知遮挡并使块匹配更加容易。例如,如上图所示,我们想要匹配图(a)和图(b)中由箭头指示的点。图(a)中的点被遮挡,在图(b)中可见。在粗略匹配阶段,我们需要匹配两个绿色的块。然而,由于遮挡区域的存在,两个块的特征会稍有不同。尽管我们在特征提取中扩大了接受野,并引入了更多周围信息,但我们不能消除遮挡的影响。旋转对齐的目标是增加两个块的特征相似性。考虑到我们使用2D旋转来补偿3D相机姿态的差异,图像的不同部分的旋转角度应该不同。为了防止旋转改变匹配块的索引,我们开发了一个局部特征旋转算法,对每个块特征进行局部旋转。由于我们不知道适当的旋转角度,我们使用gumbel softmax来选择最佳匹配的旋转角度。

b639fdb7a8df47725dc44e29d12bfc39.png

2a0a476ea607ffd1d4bbc6106e149b62.png

7257d85f6ddbc24e04bc05ba46737857.png

因为我们不知道真实的旋转角度,根据经验我们选择0度和30度作为旋转角度。

OE模块

在获取粗略级别的子块匹配后,我们利用OE模块进行细致匹配。对于可见子块中的点,我们使用LoFTR子模块生成的热图计算与匹配子块中心的偏移。对于被遮挡子块中的点,根据其周围可见内容推断出匹配点的位置,这些内容是通过特征提取和本地3D占位得到的。OE模块被用来计算精确匹配点的位置。首先,我们设计了一个3D占位估计模块。对每一张图,我们通过特征提取得到两个张量OF和OV。我们计算一个4D张量作为OF和OV的外积,以表示估计的3D占位。

e452c081ccee754638ffd97e68103f75.png

基于真实深度和相机姿势,我们计算真实的3D占用作为监督。我们将在loss部分解释3D占用损失。然后,我们通过注意力模块将估计的3D占用和精细特征相结合。最后,基于两个图像的局部特征和3D占用,我们可以推断出每个匹配点的具体位置。使用粗到精的结构,并且只在精细结构中使用3D占用估计,有两个原因:1. 已经证明粗到精的结构对于可见点之间的匹配是有效的。2. 单眼模型通过3D占用估计是不准确的,而推断遮挡点是困难的。使用粗到精的结构,同时将精细特征与3D占用相结合,使得可以使用从3D占用估计出的3D信息来推断遮挡点的位置。因为先进行了粗匹配,推断的误差可以控制在一定范围内。例如,如上图所示,我们试图匹配左图和右图中的绿色框。匹配点的特征应与3D占用一致。我们可以从3D占用推断出,图中的箭头指示了一个精细匹配对。

loss

  • 粗粒度匹配 loss

我们的网络将以下情况视为有效匹配:可见与可见的子块、可见与遮挡的子块、遮挡与可见的子块。根据真实的相机位置和深度,我们计算左图像块的再投影。当一个子块的投影深度大幅度大于右图像对应的深度时,我们将该子块视为在右图像中被前方的物体遮挡。我们定义图像的遮挡点与像素总数的比率为遮挡比例。我们获取了三组带有监督的子块匹配数据:可见-可见匹配、可见-遮挡匹配和遮挡-可见匹配。

参考LoFTR的loss,有:

5254e2a96d409babcf50f3d3fe0b9683.png

0a1f3cad66792cf3ad5850abe16bc346.png

2c9b63a2fa8d93c6115ea4aa66210593.png

36bb3883f74e79d7094ce62f84eb83a1.png

1423a76c35b403877cf9ff87101212bb.png

a0cbb5095aab14aa109bb3f231eddb78.png

  • 3D占位loss

为了从真实深度和相机姿态中生成真实的3D占用,我们采取了以下步骤:通过结合两张图片的深度和相机姿态,创建一个真实的点云。将点云转化为体素表示,通过将3D空间划分为小立方体单元,并根据其3D占用情况给每个单元分配一个值。使用相机的姿态作为世界坐标系的原点,并将深度分辨率设置为64个体素,将体素表示投影到当前图片上。

64930d46239d098fd7944589a8f7d5d3.png

  • 细粒度匹配Loss

参考LOFTR

3d7f34299b16627418a215a52791ddd2.jpeg

  • 整体Loss

fbea2ef38a72150fefb2ba3a6059628f.png

实验

我们通过在真实数据集ScanNet和模拟数据集Tartanair上的实验来验证我们方法的有效性。虽然MegaDepth[3]是一个常用于图像匹配的数据集,这也是一个真实的数据集,但我们没有采用它,因为它的深度地图误差比ScanNet的大。TartanAir是一个提供真实相机姿态和深度信息的模拟数据集,包括了像MegaDepth一样的室外场景。我们使用ScanNet和TartanAir数据集来展示在深度不准确的情况下,该算法的泛化能力和适应性,以及其在室内和室外场景中的有效性。

我们使用ScanNet来演示我们的姿态估计方法的有效性。ScanNet是一个RGB-D视频数据集,包含来自1500多次扫描的250万视图,这些视图注有3D相机的姿态、表面重构以及实例级的语义分割。参照SuperGlue[4]的评估程序,我们在训练中抽取了230百万的图像对,它们的重叠比例在0.4到0.8之间。图像对的重叠比例是通过使用深度和姿态将一幅图像重新投影到另一幅图像并计算在投影后不超出边界的像素的比例来定义的。我们在测试集中的1500对图像上评估我们的方法。所有的图像和深度图都被调整到了640x480的大小。

TartanAir是一个用于评估SLAM算法的具有挑战性的合成数据集。该数据集包含室内和室外场景,涵盖了各种各样的场景和运动模式。数据是在各种光照条件、天气以及移动物体存在的情况下,在逼真的模拟环境中收集的。与使用物理数据收集平台收集数据的ScanNet不同,TartanAir数据集中的深度和位姿完全准确。我们按照与Droid-SLAM相同的训练测试切分方式构建了测试集,该测试集包含32个场景。在每个场景中,我们随机选取了满足重叠比例在0.4和0.8之间且遮挡比率大于0.3的50对图像,从而得到了包含1600对图像的测试集。

  • 实验结果

dcd6aa039160f526c656469ec4a5d36b.png

上图展示了ScanNet、TartanAir-室内和TartanAir-室外的匹配示例。我们将QuadTree LoFTR [5]与我们的结果进行了比较。绿色和黄色的线分别表示QuadTree LoFTR和Occ2Net的正确匹配,而红色的线则代表错误的匹配(误差超过10像素)。我们用紫色的框突出显示了一些匹配对。蓝色的遮罩标注了正确的匹配区域。图(a)的左图和右图分别包含了讲台1和椅子2的不同视角。图(b)的左图包含了墙壁1和2,而且2部分被显示器遮挡。图(b)的右图仅包含墙壁2。图(c)的左图只有灯光1和2,而右图包含了灯光1、2和3。

我们采用和SuperGlue相同的测试方法,下表中展示了姿态错误AUC在阈值为5度, 10度, 20度下的百分比。这里的姿态错误被定义为旋转中的角度误差和平移中的位移误差的最大值。为了恢复相机的姿态,我们使用RANSAC方法[8]解出预测匹配中的本质矩阵。

2e43dfa256b56d174d7feedfb8b2622d.png

如上表所示,我们的方法在ScanNet和TartanAir上的姿态估计精度上都超过了所有竞争对手,展示了我们的方法在室内外、真实和模拟场景中的有效性。Occ2Net-s是Occ2Net-l的一个缩略版本,它没有明确区分可见和遮挡的点,而且所有匹配都共享权重和张量,参数比QuadTree LoFTR少。

共享权重对最终性能有一定的影响。如我们之前解释过的,准确估计有遮挡的匹配点的确切位置是困难的,所以5度的提升效果并不明显。然而,没有共享权重的模型相当于将有遮挡的匹配点和可见的匹配点加在一起。这两种匹配不会互相影响,而且精度的提升是明显的。TartanAir测试集包含了更多遮挡比例大于40%的图像对,所以匹配效果得到了更大的提升。

  • 遮挡对于位姿估计的有效性

9164c154fcaa43ff146a620a1eb19c66.png

我们为了量化分析遮挡对姿态估计的影响,我们计算了ScanNet测试集中所有图像对的遮挡比率。遮挡比率定义为在一张图像中可见但在另一张图像中被遮挡的像素的比率。接着,我们将累积估计误差R和t作为遮挡比率的函数进行绘图。如图所示,在具有高遮挡比率的图像对中,其他算法在姿态估计方面的误差相对较大,而我们的算法仍能在这些具有挑战性的场景中达到较小的姿态误差。

  • 消融实验

903826f0907a89e8c58dac46f5d22243.png

以上表格各实验含义:1)基准线:QuadTree LoFTR。2)基准线+遮挡损失:仅添加可见-遮挡匹配以进行监督;3)Occ2Net -遮挡损失:使用Occ2Net,而不进行遮挡监督;4)基准线+特征提取:使用我们的特征提取骨干网络,取代LoFTR特征提取骨干网络;5)实验4)+遮挡损失:使用我们的特征提取骨干网络并添加可见-遮挡匹配以进行监督;6)基准线+OA模块:添加旋转对齐方法;7)Occ2Net -占用:Occ2Net不进行3D占用估计;8)Occ2Net:我们的方法。

如表格1)和2)所示,仅增加对可见-遮挡点的监控是无效的。为了实现可见点和遮挡点的匹配,需要设计一个能够意识到遮挡并推断遮挡位置的网络结构。比较3)和8),我们的Occ2Net网络需要与遮挡的概念配合,否则效果提升不明显。比较1)和4),我们的特征提取为3D占用估计提供了张量,并且比QuadTree LoFTR特征提取的参数少,这导致了可见点匹配效果差。比较4)和5),我们的特征提取对于遮挡点匹配是有效的。6)与1)的比较说明,增加旋转对齐对于图像匹配是有帮助的。如8)所示,与7)相比,3D占用估计改进了带有遮挡监控的遮挡点匹配。此外,通过同时匹配遮挡和可见点,也增强了可见-可见匹配,从而改善了整体匹配性能。需要注意的是,表格中的所有方法都不能直接与Occ2Net-s进行比较,因为它们包含的参数数量不同。

结论

我们提出了一种考虑到被其他物体遮挡的点的图像匹配方法。我们设计了一种网络结构,名为Occ2Net,它能在一定程度上感知到被遮挡点的存在。Occ2Net利用特征提取获取多尺度的全局和位置特征,这有助于猜测遮挡信息。OA模块使用注意力和旋转对齐,这对于在后续的粗到精的过程中获取更多正确的匹配对非常有用。OE模块使用3D占用估计来结合细节特征进行精细匹配。实验表明,我们的方法实现了这个目标,并大大提高了姿态估计的准确性。我们认为,我们的工作为未来的研究者探索遮挡场景下更好的图像匹配铺平了道路。

然而,尽管我们的网络可以识别被遮挡的点并将它们与可见点进行匹配,但很难找出这些隐藏点的确切位置。尽管我们首先提出了由可见点和隐藏点组成的光线用于图像匹配的想法,但由于数据限制,我们将光线退化为只有两点。在未来,应考虑涉及多层遮挡的更复杂的场景。

参考文献:

[1] Hongkai Chen, Zixin Luo, Lei Zhou, Yurun Tian, Mingmin Zhen, Tian Fang, David Mckinnon, Yanghai Tsin, and Long Quan. Aspanformer: Detector-free image matching with adaptive span transformer. In European Conference on Computer Vision, pages 20–36. Springer, 2022.

[2] Michał Tyszkiewicz, Pascal Fua, and Eduard Trulls. Disk: Learning local features with policy gradient. Advances in Neural Information Processing Systems, 33:14254–14265, 2020.

[3] Wenbo Li, Zhe Lin, Kun Zhou, Lu Qi, Yi Wang, and Jiaya Jia. Mat: Mask-aware transformer for large hole image inpainting. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition, pages 10758– 10768, 2022.

[4] Paul-Edouard Sarlin, Daniel DeTone, Tomasz Malisiewicz, and Andrew Rabinovich. Superglue: Learning feature matching with graph neural networks. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition, pages 4938–4947, 2020.

[5] Weijing Shi and Raj Rajkumar. Point-gnn: Graph neural network for 3d object detection in a point cloud. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition, pages 1711–1719, 2020.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[红明谷CTF 2021]write_shell %09绕过过滤空格 ``执行

目录 1.正常短标签 2.短标签配合内联执行 看看代码 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){ 过滤了 木马类型的东西// if(preg_match("/| |_||php/&quo…

Java应用生产Full GC或者OOM问题如何定位

1 引言 生产应用服务频繁Full GC却无法释放内存&#xff0c;甚至可能OOM&#xff0c;这种情况很有可能是内存泄露或者堆内存分配不足&#xff0c;此时需要dump堆信息来定位问题&#xff0c;查看是哪些地方内存泄漏。 Dump文件也称为内存转储文件或内存快照文件&#xff0c;是…

【Axure】常见元件、常用交互效果

产品结构图 以微信为例&#xff0c;根据页面层级制作 动态面板 动态面板的作用&#xff1a;动态面板是一个可视区域&#xff0c;如果要把控件放进去&#xff0c;要全部放进去&#xff0c;放多少显示多少 文本框 隐藏边框方法&#xff1a;先拉一个矩形&#xff0c;去掉部分…

基于Java的汽车票网上预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

在windows的ubuntu LTS中安装及使用EZ-InSAR进行InSAR数据处理

EZ-InSAR&#xff08;曾被称为MIESAR&#xff0c;即Matlab界面用于易于使用的合成孔径雷达干涉测量&#xff09;是一个用MATLAB编写的工具箱&#xff0c;用于通过易于使用的图形用户界面&#xff08;GUI&#xff09;进行干涉合成孔径雷达&#xff08;InSAR&#xff09;数据处理…

vue-cli项目打包体积太大,服务器网速也拉胯(100kb/s),客户打开网站需要等十几秒!!! 尝试cdn优化方案

一、首先用插件webpack-bundle-analyzer查看自己各个包的体积 插件用法参考之前博客 vue-cli项目中&#xff0c;使用webpack-bundle-analyzer进行模块分析&#xff0c;查看各个模块的体积&#xff0c;方便后期代码优化 二、发现有几个插件体积较大&#xff0c;有改成CDN引用的…

亚信科技AntDB数据库 高并发、低延迟、无死锁,深入了解AntDB-M元数据锁的实现

AntDB-M在架构上分为两层&#xff0c;服务层和存储引擎层。元数据的并发管理集中在服务层&#xff0c;数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性&#xff0c;引入了元数据锁&#xff08;MDL&#xff09;。 AntDB-M提供了丰富的元数据锁功能&#xff0…

【Axure高保真原型】3D圆柱图_中继器版

今天和大家分享3D圆柱图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的圆柱图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

一文带你搞懂Redis持久化

Redis持久化 Redis的数据是存储在内存的&#xff0c;当程序崩溃或者服务器宕机&#xff0c;那么内存里的数据就会丢失。所以避免数据丢失的情况&#xff0c;需要将数据保存到其他的存储设备中。 Redis提供两种方式来持久化&#xff0c;分别是 RDB(Redis Database)&#xff1a…

【LeetCode热题100】--19.删除链表的倒数第N个结点

19.删除链表的倒数第N个结点 注意&#xff1a;先声明一个头结点&#xff0c;它的next指针指向链表的头节点&#xff0c;这样就不需要对头节点进行特殊的判断 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListN…

【Java每日一题】——第十六题:将数组元素逆序并遍历输出。(2023.09.30)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第十五题。 &#x1f3af;问题&#xff1a; 设有数组如下&#xff1a;int[] arr{11,34,47,19,5,87,63,88}; 测试结果如下&#xff1a; &#x1f3af; 答案&#xff1a; int a[]new int [10];Random …

华为云HECS云服务器docker环境下安装nginx

前提&#xff1a;有一台华为云服务器。 华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…

ai创作工具,怎么使用AI创作工具

不论是写一篇博客、发布自媒体、还是设计广告文案&#xff0c;创作都成为了我们日常生活和工作中不可或缺的一部分。但是&#xff0c;许多人可能会面临写作灵感枯竭、时间不足或需要大量内容的问题。 写作对于很多人来说&#xff0c;不仅是一项技能&#xff0c;更是一种挑战。有…

Spring学习笔记11 GoF代理模式

Spring学习笔记10 JdbcTemplate_biubiubiu0706的博客-CSDN博客 新建个maven模块 static-proxy 演示静态代理 订单接口 测试 需求:统计每个业务方法的耗时 package com.example.proxy.service;/*** author hrui* date 2023/9/25 8:42*/ public class OrderServiceImpl implem…

Linux CentOS7 vim临时文件

在vim中&#xff0c;由于断网、停电、故意退出、不小心关闭终端等多种原因&#xff0c;正在编辑的文件没有保存&#xff0c;系统将会为文件保存一个交换文件&#xff0c;或称临时文件&#xff0c;或备份文件。 如果因某种原因产生了交换文件&#xff0c;每次打开文件时&#x…

ffmpeg、ffplay在线安装,离线导出整个程序,移植到其他服务器使用(linux系统)

环境说明 以ubuntu系统作为说明 在线安装 下面命令会同时安装ffplay和ffmpeg sudo apt-get install ffmpeg怎么验证安装成功&#xff1f; 输入ffmpeg命令 ffmpeg&#xff0c;如图则说明安装成功 转储可执行程序和依赖的文件 找到安装路径&#xff0c;一般在/usr/bin目录…

idea Springboot 教师标识管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 教师标识管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

Codeforces Round 894 (Div. 3) D(数学题好难不会)

题目链接&#xff1a;Codeforces Round 894 (Div. 3) D 题目&#xff1a; 特马决定提高自己制作冰淇淋的技能。他已经学会了如何用两个球把冰淇淋做成圆锥形。 在痴迷冰淇淋之前&#xff0c;特马对数学很感兴趣。因此&#xff0c;他很想知道要制作完全n个不同类型的冰淇淋&am…

唤醒手腕 2023年 B 站课程 Golang 语言详细教程笔记(更新中)

0001、1000集GO语言Flag毒誓 唤醒手腕UP猪Pig目标花费1000集进行讲解Go语言视频学习教程&#xff08;有趣的灵魂&#xff0c;适合小白&#xff0c;不适合巨佬&#xff09;&#xff0c;从2023年3月19日开始&#xff0c;将会一直每天更新&#xff0c;准备在2024年5月1日之前更新…

【C语言】文件操作(二)

前言&#xff1a; 在文件操作&#xff08;一&#xff09;中我们了解了文件及文件指针&#xff0c;还有文件的打开和关闭。在这篇博客我们学习顺序读写文件的几个函数。 文章目录 一、文件的顺序读写1.1 顺序读写函数介绍 fgetc 字符输入函数 fputc 字符输出函数fgets 文本行输…