当前位置: 首页 > news >正文

《OpenCV》—— dlib库

文章目录

    • dlib库是什么?
    • OpenCV库与dlib库对比
    • dlib库安装
    • dlib——人脸应用实例——人脸检测
    • dlib——人脸应用实例——人脸关键点定位
    • dlib——人脸应用实例——人脸轮廓绘制

dlib库是什么?

在这里插入图片描述

OpenCV库与dlib库对比

在这里插入图片描述

dlib库安装

在这里插入图片描述

dlib——人脸应用实例——人脸检测

对图片中的人脸进行检测:
在这里插入图片描述

代码:

# 导入OpenCV库,它是一个广泛用于计算机视觉任务的库,可用于图像读取、处理和显示等操作
import cv2
# 导入dlib库,dlib是一个强大的机器学习工具包,提供了多种人脸检测和特征提取的功能
import dlib# 创建一个dlib的人脸检测器对象
# get_frontal_face_detector() 是dlib提供的预训练好的人脸检测器,用于检测图像中的人脸
detector = dlib.get_frontal_face_detector()# 使用OpenCV的imread函数读取指定路径的图像文件
# 'hezhao.jpg' 是图像文件的路径,这里假设该图像文件与代码文件在同一目录下
# 读取后的图像以NumPy数组的形式存储在变量 img 中
img = cv2.imread('hezhao.jpg')# 使用人脸检测器对读取的图像进行人脸检测
# 第二个参数 2 表示对图像进行2次上采样,上采样可以提高小尺寸人脸的检测精度,但会增加计算量
# 检测结果存储在变量 faces 中,它是一个包含所有检测到的人脸区域的列表
faces = detector(img, 2)# 遍历检测到的所有人脸
for face in faces:# 获取当前人脸区域的左边界坐标x1 = face.left()# 获取当前人脸区域的上边界坐标y1 = face.top()# 获取当前人脸区域的右边界坐标x2 = face.right()# 获取当前人脸区域的下边界坐标y2 = face.bottom()# 使用OpenCV的rectangle函数在图像上绘制矩形框来标记检测到的人脸# 第一个参数 img 是要绘制矩形框的图像# 第二个参数 (x1, y1) 是矩形框的左上角坐标# 第三个参数 (x2, y2) 是矩形框的右下角坐标# 第四个参数 (0, 255, 0) 表示矩形框的颜色,这里是绿色(BGR格式)# 第五个参数 2 表示矩形框的线宽cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)# 使用OpenCV的imshow函数显示处理后的图像
# 第一个参数 'result' 是显示图像的窗口名称
# 第二个参数 img 是要显示的图像
cv2.imshow('result', img)# 使用OpenCV的waitKey函数等待用户按键
# 参数 0 表示无限等待,直到用户按下任意键
cv2.waitKey(0)# 使用OpenCV的destroyAllWindows函数关闭所有由OpenCV打开的窗口
cv2.destroyAllWindows()

结果:
在这里插入图片描述


也可对视频或使用摄像头中的人脸识别:

代码:

