2023年最全OCR技术指南!预训练OCR大模型呼之欲出

OCR是一项科技革新,通过自动化大幅减少人工录入的过程,帮助用户从图像或扫描文档中提取文字,并将这些文字转换为计算机可读格式。这一功能在许多需要进一步处理数据的场景中,如身份验证、费用管理、自动报销、业务办理等都显得尤为实用。现如今,OCR解决方案会结合AI(人工智能)和ML(机器学习)技术,以自动化处理过程并提升数据提取的准确性。本文将介绍该技术的前世今生,一览该技术的阶段性发展:传统OCR技术统治的过去,深度学习OCR技术闪光的现在,预训练OCR大模型呼之欲出的未来!

OCR的前世:传统OCR技术统治的过去

传统OCR技术的工作原理

OCR的运作方式可以类比为人类阅读文本和识别模式的能力。传统OCR技术通过电脑视觉、模式识别技术来自动识别并提取图像或文档中的字符。传统OCR技术需要经过以下步骤:

1.图像预处理

这个阶段是为了增强图像的质量,包括去噪、二值化(即将图像转化为黑白),以及自动纠正图像的扭曲和倾斜等。

*像预处理在光学字符识别(OCR)中的应用*

在光学字符识别(OCR)的工作流程中,图像预处理是首要步骤,它为整个系统的准确性和稳健性打下基础。因此,理解图像预处理中使用的技术及其执行步骤极为关键。

*像预处理的定义*

图像预处理是一种在进行主要的图像分析之前,改进图像数据(消除无用信息,强化有用信息,或者提高计算速度)的技术。它可以增强图像质量,使得OCR引擎更好地分离出文本和背景,提高文本的识别准确度。

*像预处理的主要步骤和技术*

1.去噪声:在此步骤中,会使用各种滤波器(例如,中值滤波器、高斯滤波器等)来减少图像中的噪声,如尘埃、划痕等。

2.灰度化:将彩色图像转化为灰度图像。因为在大多数情况下,我们只需要关注文字和背景的对比度,而不需要关注它们的颜色。灰度化能将计算复杂度大幅降低,同时保留主要信息。

3.二值化:该步骤将图像转换为只包含黑白两色的图像。二值化过程可以通过设定一个阈值来实现,所有低于这个阈值的像素将被标记为黑色,而高于阈值的像素将被标记为白色。这样可以进一步强化文字与背景的对比度。

4.去斜和校正:OCR系统需要自动纠正图像中的扭曲和倾斜,以确保文本的正确识别。这个过程包括检测图像中文本行的倾斜角度,并进行相应的校正。

5.区域划定:也被称为布局分析,该步骤用于识别图像中的文本区域、非文本区域以及文本的结构信息,如列、行、块、标题、段落、表格等。通过这个步骤,可以为后续的文字提取步骤提供基础。

*图像预处理的重要性*

优质的图像预处理工作可以显著提高后续步骤的效率和准确性。它可以提升图像质量,更好地分离文本和背景,消除图像中的噪声,纠正图像中的扭曲和倾斜,识别文本的结构信息等。这些都是确保OCR系统能准确识别和提取文字的关键因素。因此,深入理解和掌握图像预处理步骤和技术,对于构建一个高效准确的OCR系统至关重要。

2.字符分割

字符分割是OCR过程中的一个重要步骤。这个步骤的目标是将图像中的文字区域分割成独立的字符,以便后续步骤进行字符识别。以下是进行字符分割的主要步骤和使用的一些常见技术。

*字符分割的主要步骤*

1.行分割:该步骤的目标是将图像中的文本区域分割成单独的行。通常情况下,行分割可以通过分析图像的水平投影直方图来实现。水平投影直方图是通过将图像中每个像素点的灰度值在水平方向上累加得到的。在文本行之间,累加值通常会显著下降,这些下降的位置就是行分割的位置。

2. 字符分割:在行分割之后,下一步是将每一行文本进一步分割成单独的字符。这通常可以通过分析垂直投影直方图来实现。与水平投影直方图类似,垂直投影直方图是通过将每个像素点的灰度值在垂直方向上累加得到的。在字符之间,累加值通常也会显著下降,这些下降的位置就是字符分割的位置。

