OpenCV第十二章——人脸识别

1.人脸跟踪

1.1 级联分类器

OpenCV中的级联分类器是一种基于AdaBoost算法的多级分类器,主要用于在图像中检测目标对象。以下是对其简单而全面的解释:

一、基本概念

级联分类器:是一种由多个简单分类器(弱分类器)级联组成的强分类器。每个弱分类器逐步过滤掉非目标区域,减少误检率,同时尽可能保持高召回率。这种结构使得级联分类器在检测过程中能够高效且准确地识别目标对象。

AdaBoost算法:Adaptive Boosting(自适应增强)的缩写,是一种集成学习算法。它通过构建一系列弱分类器,并根据每个弱分类器的表现(即分类错误率)来调整其在最终强分类器中的权重,从而组合成一个强分类器。

二、工作原理

  1. 特征提取:级联分类器使用特征提取器(如Haar-like特征、Local Binary Patterns(LBP)等)从图像中提取出用于分类的特征。这些特征通常反映了图像的灰度变化、纹理信息等。

  2. 训练过程

    • 准备训练数据:包括大量的正样本(包含目标对象的图像)和负样本(不包含目标对象的图像)。
    • 使用AdaBoost算法训练每一级分类器:在每一级中,算法会选择一些特征来训练一个弱分类器,并通过调整样本权重来优化分类器的性能。随着训练的进行,后续级别的分类器会专注于更难以区分的样本。
    • 重复上述过程,直到满足预定的训练精度要求或达到预设的级数。
  3. 检测过程

    • 输入待检测的图像,并将其转换为灰度图像。
    • 使用训练好的级联分类器对图像进行扫描,通过不断缩小图像(制作图像金字塔)和滑动检测窗口来寻找目标对象。
    • 每一级分类器都会对当前检测窗口内的图像区域进行分类,如果认为是目标对象的一部分,则将该区域传递给下一级分类器进行更细粒度的检测。
    • 最终,当某个检测窗口通过所有级别的分类器时,就认为该窗口内存在目标对象,并输出其位置和大小。

三、优缺点

优点

  • 简单、易于理解和实现。
  • 易于并行化,适合处理大量数据。
  • 在许多目标检测任务中表现出色,特别是在面部检测和其他特征点检测方面。

缺点

  • 对异常值敏感,容易受到噪声和光照变化的影响。
  • 需要大量的训练数据和计算资源来训练级联分类器。
  • 对复杂形状和纹理的描述能力有限,可能无法准确检测某些类型的目标对象。

四、应用场景

OpenCV中的级联分类器广泛应用于各种目标检测任务中,包括但不限于面部检测、眼睛检测、车辆检测等。这些分类器通常以XML文件的形式提供,包含了训练好的特征和分类器参数,用户可以直接加载这些文件来进行目标检测。

综上所述,OpenCV中的级联分类器是一种高效且强大的目标检测工具,通过结合AdaBoost算法和特征提取技术,能够在复杂的图像中准确地识别出目标对象。

1.2 方法

OpenCV通过CascadeClassifier()方法创建了级联分类器对象,其语法结构如下:

<CascadeClassifier object> = cv2.CascadeClassifier(filename)

参数说明:

filename:级联分类器的XML文件名。

返回值说明:

object:分类器对象。

之后使用已经创建好的分类器对图像进行识别,此过程需要调用分类器对象的detectMulti-Scale()方法,语法格式如下:

objects = cascsde.detectMultiScale(image, scaleFactor, minNeighbors, flags,minSize,maxSize)

对象说明:

cascade:已有的分类器对象。

参数说明:

image:待分析的图像。

scaleFactor:可选参数,扫描图像时的缩放比例。

minNeighbors:可选参数,每个候选区域至少保留多少个检测结果才可以判定为人脸。该值越大分析的误差越小。

flags:可选参数,建议使用默认值。

minSize:可选参数,最小的目标尺寸。

maxSize:可选参数,最大的目标尺寸。