# 导入OpenCV库,它是一个强大的计算机视觉库,可用于视频捕获、图像处理和显示等操作
import cv2
# 导入dlib库,dlib是一个机器学习工具包,提供了预训练的人脸检测模型
import dlib# 创建一个dlib的人脸检测器对象,用于检测图像或视频帧中的人脸
# get_frontal_face_detector() 是dlib提供的预训练好的正面人脸检测器
detector = dlib.get_frontal_face_detector()# 使用OpenCV的VideoCapture函数打开默认摄像头(设备编号为0)
# cap 是一个VideoCapture对象,用于后续读取视频帧
cap = cv2.VideoCapture(0)# 进入一个无限循环,持续处理摄像头捕获的视频帧
while True:# 从摄像头读取一帧视频# ret 是一个布尔值,表示是否成功读取到视频帧# image 是读取到的视频帧,以NumPy数组的形式存储ret, image = cap.read()# 对读取的视频帧进行水平翻转# 第二个参数 1 表示水平翻转,这样可以让画面看起来更符合我们的习惯img = cv2.flip(image, 1)# 如果 ret 为 None 或者 False,说明没有成功读取到视频帧# 这种情况可能是由于摄像头断开连接、视频结束等原因导致的# 此时跳出循环,结束程序if ret is None:break# 使用人脸检测器对当前视频帧进行人脸检测# 第二个参数 1 表示对图像进行1次上采样,上采样可以提高小尺寸人脸的检测精度,但会增加计算量# faces 是一个包含所有检测到的人脸区域的列表faces = detector(img, 1)# 遍历检测到的所有人脸for face in faces:# 获取当前人脸区域的左边界坐标x1 = face.left()# 获取当前人脸区域的上边界坐标y1 = face.top()# 获取当前人脸区域的右边界坐标x2 = face.right()# 获取当前人脸区域的下边界坐标y2 = face.bottom()# 在视频帧上绘制矩形框来标记检测到的人脸# 第一个参数 img 是要绘制矩形框的图像# 第二个参数 (x1, y1) 是矩形框的左上角坐标# 第三个参数 (x2, y2) 是矩形框的右下角坐标# 第四个参数 (0, 255, 0) 表示矩形框的颜色,这里是绿色(BGR格式)# 第五个参数 2 表示矩形框的线宽cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)# 显示处理后的视频帧# 第一个参数 'result' 是显示窗口的名称# 第二个参数 img 是要显示的视频帧cv2.imshow('result', img)# 等待用户按键,等待时间为1毫秒# key 是用户按下键的ASCII码值key = cv2.waitKey(1)# 如果用户按下的键是ESC键(ASCII码值为27)# 则跳出循环,结束程序if key == 27:break# 释放摄像头资源,关闭摄像头设备
cap.release()# 关闭所有由OpenCV打开的窗口
cv2.destroyAllWindows()

dlib——人脸应用实例——人脸关键点定位

通过https://github.com/davisking/dlib-models下载所需要的预训练模型,对图片进行人脸关键点定位。读取一张图像,检测其中的人脸,并在每个人脸的 68 个特征点上绘制绿色圆形标记,同时在标记旁边显示特征点的索引编号,最后显示处理后的图像。在这里插入图片描述

代码:

# 导入NumPy库,用于进行高效的数值计算,这里主要用于处理面部特征点的数组
import numpy as np
# 导入OpenCV库,用于图像处理和计算机视觉任务,如读取图像、绘制图形和显示图像等
import cv2
# 导入dlib库,它是一个强大的机器学习库,这里主要用于人脸检测和面部特征点定位
import dlib# 使用OpenCV的imread函数读取指定路径的图像文件,将其存储为一个NumPy数组
# "c_luo1.png" 是图像文件的路径,你可以根据实际情况修改
img = cv2.imread("c_luo1.png")# 创建一个dlib的人脸检测器对象,用于检测图像中的人脸
# get_frontal_face_detector() 是dlib提供的一个预训练的人脸检测器
detector = dlib.get_frontal_face_detector()# 使用人脸检测器对输入图像进行人脸检测
# 第二个参数0表示不进行图像的上采样,若为正数则会对图像进行上采样以提高检测精度,但会增加计算量
faces = detector(img, 0)# 创建一个dlib的面部特征点预测器对象,用于定位人脸的68个特征点
# 'shape_predictor_68_face_landmarks.dat' 是预训练的特征点预测模型文件,需要提前下载
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 遍历检测到的所有人脸
for face in faces:# 使用面部特征点预测器对当前人脸进行特征点定位# 输入参数为图像和检测到的人脸区域shape = predictor(img, face)# 将dlib的特征点对象转换为NumPy数组,方便后续处理# shape.parts() 返回一个包含68个特征点的对象,每个特征点有x和y坐标# 通过列表推导式将每个特征点的x和y坐标提取出来,存储为一个二维NumPy数组landmarks = np.array([[p.x, p.y] for p in shape.parts()])# 遍历每个特征点for idx, point in enumerate(landmarks):# 提取当前特征点的x和y坐标,存储为一个列表pos = [point[0], point[1]]# 使用OpenCV的circle函数在图像上绘制一个圆形标记特征点# img 是要绘制的图像,pos 是圆心坐标,2 是圆的半径# color=(0, 255, 0) 表示圆的颜色为绿色,thickness=-1 表示填充整个圆形cv2.circle(img, pos, 2, color=(0, 255, 0), thickness=-1)# 使用OpenCV的putText函数在特征点旁边绘制特征点的索引编号# str(idx) 是要绘制的文本,即特征点的索引编号# pos 是文本的起始位置,cv2.FONT_HERSHEY_SIMPLEX 是字体样式# 0.4 是字体大小,(255, 255, 255) 是文本颜色为白色# 1 是文本的线宽,cv2.LINE_AA 表示使用抗锯齿线以提高文本的绘制质量cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4,(255, 255, 255), 1, cv2.LINE_AA)# 使用OpenCV的imshow函数显示处理后的图像
# 'img' 是窗口的名称,img 是要显示的图像
cv2.imshow('img', img)# 使用OpenCV的waitKey函数等待用户按键
# 参数0表示无限等待,直到用户按下任意键
cv2.waitKey(0)# 使用OpenCV的destroyAllWindows函数关闭所有打开的窗口
cv2.destroyAllWindows()