*字符分割的常见问题和解决方法*

在字符分割的过程中,有一些常见的问题,例如字符的粘连和断开。这些问题可能导致字符无法正确分割,从而影响OCR的准确性。

1.字符粘连:有时候,图像中的两个或更多的字符可能会紧密相连,形成一个像是一个单一字符的形状。为了解决这个问题,一种常用的方法是通过形态学操作来分离粘连的字符。例如,可以使用细化或骨架化技术来提取字符的中心线,然后根据这些中心线来分离粘连的字符。

2.字符断开:有时候,图像中的一个字符可能会因为噪声或其他原因而被断开成两个或更多的部分。为了解决这个问题,一种常用的方法是通过形态学操作来连接断开的字符。例如,可以使用膨胀或闭运算技术来填补字符的空洞,然后根据这些填补后的形状来连接断开的字符。

总的来说,字符分割是OCR中的关键步骤。只有当图像中的字符被准确地分割出来,OCR系统才能正确地识别和提取这些字符。因此,深入理解和掌握字符分割的步骤和技术,对于构建一个高效准确的OCR系统至关重要。

3.字符识别

图像或文档在这个步骤中被分解为部分或区域,识别其中的字符。这个过程涉及矩阵匹配(即每个字符都与字符矩阵库进行比较)和特征识别(即从图像中识别文本模式和字符特征)。

*字符识别技术*

在光学字符识别(OCR)的工作流程中,字符识别是一个关键的步骤。在这个步骤中,系统需要对分割得到的每一个单独字符进行识别。以下是字符识别阶段中的主要技术和步骤,特别是在传统的OCR系统中。

*特征提取*

特征提取是字符识别的首个步骤,它的目的是从每个字符图像中提取出可以反映其主要形状和结构的特征。这些特征可以帮助区分不同的字符。在传统的OCR系统中,常见的特征提取方法包括:

  1. *灰度共生矩阵(GLCM)*GLCM是一种统计方法,用于从图像中提取纹理特征。这些特征包括对比度、相关性、能量和同态性等。
  2. *Hu不变矩*Hu不变矩是一组可以抵抗图像平移、缩放和旋转变化的特征。
  3. *傅立叶描述符*傅立叶描述符可以从字符的形状,特别是字符的边界,提取特征。

*字符分类*

在提取了特征后,下一步是使用这些特征来对字符进行分类。在传统的OCR系统中,最常见的分类器是支持向量机(SVM)。

  1. *支持向量机(SVM)*SVM是一种有监督的学习模型,它通过找出能够最大化类别间距的决策边界来进行分类。

训练分类器时需要有一个标注了真实类别标签的字符集。在进行字符识别时,分类器将根据输入的特征输出一个类别标签,这个标签就是识别的结果。

*性能评估*

在完成字符识别之后,需要对系统的性能进行评估。常用的性能指标包括准确率、精确率、召回率和F1分数。这些指标可以帮助我们了解分类器在不同条件下的表现,以便对其进行优化和改进。

传统OCR的局限性

虽然传统的光学字符识别(OCR)技术在许多场景中表现得相当出色,但这种技术确实存在一些局限性,尤其是在比较复杂或者具有挑战性的情况下。以下是一些主要的局限性:

1.对清晰度和质量的高要求:传统的OCR技术高度依赖图像的质量。如果输入的图像质量较差(例如,图像模糊、对比度低、光照不均、存在噪声等),则OCR的准确度可能会大大降低。

2.对字体和布局的依赖性:传统的OCR技术通常基于特定的字体和布局进行训练。因此,如果输入的文本使用了训练数据中未包含的字体或者不同的布局,那么识别精度可能会受到影响。

3.处理复杂背景和装饰字的挑战:如果文本字符与背景紧密相连或者文本在复杂的背景上,传统的OCR系统可能会难以准确地分割和识别字符。类似地,如果字符被装饰或者以艺术字形式呈现,传统的OCR系统可能也无法准确地识别出这些字符。