返回值说明:

objects:捕捉到的目标区域数组,数组中每一个元都是一个目标区域,每一个目标区域都包含四个值,分别是:左上角点横坐标,左上角点纵坐标,区域宽,区域高。

1.3分析人脸位置

haarcascade_frontalface_default.xml是就按测正面人脸的级联分类器文件,加载该文件就可以创建出追踪正面人脸的分类器,调用分类器对象的detectMultiScale()方法,就可以得到人脸区域的坐标的和宽高。

1.3.1 在图像的人脸位置绘制红框

操作代码示例:

import cv2img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\1 (37).jpg")  # 读取人脸图像
# 加载识别人脸的级联分类器
faceCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\12\01\cascades\haarcascade_frontalface_default.xml")
faces = faceCascade.detectMultiScale(img, 1.3)  # 识别出所有人脸
for (x, y, w, h) in faces:  # 遍历所有人脸的区域cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 5)  # 在图像中人脸的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

1.3.2 实现特效、

操作代码示例:

import cv2# 覆盖图像
def overlay_img(img, img_over, img_over_x, img_over_y):"""覆盖图像:param img: 背景图像:param img_over: 覆盖的图像:param img_over_x: 覆盖图像在背景图像上的横坐标:param img_over_y: 覆盖图像在背景图像上的纵坐标:return: 两张图像合并之后的图像"""img_h, img_w, img_p = img.shape  # 背景图像宽、高、通道数img_over_h, img_over_w, img_over_c = img_over.shape  # 覆盖图像高、宽、通道数if img_over_c == 3:  # 通道数小于等于3img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)  # 转换成4通道图像for w in range(0, img_over_w):  # 遍历列for h in range(0, img_over_h):  # 遍历行if img_over[h, w, 3] != 0:  # 如果不是全透明的像素for c in range(0, 3):  # 遍历三个通道x = img_over_x + w  # 覆盖像素的横坐标y = img_over_y + h  # 覆盖像素的纵坐标if x >= img_w or y >= img_h:  # 如果坐标超出最大宽高break  # 不做操作img[y, x, c] = img_over[h, w, c]  # 覆盖像素return img  # 完成覆盖的图像face_img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\1_37.jpg")  # 读取人脸图像
face_img = cv2.resize(face_img, (800, 800))
glass_img = cv2.imread(r"B:\Python_opencv_book\12\02\glass.png", cv2.IMREAD_UNCHANGED)  # 读取眼镜图像,保留图像类型
height, width, channel = glass_img.shape  # 获取眼镜图像高、宽、通道数
# 加载级联分类器
face_cascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\12\02\cascades\haarcascade_frontalface_default.xml")
garyframe = cv2.cvtColor(face_img, cv2.COLOR_BGR2GRAY)  # 转为黑白图像
faces = face_cascade.detectMultiScale(garyframe, 1.3, 5)  # 识别人脸
for (x, y, w, h) in faces:  # 遍历所有人脸的区域gw = w  # 眼镜缩放之后的宽度gh = int(height * w / width)  # 眼镜缩放之后的高度度glass_img = cv2.resize(glass_img, (gw, gh))  # 按照人脸大小缩放眼镜overlay_img(face_img, glass_img, x, y + int(h * 1 / 3))  # 将眼镜绘制到人脸上
cv2.imshow("screen", face_img)  # 显示最终处理的效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

操作效果图像:

2.检测其他内容

2.1 眼睛跟踪

操作代码示例:

import cv2img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\12-3.jpg")  # 读取人脸图像
# img = cv2.resize(img, (800, 800))
# 加载识别眼睛的级联分类器
eyeCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\12\03\cascades\haarcascade_eye.xml")
eyes = eyeCascade.detectMultiScale(img, 1.15)  # 识别出所有眼睛
for (x, y, w, h) in eyes:  # 遍历所有眼睛的区域cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 4)  # 在图像中眼睛的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

2.2 猫脸跟踪