结果:
在这里插入图片描述


也可以对视频或者使用摄像头直接识别人脸然后直接进行人脸关键点的定位:

代码:

# 导入NumPy库,它是Python中用于科学计算的基础库,这里主要用于处理数组数据,比如面部特征点的坐标数组
import numpy as np
# 导入OpenCV库,这是一个强大的计算机视觉库,用于视频捕获、图像处理、绘制图形等操作
import cv2
# 导入dlib库,它是一个机器学习工具包,提供了很多用于人脸检测和特征点定位的预训练模型
import dlib# 使用cv2.VideoCapture函数打开默认的摄像头(设备编号为0),返回一个VideoCapture对象
# 后续可以通过该对象读取摄像头的视频帧
cap = cv2.VideoCapture(0)# 创建一个dlib的面部特征点预测器对象
# 'shape_predictor_68_face_landmarks.dat' 是预训练好的模型文件,用于检测人脸的68个特征点
# 这个文件需要提前下载并放在代码可访问的路径下
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 创建一个dlib的人脸检测器对象
# get_frontal_face_detector() 是dlib提供的一个预训练的人脸检测器,用于在图像中检测人脸
detector = dlib.get_frontal_face_detector()# 进入一个无限循环,持续读取摄像头的视频帧并进行处理
while True:# 使用cap.read()方法从摄像头读取一帧视频# ret 是一个布尔值,表示是否成功读取到视频帧# image 是读取到的视频帧,是一个NumPy数组ret, image = cap.read()# 使用cv2.flip函数对读取到的视频帧进行水平翻转# 第二个参数1表示水平翻转,这样可以让画面看起来更符合我们的习惯img = cv2.flip(image, 1)# 如果ret为False,说明没有成功读取到视频帧,可能是摄像头断开连接等原因# 此时跳出循环,结束程序if ret is None:break# 使用人脸检测器对当前视频帧进行人脸检测# 第二个参数0表示不进行图像的上采样,若为正数则会对图像进行上采样以提高检测精度,但会增加计算量faces = detector(img, 0)# 遍历检测到的所有人脸for face in faces:# 使用面部特征点预测器对当前人脸进行特征点定位# 输入参数为当前视频帧和检测到的人脸区域shape = predictor(img, face)# 将dlib的特征点对象转换为NumPy数组,方便后续处理# shape.parts() 返回一个包含68个特征点的对象,每个特征点有x和y坐标# 通过列表推导式将每个特征点的x和y坐标提取出来,存储为一个二维NumPy数组landmarks = np.array([[p.x, p.y] for p in shape.parts()])# 遍历每个特征点for idx, point in enumerate(landmarks):# 提取当前特征点的x和y坐标,存储为一个列表pos = [point[0], point[1]]# 使用cv2.circle函数在图像上绘制一个圆形标记特征点# img 是要绘制的图像,pos 是圆心坐标,2 是圆的半径# color=(0, 255, 0) 表示圆的颜色为绿色,thickness=-1 表示填充整个圆形cv2.circle(img, pos, 2, color=(0, 255, 0), thickness=-1)# 使用cv2.putText函数在特征点旁边绘制特征点的索引编号# str(idx) 是要绘制的文本,即特征点的索引编号# pos 是文本的起始位置,cv2.FONT_HERSHEY_SIMPLEX 是字体样式# 0.4 是字体大小,(255, 255, 255) 是文本颜色为白色# 1 是文本的线宽,cv2.LINE_AA 表示使用抗锯齿线以提高文本的绘制质量cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4,(255, 255, 255), 1, cv2.LINE_AA)# 使用cv2.imshow函数显示处理后的视频帧# 'img' 是窗口的名称,img 是要显示的图像cv2.imshow('img', img)# 使用cv2.waitKey函数等待用户按键,参数1表示等待1毫秒# 返回值key是用户按下键的ASCII码值key = cv2.waitKey(1)# 如果用户按下的键是ESC键(ASCII码值为27),则跳出循环,结束程序if key == 27:break# 释放摄像头资源,关闭摄像头设备
cap.release()# 关闭所有由OpenCV打开的窗口
cv2.destroyAllWindows()