4.困难的手写识别:对于手写文字的识别,传统的OCR系统通常会遇到更大的挑战,因为手写文字的形状、大小和倾斜度变化非常大,且往往缺乏清晰的边界。

5.无法处理多语言和特殊字符:传统的OCR系统通常针对单一或者少数几种语言进行优化,对于其他语言或者特殊字符,例如数学符号、音乐符号等,可能无法提供满意的识别效果。

6.缺乏上下文理解:传统的OCR技术通常将字符识别作为一个独立的任务进行,而没有考虑字符的上下文信息。因此,如果一个字符在图像中模糊不清,OCR系统可能无法准确地识别出这个字符。

总的来说,虽然传统的OCR技术在一些场景中表现得非常出色,但在处理复杂或者具有挑战性的任务时,这种技术的局限性就会暴露出来。这也是为什么越来越多的研究者开始探索使用深度学习等更先进的技术来改进OCR系统。

OCR的今生:深度学习OCR技术闪光的现在

传统OCR技术在处理复杂的图像和不规则形状的文本时,效果并不理想。深度学习时代,机器可以“学习”处理复杂任务,并且对数据具有很好的适应性。通过结合深度学习,建立更为强大和灵活的OCR模型,它能够处理各种类型的文本,并且提高字符识别的准确率。

深度学习OCR技术分为两步:文本检测与文本识别。

深度学习文本检测

基于候选框的方式 Proposal-based:举例FastRCNN

FastRCNN(快速区域卷积神经网络)是一种用于目标检测的深度学习模型,它通过利用区域建议网络(Region Proposal Network,RPN)来找出图像中可能存在目标的区域,然后通过一个卷积网络对这些区域进行特征提取和分类。它在处理图像数据时,可以实现更高的运算速度和更准确的目标检测。

在OCR(Optical Character Recognition,光学字符识别)场景下,FastRCNN可以被用来定位和识别图像中的文本内容。它可以识别各种形式的文本,包括打印的、手写的甚至是非结构化的文本。由于FastRCNN是一个二级任务模型,它先进行文本区域的定位,再进行文字识别,使得模型在处理复杂场景下的文本识别任务时具有很高的效率和准确度。

技术说明

文本区域检测,FastRCNN通过RPN生成可能的文本区域建议。RPN是一种全卷积网络,它能够在图像的任意位置生成潜在的文本区域,这对于处理各种复杂图像,尤其是含有多个、大小不一、布局复杂的文本区域的图像具有重要作用。

技术步骤

**区域建议:**利用RPN网络在预处理后的图像上生成潜在的文本区域建议。

**特征提取和分类:**对每个建议区域使用FastRCNN进行特征提取和分类。由于FastRCNN可以在不同的区域进行特征共享,所以它可以在不牺牲精度的情况下大大提高计算效率。

**后处:**处理模型输出,包括对检测到的文本区域进行合并、去重和排序等操作,最后将检测和识别结果返回给用户。

**持续学习和优化:**根据模型在实际应用中的表现,收集反馈数据,持续优化和训练模型,提高其在复杂场景下的性能。

基于分割的方式 Segmentation-based:举例MaskRCNN

Mask-RCNN是一个基于深度学习的目标检测模型,它的主要特性是同时进行目标检测和像素级别的图像分割。该模型在FastRCNN的基础上添加了一个并行的分割任务,可以输出目标的分类、位置和形状等信息。

在OCR(Optical Character Recognition,光学字符识别)场景下,Mask-RCNN可以被用来对文本进行精细的检测和分割。由于Mask-RCNN不仅可以识别出图像中的文字,还能够精确地给出文字的形状和位置,这使得它特别适合用于处理含有复杂布局和形状的文本图像。

技术说明

Mask-RCNN在OCR场景中的应用主要涉及到文本区域检测和形状分割。

首先,与FastRCNN一样,Mask-RCNN通过RPN生成可能的文本区域建议。然后,对每个建议区域,Mask-RCNN不仅进行了FastRCNN的分类和回归任务,还额外进行了一个并行的像素级分割任务。