操作代码示例:


import cv2
img = cv2.imread(r"B:\Python_opencv_book\12\04\cat.jpg")  # 读取猫脸图像
# 加载识别猫脸的级联分类器
catFaceCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\12\04\cascades\haarcascade_frontalcatface_extended.xml")
catFace = catFaceCascade.detectMultiScale(img, 1.15, 4)  # 识别出所有猫脸
for (x, y, w, h) in catFace:  # 遍历所有猫脸的区域cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)# 在图像中猫脸的位置绘制方框
cv2.imshow("A cute cat.", img)  # 显示最终处理的效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

2.3 行人跟踪

在操作用图像:

操作代码示例:


import cv2
img = cv2.imread(r"B:\Python_opencv_book\12\05\monitoring.jpg")  # 读取图像
# 加载识别类人体的级联分类器
bodyCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\12\05\cascades\haarcascade_fullbody.xml")
bodys = bodyCascade.detectMultiScale(img, 1.15, 4)  # 识别出所有人体
for (x, y, w, h) in bodys:  # 遍历所有人体区域cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)# 在图像中人体的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey() 
cv2.destroyAllWindows()  


操作效果图像:

2.4 车牌跟踪

操作代码示例:


import cv2img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\12_10.jpg")  # 读取车的图像
# 加载识别车牌的级联分类器
plateCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\12\06\cascades\haarcascade_russian_plate_number.xml")
plates = plateCascade.detectMultiScale(img, 1.15, 4)  # 识别出所有车牌
for (x, y, w, h) in plates:  # 遍历所有车牌区域cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)  # 在图像中车牌的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  
cv2.destroyAllWindows()  


操作效果图像:

3.人脸识别

3.1 Eigenfaces人脸识别器

Eigenfaces人脸识别器是一种基于主成分分析(PCA)技术的人脸识别方法,也常被称为“特征脸”方法。以下是对Eigenfaces人脸识别器的详细简述:

原理

Eigenfaces方法的核心思想是通过PCA将人脸图像从高维空间转换到低维空间,同时保留图像中的主要特征信息。具体来说,PCA被用来计算训练集中所有人脸图像的协方差矩阵,并从中提取出一组特征向量(即主成分),这些特征向量被称为“特征脸”(Eigenfaces)。这些特征脸代表了人脸图像中最具代表性的特征,如眼睛、鼻子和嘴巴的位置和形状等。

步骤

Eigenfaces人脸识别器的实现通常包括以下步骤:

  1. 数据预处理:将人脸图像转换为灰度图像,并进行大小归一化处理,以确保所有图像具有相同的尺寸和格式。
  2. 特征提取:对预处理后的人脸图像进行PCA分析,提取出一组特征向量(特征脸)。这些特征向量能够捕捉到人脸图像中的关键特征信息。
  3. 训练分类器:使用提取出的特征向量和对应的标签(即人脸的身份信息)来训练一个分类器。这个分类器可以是K-近邻分类器、支持向量机(SVM)等,用于将输入的人脸图像映射到其对应的身份标签上。
  4. 人脸识别:对于一张新的未知身份的人脸图像,首先将其转换为特征向量,然后使用训练好的分类器进行识别。分类器会计算输入图像与训练集中各个身份的特征向量之间的距离或相似度,并返回最相似的身份标签作为识别结果。

优缺点

优点

  • Eigenfaces方法能够有效地降低人脸图像的维度,同时保留关键特征信息,从而提高识别效率。
  • 它对光照、表情等变化具有一定的鲁棒性,能够在一定程度上应对这些变化对识别结果的影响。

缺点

  • Eigenfaces方法对姿态变化比较敏感,当人脸图像存在较大的姿态差异时,识别效果可能会下降。
  • 它对于图像质量的要求较高,如果输入图像的质量较差(如模糊、遮挡等),可能会影响识别效果。

需要通过三个方法来完成人脸识别操作:

1.通过cv2.face.EigenFaceRecognizer_creat()方法创建人脸识别器

语法格式如下:recognizer = cv2.face.EigenFacecognizer_create(num_components,threshold)

参数说明:

num_components:可选参数,PCA方法中保留的分量个数

thresh:可选参数。人脸识别时使用的阈值

返回值说明:

recognizer:创建完的人脸识别器对象。

2.创建完识别器对象后,需要通过对象的train()方法来训练识别器。建议每个人都给出2张以上的照片作为训练样本。该方法语法结构如下:

recognizer.train(src, labels)

对象说明:

recognizer.train(src, lables)

参数说明:

src:用来训练的人脸图像样本列别,格式为list。样本图像必须宽高一致。

labels:样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同。样本与标签一一对应,

3.训练完识别器后就可以通过识别器的predict()方法来识别人脸了,该方法hi比对样本的特征,给出最相近的结果和评分。其语法结构如下:

label, confidence = recognizer.predict(src)

对象说明:

recognizer:已有的Eigenfaces人脸识别器对象。

参数说明:

src:需要识别的人脸对象,该图像宽高必须与样本一致。

返回值说明:

label:与样本匹配程度最高的标签值。

confidence:匹配程度最高的信用度评分,小于5000就可以认为匹配程度较高,0分表示两幅图像完全一样。

示例代码如下:其中Elvis1、2、3和summers1、2、3为训练样本,summers4为待识别图像。


import cv2
import numpy as npphotos = list()  # 样本图像列表
labels = list()  # 标签列表
photos.append(cv2.imread(r"B:\Python_opencv_book\12\07\face\summer1.png", 0))  # 记录第1张人脸图像
labels.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\07\face\summer2.png", 0))  # 记录第2张人脸图像
labels.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\07\face\summer3.png", 0))  # 记录第3张人脸图像
labels.append(0)  # 第3张图像对应的标签photos.append(cv2.imread(r"B:\Python_opencv_book\12\07\face\Elvis1.png", 0))  # 记录第4张人脸图像
labels.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\07\face\Elvis2.png", 0))  # 记录第5张人脸图像
labels.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\07\face\Elvis3.png", 0))  # 记录第6张人脸图像
labels.append(1)  # 第6张图像对应的标签names = {"0": "Summer", "1": "Elvis"}  # 标签对应的名称字典recognizer = cv2.face.EigenFaceRecognizer_create()  # 创建特征脸识别器
recognizer.train(photos, np.array(labels))  # 识别器开始训练i = cv2.imread(r"B:\Python_opencv_book\12\07\face\summer4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字
cv2.waitKey() 
cv2.destroyAllWindows()  

操作结果:

3.2 Fisherfaces人脸识别器

同样是三个步骤:

1. 创建 FisherFaces 人脸识别器

使用cv2.face.FisherFaceRecognizer_create() 方法创建人脸识别器。

语法格式如下:

recognizer = cv2.face.FisherFaceRecognizer_create(num_components=150, threshold=200.0)

2.训练识别器

语法格式如下: 

# 假设 images 是包含人脸图像列表的变量,每个图像已调整为相同大小  
# labels 是与每个图像对应的标签列表  
recognizer.train(images, labels)

 3.识别人脸

语法格式如下:

# 假设 new_face 是待识别的人脸图像,且已调整为与训练样本相同的尺寸  
label, confidence = recognizer.predict(new_face)  # 输出识别结果  
print(f"Recognized as person with label: {label}, confidence: {confidence}")  # 根据置信度判断识别是否成功  
if confidence < 5000:  print("High confidence in recognition")  
else:  print("Low confidence in recognition")

 操作代码示例:


import cv2
import numpy as npphotos = list()  # 样本图像列表
lables = list()  # 标签列表
photos.append(cv2.imread(r"B:\Python_opencv_book\12\08\face\Mike1.png", 0))  # 记录第1张人脸图像
lables.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\08\face\Mike2.png", 0))  # 记录第2张人脸图像
lables.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\08\face\Mike3.png", 0))  # 记录第3张人脸图像
lables.append(0)  # 第3张图像对应的标签photos.append(cv2.imread(r"B:\Python_opencv_book\12\08\face\kaikai1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\08\face\kaikai2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\08\face\kaikai3.png", 0))  # 记录第6张人脸图像
lables.append(1)  # 第6张图像对应的标签names = {"0": "Mike", "1": "kaikai"}  # 标签对应的名称字典recognizer = cv2.face.FisherFaceRecognizer_create()  # 创建线性判别分析识别器
recognizer.train(photos, np.array(lables))  # 识别器开始训练i = cv2.imread(r"B:\Python_opencv_book\12\08\face\Mike4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字cv2.waitKey()
cv2.destroyAllWindows()  

操作效果:

 

3.3 Local Binary Pattern Histogram人脸识别器

同样三个步骤

1.创建LBPH人脸识别器

语法格式如下:

import cv2  # 创建LBPH人脸识别器  
recognizer = cv2.face.LBPHFaceRecognizer_create()  
# 如果需要,可以设置参数,如半径和邻居数等,但这里我们使用默认设置  
# recognizer = cv2.face.LBPHFaceRecognizer_create(radius=1, neighbors=8, grid_x=8, grid_y=8)

2.训练识别器

语法格式如下: 

 

# 假设images是预处理过(灰度化、大小调整等)的图像列表,labels是对应的标签  
images = [...]  # 图像列表  
labels = [...]  # 对应的标签列表  # 训练识别器  
recognizer.train(images, labels)

3.使用predict()方法来识别人脸

语法结构如下: 

# 假设test_image是待识别的图像,且已调整为与训练图像相同的大小  
test_image = ...  # 待识别的图像  # 预测  
label, confidence = recognizer.predict(test_image)  # 打印预测结果  
print(f"Predicted label: {label}, Confidence: {confidence}")  # 置信度评分小于某个阈值(例如5000)时,认为识别成功  
if confidence < 5000:  print("Recognized with high confidence!")  
else:  print("Low confidence recognition or unknown face.")

 操作实例代码:

import cv2
import numpy as npphotos = list()  # 样本图像列表
lables = list()  # 标签列表
photos.append(cv2.imread(r"B:\Python_opencv_book\12\09\face\lxe1.png", 0))  # 记录第1张人脸图像
lables.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\09\face\lxe2.png", 0))  # 记录第2张人脸图像
lables.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\09\face\lxe3.png", 0))  # 记录第3张人脸图像
lables.append(0)  # 第3张图像对应的标签photos.append(cv2.imread(r"B:\Python_opencv_book\12\09\face\ruirui1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\09\face\ruirui2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\12\09\face\ruirui3.png", 0))  # 记录第6张人脸图像
lables.append(1)  # 第6张图像对应的标签names = {"0": "LXE", "1": "RuiRui"}  # 标签对应的名称字典recognizer = cv2.face.LBPHFaceRecognizer_create()  # 创建LBPH识别器
recognizer.train(photos, np.array(lables))  # 识别器开始训练i = cv2.imread(r"B:\Python_opencv_book\12\09\face\ruirui4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字cv2.waitKey() 
cv2.destroyAllWindows()  

操作效果:

 4.总结

LBPH(Local Binary Patterns Histogram,局部二值模式直方图)、Eigenfaces和Fisherfaces是人脸识别中常用的三种算法,它们各自具有不同的优势和劣势。

LBPH人脸识别器

优势

  1. 灵活性高:LBPH算法允许模型样本人脸和检测到的人脸在形状、大小上有所不同,这增加了算法的适用范围。
  2. 鲁棒性强:由于LBP特征对光照变化不敏感,LBPH算法在光照变化较大的环境中也能保持较好的识别效果。
  3. 计算效率高:LBP特征提取简单,计算速度快,适合实时性要求较高的场景。