可以自己进行尝试,也可从网站下载其他功能的预训练模型进行测试

dlib——人脸应用实例——人脸轮廓绘制

对人脸的轮廓进行绘制是基于关键点检测的基础上进行的,更能体现出人脸的特征与表情变化。

代码:

# 导入NumPy库,用于高效处理多维数组和矩阵运算,这里主要用于处理面部特征点的坐标数据
import numpy as np
# 导入OpenCV库,用于图像处理、绘制图形和显示图像等操作
import cv2
# 导入dlib库,它是一个机器学习工具包,提供了人脸检测和面部特征点定位的功能
import dlib# 定义一个函数,用于在图像上绘制线段,连接一系列面部特征点
def drawLine(start, end):# 从shape数组中提取从start到end(不包含end)的特征点pts = shape[start:end]# 遍历提取的特征点for l in range(1, len(pts)):# 获取前一个特征点的坐标,并转换为元组形式ptA = tuple(pts[l - 1])# 获取当前特征点的坐标,并转换为元组形式ptB = tuple(pts[l])# 使用OpenCV的line函数在图像上绘制从ptA到ptB的线段# img是要绘制的图像,ptA和ptB是线段的起点和终点,(0, 255, 0)是线段的颜色(绿色),2是线段的线宽cv2.line(img, ptA, ptB, (0, 255, 0), 2)# 定义一个函数,用于在图像上绘制凸包,连接一系列面部特征点形成封闭的凸多边形
def drawConvexHull(start, end):# 从shape数组中提取从start到end(包含end)的特征点Facial = shape[start:end + 1]# 使用OpenCV的convexHull函数计算这些特征点的凸包mouthHull = cv2.convexHull(Facial)# 使用OpenCV的drawContours函数在图像上绘制凸包轮廓# img是要绘制的图像,[mouthHull]是包含凸包轮廓的列表,-1表示绘制所有轮廓,(0, 255, 0)是轮廓的颜色(绿色),2是轮廓的线宽cv2.drawContours(img, [mouthHull], -1, (0, 255, 0), 2)# 使用OpenCV的imread函数读取指定路径的图像文件
# "c_luo1.png" 是图像文件的路径,你可以根据实际情况修改
img = cv2.imread("c_luo1.png")
# 创建一个dlib的人脸检测器对象,用于检测图像中的人脸
detector = dlib.get_frontal_face_detector()
# 使用人脸检测器对输入图像进行人脸检测
# 第二个参数0表示不进行图像的上采样,若为正数则会对图像进行上采样以提高检测精度,但会增加计算量
faces = detector(img, 0)
# 创建一个dlib的面部特征点预测器对象,用于定位人脸的68个特征点
# 'shape_predictor_68_face_landmarks.dat' 是预训练的特征点预测模型文件,需要提前下载
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 遍历检测到的所有人脸
for face in faces:# 使用面部特征点预测器对当前人脸进行特征点定位shape = predictor(img, face)# 将dlib的特征点对象转换为NumPy数组,方便后续处理# shape.parts() 返回一个包含68个特征点的对象,每个特征点有x和y坐标# 通过列表推导式将每个特征点的x和y坐标提取出来,存储为一个二维NumPy数组shape = np.array([[p.x, p.y] for p in shape.parts()])# 绘制左眼的凸包drawConvexHull(36, 41)# 绘制右眼的凸包drawConvexHull(42, 47)# 绘制外嘴唇的凸包drawConvexHull(48, 59)# 绘制内嘴唇的凸包drawConvexHull(60, 67)# 绘制下巴的线段drawLine(0, 16)# 绘制左眉毛的线段drawLine(17, 21)# 绘制右眉毛的线段drawLine(22, 26)# 绘制鼻子的线段drawLine(27, 35)# 使用OpenCV的imshow函数显示处理后的图像
# 'img' 是窗口的名称,img 是要显示的图像
cv2.imshow('img', img)
# 使用OpenCV的waitKey函数等待用户按键
# 参数0表示无限等待,直到用户按下任意键
cv2.waitKey(0)
# 使用OpenCV的destroyAllWindows函数关闭所有打开的窗口
cv2.destroyAllWindows()