在OCR中,这个分割任务可以用来生成文字的精确形状和位置信息,这对于处理复杂布局和形状的文本图像,例如自由形状的文本,垂直或倾斜排列的文本,具有重要的应用价值。

技术步骤

**区域建议:**利用RPN网络在预处理后的图像上生成潜在的文本区域建议。

**特征提取,分类和分割:**对每个建议区域,Mask-RCNN同时进行特征提取、分类和像素级分割。通过这些任务,可以得到每个文字的类别、位置和精确形状。

**后处理:**处理模型输出,包括对检测到的文本区域进行合并、去重和排序等操作,以及根据分割结果生成文字的精确形状和位置信息。

**持续学习和优化:**根据模型在实际应用中的表现,收集反馈数据,持续优化和训练模型,提高其在复杂场景下的性能。

深度学习文本识别

当我们谈论深度学习OCR文字识别的技术路线时,主要有三种方向:基于CTC的解码方式,基于Attention的解码方式,以及基于字符分割的方法。

基于CTC的解码方式:

想象一下,你正在听一段音频,你需要将其中的对话转化为文字。这就需要一个能够按照时间顺序将声音转化为字符的系统。这就是CTC(Connectionist Temporal Classification)的概念。CTC解决的就是如何将具有固定时间长度的音频(或者图像)转化为不固定长度的文字。

CTC(Connectionist Temporal Classification)是一种用于序列型问题的特殊解码方式。在OCR任务中,它可以帮助我们在固定维度的时序特征与非固定维度的输出(例如:文本字符串)之间建立映射关系。那么,具体如何运作呢?

技术说明

CTC的关键创新是引入了一个特殊的符号,通常被称为“空格”字符或者“blank”字符。这个字符没有实际的语义含义,但它在训练模型时起着关键的作用。

具体来说,当我们训练一个模型时,我们需要一个固定长度的输入(例如图像)对应一个固定长度的输出(例如字符序列)。但在OCR问题中,输入图像的宽度(或者说特征的时序长度)往往是固定的,而输出的字符数量是变化的,这导致了输入和输出之间存在一个“不对齐”的问题。

CTC通过引入“空格”字符,有效地解决了这个问题。在训练时,我们可以为每个可能的字符预测一个概率,同时还预测一个“空格”字符的概率。然后,我们可以通过一种叫做“解码”的过程,从这些预测的概率中生成最终的字符序列。

技术步骤

当我们使用基于CTC的解码方式处理OCR问题时,一般会采用如下的技术步骤:

1.特征提取:首先,我们需要从输入的图像中提取出有用的特征。这通常是通过深度学习模型(如CNN)完成的。每个图像的宽度会被划分成若干个小块(即“时间步”),并且每个小块都会生成一个特征向量。

2.序列预测:然后,我们将这些特征向量输入到一个递归神经网络(RNN)中,为每个时间步预测一个字符,同时预测一个“空格”字符。

3.CTC解码:最后,我们使用CTC解码算法从预测的概率中生成最终的字符序列。在这个过程中,“空格”字符起到了一个重要的作用:它可以用来表示字符之间的边界,同时也可以用来表示不存在字符的时间步。

在这种解码方式中,CRNN+CTC模型是非常典型的代表。CRNN(卷积递归神经网络)结合了卷积神经网络(CNN)和递归神经网络(RNN)的特性,能够有效地从图像中提取特征并进行序列预测。

值得注意的是,尽管基于CTC的解码方式在处理定长输入和变长输出的问题上有着显著的优势,但由于其预测每个字符时并未充分利用上下文信息,所以在处理不规则形状的文本(如弯曲文本或者手写文本)时,效果可能会有所下降。

基于Attention的解码方式:技术深度解析

我们在阅读时,总是会关注到一些特定的部分,而忽略其他不太重要的信息。在这个过程中,我们总是在上下文中寻找重要的信息,这就是Attention机制。

