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

学习目标

  • 理解 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.rhkb.cn/news/120813.html

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

相关文章

JVM垃圾回收机制和常用算法(简洁版)

垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。 判断一个对象是…

QT day5

服务器: #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); }Widget::~Widget() {delete ui…

vue3中TCplayer应用

环境win10:vitevue3elementUI 1 安装 npm install tcplayer.js2 使用 <template><div><video id"player-container-id" width"414" height"270" preload"auto" playsinline webkit-playsinline></video>&l…

【数据结构练习】栈的面试题集锦

目录 前言&#xff1a; 1.进栈过程中可以出栈的选择题 2.将递归转化为循环 3.逆波兰表达式求值 4.有效的括号 5. 栈的压入、弹出序列 6. 最小栈 前言&#xff1a; 数据结构想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#x…

大模型 Dalle2 学习三部曲(二)clip学习

clip论文比较长48页&#xff0c;但是clip模型本身又比较简单&#xff0c;效果又奇好&#xff0c;正所谓大道至简&#xff0c;我们来学习一下clip论文中的一些技巧&#xff0c;可以让我们快速加深对clip模型的理解&#xff0c;以及大模型对推荐带来革命性的变化。 clip结构 首选…

Python+Selenium4环境搭建

很久没有了解自动化了&#xff0c;最近发现项目中沉淀了很多东西&#xff0c;回归测试效率很低&#xff0c;所以必须要考虑构建自动化来提供各个环节的小效率。由于忙于需求以及产品的流程规范&#xff0c;现在对于测试技术方面的研究也相对少了很多。不过不管做什么&#xff0…

Arduino驱动LX1972传感器(光照传感器篇)

LX1972环境光(可见光)传感器,对可见光照度的反应特性与人眼的特性类似,可以模拟人对环境光线的强度的判断,从而方便做出与人友好互动的应用,可应用于照明控制、屏幕背光控制等。 1、传感器特性 传感器技术指标如下: 工作温度: -40~80C照度范围: 1 – 800Lux输出信号:…

CSS中如何实现文字描边效果(Text Stroke)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字描边效果&#xff08;Text Stroke&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

nas汇编程序的调试排错方法

nas汇编程序的调试排错方法&#xff1a; 1、查找是哪一步错了 2、查看对应的*.lst文件&#xff0c;本例中是"asmhead.lst" 3、根据*.lst文件的[ERROR #002]提示查看源码&#xff0c;改错。 4、重新运行编译&#xff0c;OK 1、查找是哪一步错了&#xff1a; nask.ex…

黑盒测试方法论—边界值

边界值分析法是一种很实用的黑盒测试用例方法&#xff0c;它具有很强的发现故障的能力。边界值分析法也是作为对等价类划分法的补充&#xff0c;测试用例来自等价类的边界。 这个方法其实是在测试实践当中发现&#xff0c;Bug 往往出现在定义域或值域的边界上&#xff0c;而不…

结构体(个人学习笔记黑马学习)

1、结构体的定义和使用 #include <iostream> using namespace std; #include <string>struct Student {string name;int age;int score; }s3;int main() {//1、struct Student s1;s1.name "张三";s1.age 18;s1.score 100;cout << "姓名&a…

css 选择器

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* ~ 表示的h…

FPGA输出lvds信号点亮液晶屏

1 概述 该方案用于生成RGB信号&#xff0c;通过lvds接口驱动逻辑输出&#xff0c;点亮并驱动BP101WX-206液晶屏幕。 参考&#xff1a;下面为参考文章&#xff0c;内容非常详细。Xilinx LVDS Output——原语调用_vivado原语_ShareWow丶的博客http://t.csdn.cn/Zy37p 2 功能描述 …

如何在你的Android工程中启用K2编译器?

如何在你的Android工程中启用K2编译器&#xff1f; K2编译器是用于Kotlin代码编译的最新、高效编译器&#xff0c;你现在可以尝试使用了。 Kotlin编译器正在为Kotlin 2.0进行重写&#xff0c;新的编译器实现&#xff08;代号K2&#xff09;带来了显著的构建速度改进&#xff…

10 mysql tiny/small/medium/big int 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 int 类类型的相关数据的存储 …

Vue3 学习 组合式API setup语法糖 响应式 指令 DIFF(一)

文章目录 前言一、Composition Api二、setup语法糖三、响应式refreactive 四、其他一些关键点v-prev-oncev-memov-cloak 五、虚拟Dom五、diff算法 前言 本文用于记录学习Vue3的过程 一、Composition Api 我觉得首先VUE3最大的改变就是对于代码书写的改变&#xff0c;从原来选择…

购物商场项目实践

1.项目开始 1&#xff09;此项目为在线电商项目 2&#xff09;包含首页&#xff0c;搜索列表&#xff0c;商品详情&#xff0c;购物车&#xff0c;订单&#xff0c;支付&#xff0c;用户登录/注册等多个子模块 3&#xff09;使用Vue全家桶ES6webpackAxios等前端技术 4&…

MySQL主从复制与读写分离 及其实例

目录 主从复制与读写分离 1、MySQL主从复制原理 1.1、MySQL的复制类型 1.2、MySQL主从复制的工作过程 1.3、mysq支持的复制类型 1.4、 数据流向 1.5、主从复制的工作过程 2、读写分离 2.1、什么是读写分离&#xff1f; 2.2、为什么要读写分离呢&#xff1f; 2.3、什么…

如何快速搭建母婴行业的微信小程序?

如果你想为你的母婴行业打造一个独特的小程序&#xff0c;但没有任何编程经验&#xff0c;别担心&#xff01;现在有许多小程序制作平台提供了简单易用的工具&#xff0c;让你可以轻松地建立自己的小程序。接下来&#xff0c;我将为你详细介绍搭建母婴行业小程序的步骤。 首先&…

MySQL——MySQL的基础操作部分

使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可&#xff1a; 当看到出现“mysql>“的符号之后&#xff0c;就表示已经进入到了&#xff2d;&#xff59;&#xff33;&#xff31;&#xff2c;系统中&#xff0c;就可以输入&#xff2d;&#xff59;&#xf…