在这里插入图片描述

对视频内容进行处理的代码:

# 导入NumPy库,用于进行高效的数值计算和数组操作,后续会用来处理面部特征点的坐标数据
import numpy as np
# 导入OpenCV库,这是一个强大的计算机视觉库,可用于视频捕获、图像处理、绘制图形等操作
import cv2
# 导入dlib库,它是一个机器学习工具包,提供了预训练的人脸检测和面部特征点定位模型
import dlib# 定义一个函数,用于在图像上绘制一系列线段,连接指定范围内的面部特征点
def drawLine(start, end):# 从 shape 数组中提取从 start 到 end(不包含 end)索引位置的特征点pts = shape[start:end]# 遍历提取的特征点,从第二个点开始for l in range(1, len(pts)):# 获取前一个特征点的坐标,并将其转换为元组形式,因为 cv2.line 函数要求坐标为元组ptA = tuple(pts[l - 1])# 获取当前特征点的坐标,并将其转换为元组形式ptB = tuple(pts[l])# 在图像 img 上绘制从 ptA 到 ptB 的线段# (0, 255, 0) 表示线段的颜色为绿色(在OpenCV中颜色采用BGR格式),2 表示线段的线宽cv2.line(img, ptA, ptB, (0, 255, 0), 2)# 定义一个函数,用于在图像上绘制凸包,连接指定范围内的面部特征点形成封闭的凸多边形
def drawConvexHull(start, end):# 从 shape 数组中提取从 start 到 end(包含 end)索引位置的特征点Facial = shape[start:end + 1]# 使用 cv2.convexHull 函数计算这些特征点的凸包,返回一个包含凸包顶点坐标的数组mouthHull = cv2.convexHull(Facial)# 在图像 img 上绘制凸包轮廓# [mouthHull] 表示要绘制的轮廓列表,-1 表示绘制所有轮廓,(0, 255, 0) 是轮廓颜色(绿色),2 是轮廓线宽cv2.drawContours(img, [mouthHull], -1, (0, 255, 0), 2)# 打开默认的摄像头设备(设备编号为 0),返回一个 VideoCapture 对象,用于后续视频帧的读取
cap = cv2.VideoCapture(0)
# 创建一个 dlib 的面部特征点预测器对象,使用预训练的 68 点面部特征模型文件
# 该文件需要提前下载并放在代码可访问的路径下
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 创建一个 dlib 的人脸检测器对象,用于检测图像或视频帧中的人脸
detector = dlib.get_frontal_face_detector()# 进入一个无限循环,持续处理摄像头捕获的视频帧
while True:# 从摄像头读取一帧视频# ret 是一个布尔值,表示是否成功读取到视频帧# image 是读取到的视频帧,以 NumPy 数组的形式存储ret, image = cap.read()# 对读取的视频帧进行水平翻转,这样可以让画面看起来更符合我们的习惯img = cv2.flip(image, 1)# 如果 ret 为 None 或者 False,说明没有成功读取到视频帧# 可能是摄像头断开连接等原因,此时跳出循环,结束程序if ret is None:break# 使用人脸检测器对当前视频帧进行人脸检测# 第二个参数 0 表示不进行图像的上采样,若为正数则会对图像进行上采样以提高检测精度,但会增加计算量faces = detector(img, 0)# 遍历检测到的所有人脸for face in faces:# 使用面部特征点预测器对当前人脸进行特征点定位shape = predictor(img, face)# 将 dlib 的特征点对象转换为 NumPy 数组,方便后续处理# shape.parts() 返回一个包含 68 个特征点的对象,每个特征点有 x 和 y 坐标# 通过列表推导式将每个特征点的 x 和 y 坐标提取出来,存储为一个二维 NumPy 数组shape = np.array([[p.x, p.y] for p in shape.parts()])# 绘制左眼的凸包drawConvexHull(36, 41)# 绘制右眼的凸包drawConvexHull(42, 47)# 绘制外嘴唇的凸包drawConvexHull(48, 59)# 绘制内嘴唇的凸包drawConvexHull(60, 67)# 绘制下巴的线段drawLine(0, 16)# 绘制左眉毛的线段drawLine(17, 21)# 绘制右眉毛的线段drawLine(22, 26)# 绘制鼻子的线段drawLine(27, 35)# 在窗口中显示处理后的视频帧,窗口名称为 'img'cv2.imshow('img', img)# 等待用户按键,等待时间为 1 毫秒# key 是用户按下键的 ASCII 码值key = cv2.waitKey(1)# 如果用户按下的键是 ESC 键(ASCII 码值为 27),则跳出循环,结束程序if key == 27:break# 释放摄像头资源,关闭摄像头设备
cap.release()
# 关闭所有由 OpenCV 打开的窗口
cv2.destroyAllWindows()