基于Attention的解码方式是一种在深度学习中广泛使用的方法,尤其在处理序列型问题,如机器翻译和OCR时,表现优异。它之所以被称为"Attention"(注意力),是因为这种机制能模仿人类在处理信息时会关注关键部分的特性。

技术说明

Attention机制的基本思想是,在进行预测时,模型应该“关注”输入中最相关的部分。在OCR的环境中,这意味着在预测某个字符时,模型应该关注图像中与该字符最相关的区域。

Seq2Seq+Attention模型就是基于Attention的一种典型模型。这种模型通常由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器的任务是将输入图像转化为一组特征向量。解码器的任务是将这些特征向量转化为字符序列。

与传统的Seq2Seq模型不同,这里的解码器在生成每一个字符时,都会通过Attention机制来选择和关注哪些特征向量。换句话说,模型会“关注”那些对当前预测最有帮助的特征。

技术步骤

使用基于Attention的解码方式处理OCR问题,一般会采用以下的技术步骤:

1.特征提取:首先,我们需要一个编码器(通常是深度神经网络,如CNN)来将输入的图像转化为一组特征向量。

2.序列预测:然后,我们需要一个解码器(通常是递归神经网络,如RNN或者LSTM)来将这些特征向量转化为字符序列。在生成每一个字符时,解码器都会使用Attention机制来选择和关注哪些特征向量。

3.Attention解码:通过Attention解码过程,模型能够生成一系列的字符,这些字符共同组成了最终的文本结果。值得注意的是,由于每一步预测都是依赖于前面所有步骤的上下文信息,因此,这种方法在处理复杂的、不规则的文本时,通常能够取得更好的效果。

基于Attention的解码方式虽然在处理不规则形状的文本,如弯曲文本或手写文本时效果较好,但是需要注意的是,当处理的文本过长或者过短时,这种方法可能效果会有所降低。此外,由于模型需要考虑全部的上下文信息,因此计算复杂度相对较高,这也是基于Attention的解码方式需要注意的一点。

基于字符分割的方法

我们在阅读单词时,会一个字母一个字母地阅读。这种方法对于处理弯曲的文本和不规则的文本非常有效,但前提是我们需要对每个字符进行精确的标注,这就是基于字符分割的方法。

在OCR领域,基于字符分割的方法是一种更传统的解决方式,它的核心思想是将OCR问题拆解为两个子问题:字符检测和字符识别。这种方法对处理弯曲文本和不规则文本有一定优势,但是对字符标注的要求较高。

技术说明

基于字符分割的方法首先通过图像处理技术来分割出图像中的每个字符,然后对每个字符进行单独的识别。这种方式的优点是它能够处理各种形状和大小的文本,尤其是弯曲和不规则的文本。而且,由于每个字符都是单独处理的,所以它也能很好地处理字符间距不一致的情况。

然而,这种方法也有它的局限性。由于它需要对每个字符进行精确的定位和分割,所以它对字符标注的要求很高。在实际应用中,由于各种各样的干扰因素(比如光照、背景噪声、字体样式等),很难做到完全准确的字符分割。

技术步骤

使用基于字符分割的方法处理OCR问题,一般会采用以下的技术步骤:

1.字符检测:首先,我们需要用一种字符检测算法(如滑动窗口或基于区域的方法)来定位并分割出图像中的每个字符。这通常需要大量的图像处理技术,例如边缘检测、形态学操作等。

2.字符识别:然后,我们需要对每个分割出来的字符进行识别。这可以通过一个分类器(如SVM或深度神经网络)来完成。每个字符都被单独识别,然后组合在一起形成最终的文本。

3.字符排序:在识别了所有字符后,我们还需要对它们进行排序,以得到正确的阅读顺序。这通常可以通过空间关系(如从左到右,从上到下)或者序列模型(如HMM)来完成。

在这个过程中,字符的定位、分割和识别都是关键步骤,每个步骤的结果都会直接影响到最终的OCR性能。因此,尽管基于字符分割的方法在处理一些复杂文本时有其优势,但也需要在实际应用中权衡其复杂性和准确性。

基于Transformer的方法