劣势

  1. 精度依赖样本质量:如果训练样本的质量不高,或者样本之间的差异性较小,可能会影响识别精度。
  2. 对极端表情和姿态的适应性差:在极端表情或姿态下,人脸特征可能会发生较大变化,影响识别效果。

Eigenfaces人脸识别器

优势

  1. 理论基础扎实:Eigenfaces基于PCA(主成分分析)进行特征提取,PCA是计算机视觉中常用的降维技术,理论成熟。
  2. 计算相对简单:相比于其他复杂的人脸识别算法,Eigenfaces的计算过程相对简单。

劣势

  1. 对光照敏感:Eigenfaces算法对光照变化较为敏感,光照条件的变化可能会影响识别效果。
  2. 识别精度有限:在复杂的人脸图像数据集中,Eigenfaces的识别精度可能不如一些更先进的算法。

Fisherfaces人脸识别器

优势

  1. 识别精度高:Fisherfaces从PCA衍生发展而来,逻辑更复杂,计算更密集,通常能够获得比Eigenfaces更高的识别精度。
  2. 对光照和表情变化有一定适应性:Fisherfaces算法能够推断和插值照明和面部表情的变化,从而提高识别效果。

劣势

  1. 计算复杂度高:相比于Eigenfaces和LBPH,Fisherfaces的计算复杂度更高,需要更多的计算资源。
  2. 训练过程较长:由于算法复杂,Fisherfaces的训练过程可能需要更长的时间。

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

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

相关文章

Harmony商城项目

目录&#xff1a; 1、启动项目看效果图2、首页和购物车代码分析2.1、首页代码分析2.2、女装页面代码分析2.3、购物车页面代码分析2.4、购物车结算代码 3、个人中心代码分析 1、启动项目看效果图 2、首页和购物车代码分析 2.1、首页代码分析 import CommonConstants from ../co…

海外合规|新加坡推出智慧国2.0计划 设新网络安全与保障机构

智慧国2.0计划&#xff1a;政府将成立新机构杜绝网络伤害和援助受害者。政府将成立新机构&#xff0c;并制定新法令&#xff0c;以杜绝网络伤害行为和为受害者提供更多援助与保障。新加坡总理兼财政部长黄循财星期二&#xff08;10月1日&#xff09;在推介晚宴上&#xff0c;宣…

SOCKS5代理和HTTP代理哪个快?深度解析两者的速度差异

在现代互联网环境中&#xff0c;使用代理IP已经成为了许多人日常生活和工作的必备工具。无论是为了保护隐私&#xff0c;还是为了访问某些特定资源&#xff0c;代理IP都扮演着重要的角色。今天&#xff0c;我们就来聊聊SOCKS5代理和HTTP代理&#xff0c;看看这两者到底哪个更快…

9. 正则表达式

编程工具和技术是以一种混乱、进化的方式生存和传播的。获胜的并不总是最好或最杰出的工具&#xff0c;而是那些在合适的利基市场中发挥足够好的功能&#xff0c;或者恰好与另一项成功的技术相结合的工具。 在本章中&#xff0c;我将讨论这样一种工具--正则表达式。正则表达式是…

【Android 14源码分析】Activity启动流程-3

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

【C++】C++基础

目录 一. C关键字(C98) 二、C的第一个程序 三、命名空间 3.1.namespace的价值 3.2.namespace的定义 3.2.命名空间使用 总结&#xff1a;在项目当中第一、第二种方法搭配使用&#xff0c;第三种冲突风险非常大&#xff0c;仅适合练习使用。 四、C输入&输出 五、缺省…

python之with

with上下文管理是什么呢&#xff1f; 一般都是使用系统提供的一些with语句&#xff0c;列如我要去读取一些数据进行分析&#xff0c;就可以使用with open去读取某些数据&#xff0c;或者我要把一些图片给他保存到某些地方&#xff0c;可以用with给他写入。 上下午管理器with是…

html5 + css3(上)