相关文章:

《OpenCV》—— dlib库

文章目录 dlib库是什么?OpenCV库与dlib库对比dlib库安装dlib——人脸应用实例——人脸检测dlib——人脸应用实例——人脸关键点定位dlib——人脸应用实例——人脸轮廓绘制 dlib库是什么? OpenCV库与dlib库对比 dlib库安装 dlib——人脸应用实例——人脸检…...

Linux搜索---find

find搜索 find 命令的核心功能是在指定的目录路径下,递归地搜索文件和目录,并且可以根据多种条件对搜索结果进行筛选,还能对符合条件的文件和目录执行特定操作。 一、基础语法结构 find [起始目录] [匹配条件] [执行操作] # 基本示例 find…...

python之爬虫入门实例

链家二手房数据抓取与Excel存储 目录 开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备 1.1 必要组件安装 # 安装核心库 pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明: - requests&#x…...

Blender常用快捷键的汇总

一、基础操作 全选/取消全选:A(全选)、AA(连续按两次A取消全选)复制物体:Shift D(复制后需点击确认位置)移动物体:G(按X/Y/Z可约束轴向移动)旋转…...

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件,找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…...

Unity 文字高度自适应

期望 文字有字号限制,输入文字文字后先判断高度是否适用于限制字号,若处于最小字号时高度任不适用,则调整RectTransform 的高度。 核心代码 每次输入文字时先将字号设定为原始字号。 comp.fontSize fontSize; comp.text content; 拓展T…...