Transformer模型在近年来的NLP领域已经展现出了巨大的潜力,它优秀的性能也引起了OCR领域的注意。基于Transformer的方法提供了一种全新的处理OCR问题的方式,这种方法可以解决CNN在处理长期依赖问题上的局限性。

技术说明

Transformer模型的核心是自注意力(Self-Attention)机制,这种机制能使模型在处理序列数据时,对每个元素都有一个全局的视角。在OCR问题中,这意味着模型在预测某个字符时,能同时考虑到图像中所有的区域,而不仅仅是局部区域。

Transformer模型通常由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器的任务是将输入的图像转化为一组特征向量。解码器的任务是将这些特征向量转化为字符序列。值得注意的是,由于自注意力机制的存在,编码器和解码器在处理每个特征向量或字符时,都能考虑到所有的特征向量或字符。

技术步骤

使用基于Transformer的方法处理OCR问题,一般会采用以下的技术步骤:

1.特征提取:首先,我们需要一个编码器(通常是深度神经网络,如CNN)来将输入的图像转化为一组特征向量。

2.序列预测:然后,我们需要一个基于Transformer的解码器来将这些特征向量转化为字符序列。在生成每一个字符时,解码器都会使用自注意力机制来选择和关注哪些特征向量。

3.字符组合:最后,解码器将生成的字符序列组合成最终的文本结果。由于Transformer模型对每个特征向量的处理都考虑到了所有的特征向量,因此,这种方法在处理复杂的、不规则的文本时,通常能够取得更好的效果。

总的来说,基于Transformer的方法是一种非常有前途的处理OCR问题的方式。它不仅能克服CNN在处理长期依赖问题上的局限性,而且由于自注意力机制的存在,它在处理复杂文本时的性能也很优秀。然而,由于Transformer模型的计算量相对较大,因此在实际应用中,需要注意计算资源和模型性能之间的平衡。

OCR的未来:预训练OCR大模型呼之欲出的未来

当前,NLP与CV预训练大模型(OpenAI GPT、Meta SAM)已经显示出了强大的性能。通过在大量的无标签数据上进行预训练,大模型可以学习到大量视觉特征和语言特征,将极大地提升模型在下游任务上的性能。当前,这方面的研究已处于飞速发展阶段,已经有一些研究表明,联合字符级别和字段级别文本多模态特征增强的预训练大模型在OCR任务上有很大的潜力。

展望未来,我们期待预训练大模型能够进一步提升OCR的性能,特别是在处理多语言、复杂场景、长文本等问题上。同时,也需要研究如何在保证性能的同时,降低模型的计算资源消耗,使得这些模型能够在更广泛的设备和场景中得到应用。

合合TextIn.com 专注智能文字领域15年

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

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

相关文章

【Linux】多线程概念理论

目录 1 什么是线程? 2 线程的优点 3 线程的缺点 4 线程异常 5 线程用途 6 Linux线程和进程对比 1 什么是线程? 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列…

【目标跟踪】1、基础知识

文章目录 一、卡尔曼滤波二、匈牙利匹配 一、卡尔曼滤波 什么是卡尔曼滤波?——状态估计器 卡尔曼滤波用于在包含不确定信息的系统中做出预测,对系统下一步要做什么进行推测,且会结合推测值和观测值来得到修正后的最优值卡尔曼滤波就是利用…

VS Code 设置大小写转换快捷键

VS Code 设置大小写转换快捷键 前言:VS Code 没有默认的大小写转换快捷键,需要我们自己添加。 一 、打开快捷键设置面板 二、添加快捷键 在搜索框输入 “转换为大写”,如果您的VS Code没有汉化,此处输入“Transform to Uppercase…

OSI七层模型和TCP/IP四层模型以及五层模型

OSI七层模型(Open System Interconnect)即开放系统互连参考模型,是由ISO(International Organization for Standardization)国际标准化组织提出的,用于计算机或通信系统间互联的标准体系。 从上到下可分为…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文:FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

Mybatis单元测试,不使用spring

平时开发过程中需要对mybatis的Mapper类做单元测试,主要是验证语法是否正确,尤其是一些复杂的动态sql,一般项目都集成了spring或springboot,当项比较大时,每次单元测试启动相当慢,可能需要好几分钟&#xf…