目录 HTML认知web标准vscode的简介和使用注释标题和段落换行和水平线标签文本格式化标签图片图片-基本使用图片-属性 绝对路径相对路径音频标签视频标签超链接 HTML基础列表列表-无序和有序列表-自定义 表格表格-使用表格-表格标题和表头单元格表格-结构标签&#xff08;了解&a…

SQL:函数以及约束

目录 介绍 函数 字符串函数 数值函数 日期函数 流程函数 约束 总结 介绍 说到函数我们都不陌生,在C,C,java等语言中都有库函数,我们在平时也是经常使用,函数就是一段代码,我们既可以自定义实现,又可以使用库里内置的函数;从来更加简洁方便的完成业务;同样的在SQL中也有…

五子棋双人对战项目(4)——匹配模块(解读代码)

目录 一、约定前后端交互接口的参数 1、websocket连接路径 2、构造请求、响应对象 二、用户在线状态管理 三、房间管理 1、房间类&#xff1a; 2、房间管理器&#xff1a; 四、匹配器(Matcher) 1、玩家实力划分 2、加入匹配队列&#xff08;add&#xff09; 3、移除…

【C语言指南】数据类型详解(上)——内置类型

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 目录 引言 1. 整型&#xff08;Integer Types&#xff09; 2. 浮点型&#xff08;Floating-Point …

java发送邮件email实战

1.首先在项目中增加依赖&#xff0c;在pom文件中添加如下坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2.发邮件工具类如下 package com.example.demo.…

力扣 —— 多数元素 轮转数组

多数元素 题目(简单) 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a; nums [3,2,3] 输…

第24天sql注入(小迪安全学习)

前置知识&#xff08;搭建环境失败&#xff0c;搞不了实验了&#xff0c;学下理论知识吧&#xff09; sql注入 脚本代码在实现代码与数据库进行数据通讯时&#xff08;从数据库中取出相关数据&#xff09;&#xff0c;将定义的SQL语句进行执行查询数据时其中的SQL语句能通过参…

VSOMEIP代码阅读整理(1) - 网卡状态监听

一. 概述 在routing进程所使用的配置文件中&#xff0c;存在如下配置项目&#xff1a;{"unicast" : "192.168.56.101",..."service-discovery" :{"enable" : "true","multicast" : "224.244.224.245",…

Oracle 表空间时间点恢复

已有一个数据库全备&#xff0c;在PDB中恢复被drop掉的表空间 1.新建表空间 create tablespace PITR_TBS datafile /u01/app/oracle/oradata/PRODCDB/PDBPROD2/PITR_TBS01.dbf size 10m; 2.使用RMAN备份. backup as compressed backupset database INCLUDE CURRENT CONTROLFI…

从零开始搭建UVM平台(八)-加入agent

书接上回&#xff1a; 从零开始搭建UVM平台&#xff08;一&#xff09;-只有uvm_driver的验证平台 从零开始搭建UVM平台&#xff08;二&#xff09;-加入factory机制 从零开始搭建UVM平台&#xff08;三&#xff09;-加入objection机制 从零开始搭建UVM平台&#xff08;四&…

Cortex微控制器软件接口标准(CMSIS)

Cortex微控制器软件接口标准 目前&#xff0c;软件开发已经是嵌入式系统行业公认的主要开发成本&#xff0c;通过将所有Cortex-M芯片供应商产品的软件接口标准化&#xff0c;能有效降低这一成本&#xff0c;尤其是进行新产品开发或者将现有项目或软件移植到基于不同厂商MCU的产…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

进阶数据库系列(十三):PostgreSQL 分区分表

概述 在组件开发迭代的过程中&#xff0c;随着使用时间的增加&#xff0c;数据库中的数据量也不断增加&#xff0c;因此数据库查询越来越慢。 通常加速数据库的方法很多&#xff0c;如添加特定的索引&#xff0c;将日志目录换到单独的磁盘分区&#xff0c;调整数据库引擎的参…