Teaching Small Language Models Reasoning throughCounterfactual Distillation

2024.emnlp-main.333.pdfhttps://aclanthology.org/2024.emnlp-main.333.pdf 1.概述 大型语言模型(LLM),如GPT-3,在各种下游任务中表现出色,包括通过链式思维(CoT)进行问题解答。CoT鼓励模型在解决问题时生成中间推理步骤。尽管LLM取得了成功,但由于模型大小的限制,其…...

快速开始React开发(一)

快速开始React开发(一) React是一个JavaScript库,用于构建交互式网站,并且能够快捷创建SPA(Single Page App),其组件化的思想也是被一再传播,无论是普通的Web网站还是嵌入移动端交互…...

2025最新Transformer模型及深度学习前沿技术应用

第一章、注意力(Attention)机制 1、注意力机制的背景和动机(为什么需要注意力机制?注意力机制的起源和发展里程碑)。 2、注意力机制的基本原理(什么是注意力机制?注意力机制的数学表达与基本公…...

极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6

本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...

[环境搭建篇] Windows 环境下如何安装Docker工具

Windows 环境下如何安装Docker工具 1. 检查系统要求2. 启用WSL 2和虚拟化步骤一:启用WSL步骤二:启用虚拟化(Hyper-V)步骤三:安装WSL 2内核 3. 安装Docker Desktop4. 配置Docker5. 家庭版用户替代方案6. 常见问题解决问…...

JavaScript 数组和字符串方法详解

一、数组方法 数组方法是操作数组的核心工具,分为修改原数组和返回新数组两类。 1. 常用修改原数组的方法 方法参数返回值说明示例push...items新长度末尾添加元素arr.push(4) → [1,2,3,4]pop无删除的元素删除最后一个元素arr.pop() → 3(原数组变[1,…...

达梦数据库系列之Mysql项目迁移为达梦项目

达梦数据库系列之Mysql项目迁移为达梦项目 1 达梦数据库安装及MySql数据迁移2 SpringBoot项目迁移2.1 驱动包引入2.2 驱动类配置2.3 数据源配置2.4 flowable迁移2.4.1 异常问题2.4.2 解决 3 迁移常见问题3.1 不是 GROUP BY 表达式3.1.1 dm.ini 开启Mysql兼容模式3.1.2 修改动态…...

10个实用IntelliJ IDEA插件

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是为提升开发效率推荐的10个实用IntelliJ IDEA插件,涵盖代码质量、效率工具及热门框架支持: 一、代码质量与规范 SonarLint 实时…...

10分钟从零开始搭建机器人管理系统(飞算AI)

1. 安装插件 https://www.feisuanyz.com/ 2. Intellij IDEA中运行 创建一个BS架构的机器人远程操控系统,具备机器人状态及位置实时更新,可以实现机器人远程遥控,可以对机器人工作日志进行统计分析,以及其它管理系统的常用功能3…...

[自动驾驶-传感器融合] 多激光雷达的外参标定

文章目录 引言外参标定原理ICP匹配示例参考文献 引言 多激光雷达系统通常用于自动驾驶或机器人,每个雷达的位置和姿态不同,需要将它们的数据统一到同一个坐标系下。多激光雷达外参标定的核心目标是通过计算不同雷达坐标系之间的刚性变换关系&#xff08…...

怎么让呼叫中心支持高并发

基于FreeSWITCH的呼叫中心系统并发性能优化指南 在呼叫中心系统建设中,高并发处理能力是衡量系统稳定性和效率的核心指标。作为开源软交换平台的代表,FreeSWITCH凭借其线程模型和模块化架构,天然适合高并发场景。然而,实际应用中仍…...

Elasticsearch简单学习

1、依赖的导入 <!--ES依赖--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客户端链接 RestHighLevelClient client new RestHigh…...

就像BGP中的AS_PATH一样,无论路途多远,我愿意陪你一起走——基于华为ENSP的BGP的路由负载均衡及过滤深入浅出

本篇技术博文摘要 &#x1f31f; 本文内容涵盖了BGP负载均衡的基本概念、配置技巧和在实际网络中的应用&#xff0c;包括如何在华为ENSP上实现负载均衡和路由过滤。通过配置BGP的前缀列表、ACL以及路由过滤策略&#xff0c;可以实现网络流量的精确控制和优化&#xff0c;提高网…...

valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug

valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序&#xff0c;可以设定仅在某些函数中开启 valgrind 的检测&#xff1a; Valgrind 提供了一些客户请求&#xff08;client requests&#xff09;&#xff0c;可以在代码中插入特定的宏来控制 Valgrind 的行为。…...

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…...

异步操作返回原始上下文

是什么&#xff1f; 在讨论同步上下文执行回调的概念时&#xff0c;我们首先需要了解一些基本概念&#xff1a;同步与异步操作、上下文以及回调函数。 同步与异步操作&#xff1a; 同步操作是指代码按照顺序依次执行&#xff0c;每个操作必须等待前一个操作完成才能开始。这便…...

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石&#xff0c;它像区块链世界的身份证和防伪标签&#xff0c;确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言&#xff0c;带你彻底搞懂区块链中的数字签名&#xff01; 文章目录 1. 数字签名是什么&#xff1f;从现实世界到区块…...

vulnhub渗透日记23:bulldog

声明 文中涉及操作均来自靶机虚拟环境&#xff0c;禁止用于真实环境&#xff0c;任何未经授权的渗透测试都是违法行为&#xff01; 开搞 首先nmap扫描目标机开放端口和服务 访问80端口 扫目录撒 发现登录口 点击web-shell提示登录后才能使用 /dev/下面查看网页源码发现村咋h…...

macOS - 使用 tmux

文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面&#xff0c;然后 输入 Control Option B 进入交互模式 输入 % 左右分栏&#xff0c;" 上下分割 上一个窗格&#xff1a;{&#xff0c;下一个&#xff1a;} PS…...

Armbian: 轻量级 ARM 设备专用 Linux 发行版全面解析

引言 在嵌入式开发和物联网&#xff08;IoT&#xff09;领域&#xff0c;选择合适的操作系统至关重要。对于 Raspberry Pi、Orange Pi、Banana Pi 以及 Rockchip、Amlogic、Allwinner 等 ARM 平台上的单板计算机&#xff08;SBC&#xff09;&#xff0c;一个高效、轻量级并且易…...

微服务通信:用gRPC + Protobuf 构建高效API

引言 在微服务架构中&#xff0c;服务之间的通信是系统设计的核心问题之一。传统的RESTful API虽然简单易用&#xff0c;但在性能、类型安全和代码生成等方面存在一定的局限性。gRPC作为一种高性能、跨语言的RPC框架&#xff0c;结合Protobuf&#xff08;Protocol Buffers&…...

Spring Boot 整合 JMS-ActiveMQ,并安装 ActiveMQ

1. 安装 ActiveMQ 1.1 下载 ActiveMQ 访问 ActiveMQ 官方下载页面&#xff0c;根据你的操作系统选择合适的版本进行下载。这里以 Linux 系统&#xff0c;Java环境1.8版本为例&#xff0c;下载 apache-activemq-5.16.7-bin.tar.gz。 1.2 解压文件 将下载的压缩包解压到指定目…...

容器 /dev/shm 泄漏学习

容器 /dev/shm 泄漏的介绍 在容器环境中&#xff0c;/dev/shm 是一个基于 tmpfs 的共享内存文件系统&#xff0c;通常用于进程间通信&#xff08;IPC&#xff09;和临时数据存储。由于其内存特性&#xff0c;/dev/shm 的大小是有限的&#xff0c;默认情况下 Docker 容器的 /de…...

Spring Boot 3.x 基于 Redis 实现邮箱验证码认证

文章目录 依赖配置开启 QQ 邮箱 SMTP 服务配置文件代码实现验证码服务邮件服务接口实现执行流程 依赖配置 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr…...