[Linux] CentOS7 中 pip3 install 可能出现的 ssl 问题

由于解决问题之后, 才写的博客, 所以没有图片记录. 尽量描述清楚一些 今天写代码的时候, 突然发现 文件里用了#define定义宏之后, coc.nvim的coc-clangd补全就用不了 :checkhealth了一下, 发现nvim忘记支持python3了 尝试pip3 install neovim的时候, 发现会警告然后安装失败.…

linux服务器部署

文章目录 一、基本工具安装1.使用vi命令编辑文件 二、安装1.jdk2.读入数据 总结 一、基本工具安装 1.使用vi命令编辑文件 注:如果vi命令没有,可以使用yum -y install vim或者apt-get install vim命令安装。 Linux操作系统第二讲 二、安装 1.jdk 参考 卸载jdk…

Mybatis-Plus插入数据返回主键两种方式(注解或XML)

废话不多说&#xff0c;直接撸代码: <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace&qu…

递归排序算法快速排序的实现过程

快速排序(Insertion Sort)也是一种递归排序算法。 快速排序原理&#xff1a;先以列表中的任意一个数为基准(一般选头或尾)&#xff0c;将列表分为左、右两个子列表。 左子列表的数要比基准数小&#xff0c;右子列表的数要比基准数大。然后继续把左子列表和右子列表按同样的方…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

IDEA导入微服务项目后自动将微服务展示在service面板中

有时候&#xff0c;不会自动将微服务展示在service面板中。 添加service面板&#xff1a; service面板&#xff1a; 更新所有maven&#xff0c;就可以自动将微服务展示在service面板中。

Opencv 细节补充

1.分辨率的解释 •像素&#xff1a;像素是分辨率的单位。像素是构成位图图像最基本的单元&#xff0c;每个像素都有自己的颜色。 •分辨率&#xff08;解析度&#xff09;&#xff1a; a) 图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch) b) PPI表示的是每英…

git 实操

首先有安装好的git,安装好后,会在任一目录下右键出现git bash和git gui两个选项 打开git bash,设置好全局变量,用户名和邮箱,设置方法为: git config -- global user.name "xxx" git config --global user.email "xxxxxx.com" 1.创建版本库 git init 命…

安装及配置zabbix_agent代理端(监控FTP服务器)

监控agent的linux主机我们在之前的文章里已经做好了 现在直接安装ftp服务即可 [rootagent ~]# yum install -y vsftpd[rootagent ~]# systemctl start vsftpd #启动ftp服务[rootagent ~]# systemctl enable vsftpd #设置ftp服务开机自启 Created symlink fro…

MFC第二十天 数值型关联变量 和单选按钮与复选框的开发应用

文章目录 数值型关联变量数值型关联变量的种类介绍 单选按钮与复选框单选按钮的组内选择原理解析单选按钮和复选框以及应用数值型关联变量的开发CMainDlg.cppCInputDlg.hCInputDlg.cpp 附录 数值型关联变量 数值型关联变量的种类介绍 1、 数值型关联变量&#xff1a; a)控件型…

小程序 user agent stylesheet 覆盖了page下wxss背景色

如下图&#xff1a; login页面的page下的背景色&#xff0c;被&#xff1a;user agent stylesheet覆盖。 分析与解决&#xff1a; 1、user agent stylesheet是浏览器默认样式表&#xff0c;是浏览器默认样式。 2、不同浏览器的默认样式不同个&#xff0c;甚至同种浏览器不同版…

2023年7月杭州/武汉/深圳制造业产品经理NPDP认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

vue2和vue3关于class类的绑定以及style的绑定的区别

本篇为个人笔记 1.对于class类的绑定的区别 vue2:对于vue2而言&#xff0c;所有类的绑定都是基于对象{}来进行的 例如&#xff1a;单个类绑定 <div :class"{active:isActive}"></div> 多个类绑定&#xff1a; <div :class"{active,hasError…

Vue--声明式导航

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…