Opencv之图像梯度处理和绘制图像轮廓
一、梯度处理的sobel算子函数

Sobel 算子是一种常用的图像边缘检测方法,结合了一阶导数和高斯平滑,用于检测图像的梯度信息。
1、功能
Sobel 算子用于计算图像在 x 和 y 方向的梯度,主要功能包括:
- 强调图像中灰度值的变化部分,用于检测边缘。
- 计算水平和垂直方向的梯度值。
- 提供平滑效果以减少噪声干扰(相比于简单差分方法)。
2、参数
在 OpenCV 中,cv2.Sobel() 是实现 Sobel 算子的主要函数。其常用参数包括:
参数名 | 说明 |
---|---|
src | 输入图像,它应该是灰度图像。 |
ddepth | 输出图像的所需深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用如 cv2.CV_64F 等来指定特定的深度。由于梯度计算可能产生负值,因此建议使用能够包含负数的数据类型。 |
dx | x 方向上的导数阶数。如果你想要计算 x 方向上的梯度,设置这个参数为 1;如果你不关心 x 方向上的梯度,设置这个参数为 0。 |
dy | y 方向上的导数阶数。如果你想要计算 y 方向上的梯度,设置这个参数为 1;如果你不关心 y 方向上的梯度,设置这个参数为 0。通常,你不会同时设置 dx 和 dy 都为 0。 |
ksize | Sobel 核的大小。它必须是 1、3、5、7 或 9 之一。这个参数决定了用于计算梯度的滤波器的大小。大小为 1 时表示使用最小的滤波器,但通常你会使用更大的滤波器来平滑梯度计算。 |
scale | 可选参数,表示计算梯度时的缩放因子。默认值为 1,表示不进行缩放。你可以通过调整这个参数来放大或缩小梯度的结果。 |
delta | 可选参数,表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0,表示不添加增量。 |
borderType | 像素外推方法,例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。 |
3、返回值
- 返回一个与输入图像尺寸相同的单通道图像。
- 结果图像的每个像素值代表该点的梯度值。
4、应用
Sobel 算子广泛用于以下应用场景:
①边缘检测:
用于检测图像中显著的灰度值变化,通常是物体的边缘。
②图像增强:
提取图像的边缘特征以增强感兴趣的区域。
③特征提取:
在计算机视觉任务中,用作边缘特征检测的一步,例如人脸检测、车道线检测等。
④梯度方向计算:
与梯度幅值一起,用于方向敏感的应用,如方向滤波。
5、代码示例
import cv2# 读取一张图
img = cv2.imread("./shudu.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 使用sobel算子
# 水平梯度
img_sobel = cv2.Sobel(img, -1, 0, 1, ksize=3)
# 垂直梯度
img_sobel_2 = cv2.Sobel(img, -1, 1, 0, ksize=3)cv2.imshow('image', img)
cv2.imshow('img_sobel', img_sobel)
cv2.imshow('img_sobel_2', img_sobel_2)cv2.waitKey(0)

二、梯度处理Laplacian算子函数
Laplacian 算子是图像处理中的一种二阶导数算子,用于检测图像的边缘。它通过计算图像像素值的二阶导数(即亮度变化率)来突出边缘信息。
1、功能
①边缘检测:
通过计算图像的二阶导数,检测图像中灰度变化较大的区域。
②增强图像细节:
可以提取图像的边缘特征,用于后续处理。
③方向无关:
不同于 Sobel 算子,Laplacian 算子对方向不敏感,计算的是梯度的二阶导数。
2、参数
在 OpenCV 中,cv2.Laplacian() 函数实现了 Laplacian 算子的功能,常用参数包括:
参数名 | 说明 |
---|---|
src | 输入图像,它应该是灰度图像。 |
ddepth | 输出图像的所需深度。这个参数决定了输出图像的深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用 cv2.CV_64F 等来指定特定的深度。由于拉普拉斯算子可能产生负值,因此通常建议使用能够包含负数的数据类型,如 cv2.CV_64F。 |
ksize | 算子的大小。它必须是 1、3、5 或 7 之一。这个参数决定了用于计算拉普拉斯算子的滤波器的大小。大小为 1 时表示使用 4 邻域拉普拉斯算子,其他大小则使用更大的滤波器。 |
scale | 可选参数,表示计算拉普拉斯算子时的缩放因子。默认值为 1,表示不进行缩放。你可以通过调整这个参数来放大或缩小拉普拉斯算子的结果。 |
delta | 可选参数,表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0,表示不添加增量。 |
borderType | 像素外推方法,例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。当 ksize 大于 1 时,这个参数才有意义。 |
3、返回值
- 返回一个单通道的梯度图像。
- 每个像素值表示该点的梯度变化强度(即边缘强度)。
4、应用
①边缘检测:
检测图像中显著的灰度变化区域,用于突出边缘。
②特征提取:
在计算机视觉任务中,用于提取边缘作为特征输入,例如物体检测、图像配准等。
③图像增强:
提高图像的细节部分,增强局部特征。
④前处理步骤:
常作为更复杂图像处理(如 Hough 变换)的前置步骤。
5、代码示例
import cv2# 读取一张图
img = cv2.imread("./shudu.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 使用拉普拉斯算子
img_lap = cv2.Laplacian(img, -1, ksize=3)cv2.imshow('image', img)
cv2.imshow('img_lap', img_lap)cv2.waitKey(0)

三、Canny算子函数

Canny 算子是一种多阶段的图像边缘检测算法,通过计算梯度并结合非极大值抑制和双阈值处理,精准地提取图像中的边缘。
1、功能
①边缘检测:
检测图像中灰度值变化最显著的区域,提取清晰的边缘。
②降噪和增强对比:
使用高斯滤波去噪并结合梯度计算增强边缘对比。
③多阶段边缘检测:
包括梯度计算、非极大值抑制、双阈值处理、边缘跟踪等,能准确且高效地提取边缘。
2、参数
在 OpenCV 中,cv2.Canny() 是实现 Canny 算子的函数,常用参数如下:
3、返回值
- 返回一个与输入图像尺寸相同的二值图像(边缘图像)。
- 像素值为 0(非边缘)或 255(边缘)。
4、应用
Canny 算子因其高精度和多功能性,被广泛应用于以下场景:
①物体边缘检测:
用于检测图像中物体的边界,适用于形状识别、分割等任务。
②特征提取:
用于提取边缘特征作为后续算法的输入,例如 Hough 变换、角点检测等。
③图像增强:
突出图像中的边缘部分,提高关键特征的显著性。
④医学图像处理:
用于精确检测器官或病灶的边缘。
5、代码示例
import cv2img = cv2.imread("./card.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 寻找轮廓
contours, hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST, # 查询轮廓的方式cv2.CHAIN_APPROX_SIMPLE # 保存轮廓点坐标的方式)# 绘制轮廓
img_copy = img.copy()
img_draw = cv2.drawContours(img_copy, # 要绘制轮廓的图像contours, # 轮廓的顶点坐标集 列表-1, # 轮廓列表的索引值,-1表示绘制所有轮廓(0, 0, 255), # 颜色3 # 轮廓线条粗细)cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)

四、findContours函数
cv2.findContours 是 OpenCV 中用于提取图像轮廓的函数。它在图像分割和分析中非常常用,例如边界检测、形状分析等。
1、功能
①轮廓检测:
在二值化图像中提取轮廓信息。
②轮廓表示:
提取轮廓的点集,可用于计算形状特征(面积、周长等)。
③图像分割:
根据轮廓信息将图像划分为不同的区域。
2、参数
在 OpenCV 中,cv2.findContours() 是用于提取图像轮廓的函数,常用参数如下:
参数名 | 类型 | 说明 |
---|---|---|
image | 单通道图像 | 必选参数,输入图像,通常是一个二值图像(即只包含黑白两种颜色的图像),其中白色部分代表要检测的对象,黑色部分代表背景。也可以是非二值图像,但通常需要先进行某种形式的预处理,如阈值分割或边缘检测。 |
mode | 轮廓检索模式 | 可选参数(某些版本中必需),决定轮廓的层次结构和检索方式。 |
method | 轮廓逼近方法 | 可选参数(某些版本中必需),决定轮廓点集的存储方式(完整存储或压缩)。 |
offset | 轮廓点的偏移量 | 可选参数,默认值为 (0, 0),轮廓点的偏移量。这个参数允许你在原始图像坐标系的基础上对轮廓点进行平移。 |
其中:
①常用的 mode 参数:
- cv2.RETR_EXTERNAL:只检索最外层轮廓。
- cv2.RETR_LIST:检索所有轮廓,但不创建任何父子关系。
- cv2.RETR_CCOMP:检索所有轮廓,并将它们组织为两层结构,其中顶层是连通域的外边界,底层是孔的内边界。
- cv2.RETR_TREE:检索所有轮廓,并重建完整的层次结构。
②常用的 method 参数:
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,不进行任何近似。
- cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留它们的终点。
- cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链式近似算法的一种变体。
3、返回值
①contours(某些版本):
这个参数是用来存储检测到的轮廓的。它是一个 Python 列表,其中每个元素都是一个轮廓,轮廓是由点组成的 NumPy 数组。
②hierarchy(某些版本):
轮廓的层次结构信息。这是一个 NumPy 数组,包含了关于轮廓之间关系的信息(例如,哪个轮廓是另一个轮廓的父轮廓或子轮廓)。
4、应用
①形状分析:
提取轮廓用于计算面积、周长、矩形包围框等。
常用于图像中的目标检测和物体分类。
②边界检测:
确定图像中各个目标的边界,用于绘制轮廓或进行边界处理。
③图像分割:
根据轮廓信息分割图像,提取感兴趣的区域。
④嵌套关系分析:
使用 hierarchy 信息分析轮廓的父子关系,用于目标的层次分类。
5、代码示例
import cv2img = cv2.imread("./card.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 寻找轮廓
contours, hierarchy = cv2.findContours(img_binary,cv2.RETR_LIST, # 查询轮廓的方式cv2.CHAIN_APPROX_SIMPLE # 保存轮廓点坐标的方式)img_copy = img.copy()
img_draw = cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 3)cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)

五、drawContours函数
OpenCV 的 cv2.drawContours 函数用于在图像上绘制轮廓,常与 cv2.findContours 搭配使用。它可以绘制单个或多个轮廓,还能对层次结构进行可视化。
1、功能
①轮廓绘制:
在图像上绘制由 findContours 提取的轮廓。
②层次关系可视化:
根据轮廓的层次关系选择性地绘制轮廓。
③调试和展示:
在处理图像分割、边缘检测、物体检测等任务时,用于可视化轮廓信息。
2、参数
参数名 | 类型 | 说明 |
---|---|---|
contourIdx(可选,默认为 -1) | int | 指定要绘制的轮廓的索引。如果为 -1,则绘制所有轮廓。否则,只绘制指定索引处的轮廓。 |
thickness(可选,默认为 1) | int | 轮廓的厚度。如果为正数,则轮廓将被绘制为指定厚度的线条。如果为负数(例如 -1),则轮廓内部将被填充。 |
lineType(可选,默认为 cv2.LINE_8) | int | 线条的类型。它决定了轮廓线条的平滑度。cv2.LINE_8 表示 8-连通线,cv2.LINE_4 表示 4-连通线,cv2.LINE_AA 表示抗锯齿线。 |
maxLevel(可选,默认为 INT_MAX) | int | 用于控制绘制轮廓的层次深度。当 contourIdx 参数为 -1 时,这个参数才有效。它决定了要绘制的轮廓的最大层次深度。 |
contours(必选) | list | 这是一个 Python 列表,包含要绘制的所有轮廓。每个轮廓都是一个点集,通常是由 cv2.findContours() 函数返回的 NumPy 数组。 |
image(必选) | ndarray | 这是要在其上绘制轮廓的输入图像。它应该是一个三通道图像(例如,彩色图像)或单通道图像(例如,灰度图像),但通常是三通道图像,以便可以使用不同的颜色来绘制轮廓。 |
hierarchy(可选,默认为 None) | ndarray | 轮廓的层次结构信息。这是一个 NumPy 数组,通常由 cv2.findContours() 函数返回。它包含了关于轮廓之间关系的信息,例如哪个轮廓是另一个轮廓的父轮廓或子轮廓。在绘制所有轮廓时,这个参数通常不需要。 |
color(可选,默认为 (0, 255, 0)) | tuple | 轮廓的颜色。它是一个三元组,表示 BGR(蓝、绿、红)颜色空间中的颜色。例如,(0, 255, 0) 表示绿色。 |
offset(可选,默认为 (0, 0)) | tuple | 轮廓点的偏移量。这个参数允许你在原始图像坐标系的基础上对轮廓点进行平移。 |
3、返回值
- 无返回值。
- 函数直接在输入图像上绘制轮廓。
4、应用
①轮廓可视化:
在图像处理任务中,显示 findContours 提取的轮廓信息,用于调试和验证算法效果。
②形状分割:
将图像中提取的目标边界可视化,辅助物体分割和分析。
③层次关系分析:
绘制父轮廓、子轮廓等层次结构,用于嵌套目标的可视化。
④目标检测:
在图像上标记物体边界,显示检测结果。
5、代码示例
import cv2
import numpy as np# 读取图像并调整大小
img = cv2.imread("./02.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 寻找轮廓
contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
img_copy = img.copy()
img_draw = cv2.drawContours(img_copy, # 要绘制轮廓的图像contours, # 轮廓的顶点坐标集 列表-1, # 轮廓列表的索引值,-1表示绘制所有轮廓(0, 0, 255), # 颜色3 # 轮廓线条粗细)cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)

六、透视变换函数
透视变换是 OpenCV 提供的一种几何变换,用于将图像从一种视角转换为另一种视角。OpenCV 提供了 cv2.getPerspectiveTransform 和 cv2.warpPerspective 两个函数来实现透视变换。
1、功能
①cv2.getPerspectiveTransform:
根据图像的原始四个点坐标(源点)和目标四个点坐标(目标点),计算透视变换矩阵。
②cv2.warpPerspective:
根据透视变换矩阵,对图像进行透视变换,生成新的视角图像。
透视变换通常用于以下场景:
- 将倾斜或变形的图像矫正为平面视角。
- 提取图像中的特定区域(如卡片、文档、白板等)。
- 改变图像的视角以匹配某些特定需求。
2、参数
①cv2.getPerspectiveTransform 的参数
②cv2.warpPerspective 的参数
3、返回值
①cv2.getPerspectiveTransform
返回 3×3 的透视变换矩阵。
②cv2.warpPerspective
返回透视变换后的图像。
4、应用
①图像矫正:
将倾斜的图像矫正为标准平面视角,例如卡片、书本、文档等。
②ROI 提取:
精确提取图像中的特定区域,适用于目标检测或图像分割任务。
③视角匹配:
在 AR 和 3D 应用中,调整图像的视角以匹配其他图像或虚拟场景。
④增强现实:
将二维图像贴合到三维场景中,通过透视变换实现仿真效果。
5、代码示例
import cv2
import numpy as np# 1、 读取图像并调整大小
img = cv2.imread("./card.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 2、 获取透视变换矩阵
# 原图中的四个点
points1 = np.array([[100, 50], [350, 75], [70, 200], [325, 230]],dtype=np.float32)
# 目标图中的四个点
points2 = np.array([[0, 0], [img.shape[1], 0], [0, img.shape[0]], [img.shape[1], img.shape[0]]],dtype=np.float32)
M = cv2.getPerspectiveTransform(points1, points2)# 3、透视变换
img_warp = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))cv2.imshow('image', img)
cv2.imshow('image_warp', img_warp)
cv2.waitKey(0)

七、举例轮廓的外接边界框,并对比说明
在 OpenCV 中,可以通过 cv2.boundingRect 和 cv2.minAreaRect 方法为轮廓生成外接边界框。两者的功能和应用有所不同:
1. 外接边界框方法
①cv2.boundingRect:
生成一个与轮廓外接的水平矩形。
- 边界框的边与坐标轴平行。
- 简单快速,但不能适应旋转的物体。
②cv2.minAreaRect:
生成一个最小面积的旋转矩形。
- 边界框可以适应物体的方向,能紧贴目标轮廓。
- 返回矩形的中心点、宽高和旋转角度。
2. 区别对比
功能 | 水平外接矩形 (cv2.boundingRect) | 最小面积旋转矩形 (cv2.minAreaRect) |
---|---|---|
特点 | 水平矩形,边平行于坐标轴 | 最小面积矩形,可旋转以适应物体方向 |
适用场景 | 简单场景或对方向无关的分析 | 复杂场景,需要考虑方向的分析 |
效率 | 更高 | 相对较低 |
返回值 | 矩形的左上角坐标和宽高 | 矩形中心点坐标、宽高和旋转角度 |
3. 示例代码
以下代码展示如何提取和绘制水平外接矩形和最小面积旋转矩形,并对比效果。
import cv2
import numpy as np# 读取图像并调整大小
img = cv2.imread("./outline.png")
img = cv2.resize(img, (img.shape[1] // 2, img.shape[0] // 2))# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)
# 二值化
_, img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 寻找轮廓
contours, _ = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 定义轮廓
img_draw = img.copy()# 给所有轮廓都绘制 外接
for i in contours:# 第一种:调用外接矩形函数,获取当前轮廓点的左上角的坐标(x, y) 宽w 高hx, y, w, h = cv2.boundingRect(i)# 画矩形cv2.rectangle(img_draw, [x, y], [x+w, y+h], (0, 255, 0), 2)# 第二种:调用最小面积外接矩形函数,获取包含三个元素的元组(中心点坐标、长宽、旋转角度)# ((center_x, center_y), (width, height), angle)ret = cv2.minAreaRect(i)# 调用cv2.boxPoints(ret)可以获取旋转矩阵的四个顶点box = np.int32(cv2.boxPoints(ret))# 绘制轮廓cv2.drawContours(img_draw, [box], -1, (255, 255, 0), 3)cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)

4. 输出分析
①Bounding Rectangles(水平外接矩形):
每个目标轮廓都被一个绿色矩形框住。
边界框总是与坐标轴平行,不能很好地适应旋转的目标。
②Min Area Rectangles(最小面积旋转矩形):
每个目标轮廓都被一个蓝色矩形框住。
边界框根据目标的方向自动旋转,紧贴目标,适合复杂场景。
5. 使用建议
①cv2.boundingRect:
简单场景,目标方向较一致时使用,例如:
- 检测物体大小。
- 计算水平分布特征。
优势:计算快,简单易用。
②cv2.minAreaRect:
目标方向不一致或需要精确边界时使用,例如:
- 目标形状分析。
- 计算旋转目标的特征。
优势:灵活精确,可适应旋转物体。
相关文章:
Opencv之图像梯度处理和绘制图像轮廓
一、梯度处理的sobel算子函数 处理示意 Sobel 算子是一种常用的图像边缘检测方法,结合了一阶导数和高斯平滑,用于检测图像的梯度信息。 1、功能 Sobel 算子用于计算图像在 x 和 y 方向的梯度,主要功能包括: 强调图像中灰度值的…...
5.2章节python字符串的格式化三种方式
在Python中,格式化字符串是编程中常见的任务,它用于将变量或表达式的值嵌入到字符串中。以下是三种常见的格式化字符串的方式: 1.百分号(%)格式化: 这是Python早期版本中常用的字符串格式化方法。通过在字…...
.NET Core 各版本特点、差异及适用场景详解
随着 .NET Core 的不断发展,微软推出了一系列版本来满足不同场景下的开发需求。这些版本随着时间的推移逐渐演变为统一的 .NET 平台(从 .NET 5 开始)。本文将详细说明每个版本的特点、差异以及适用场景,帮助开发者更好地选择和使用…...
2024.12.14 TCP/IP 网络模型有哪几层?
2024.12.14 TCP/IP 网络模型有哪几层? 2024.12.14 今天周六 看到大伙都在考六级,我来复盘小林coding的计算机网络的知识点: TCP/IP 网络模型有哪几层? 问大家,为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信,有…...
基于SpringBoot的嗨玩旅游网站:一站式旅游信息服务平台的设计与实现
摘要 在旅游需求日益增长的今天,一个全面、便捷的旅游信息服务平台显得尤为重要。嗨玩旅游网站正是为了满足这一需求而设计的在线平台,它提供了包括景点信息、旅游线路、商品信息、社区信息和活动推广等在内的丰富旅游目的地信息,旨在帮助用…...
HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构
HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构 效果图DRAWTEXTREL示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont DRAWTEXTABS示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont 效果图 …...
VMware ESXi上创建Ubuntu虚拟机并实现远程SSH访问全攻略
文章目录 前言1. 在VMware ESXI中创建Ubuntu虚拟机2. Ubuntu开启SSH远程服务3. 安装Cpolar工具4. 使用SSH客户端远程访问Ubuntu5. 固定TCP公网地址 前言 本文主要介绍如何在VMware ESXi上创建一台Ubuntu 22.04虚拟机,并通过Cpolar内网穿透工具配置公网地址…...
进制的转换
前言 进制是一种进位计数制,是人为定义的带进位的计数方法。不同的进制使用不同数量的符号,以及不同的规则来组合这些符号以表示不同的数值。 一、进制类型 二进制:由一串0和1组成的数字,逢二进一 八进制:0 1 2 3 4 5 6 7,…...
迁移学习中模型训练加速(以mllm模型为例),提速15%以上
根据模型训练过程的显存占用实测的分析,一个1g参数的模型(存储占用4g)训练大约需要20g的显存,其中梯度值占用的显存约一半。博主本意是想实现在迁移学习(冻结部分参数)中模型显存占用的降低,结果不太满意,只能实现训练速度提升,但无法实现显存占用优化。预计是在现有的…...
CSS系列(6)-- 排版与文本详解
前端技术探索系列:CSS 排版与文本详解 📝 致读者:探索优雅的文字艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 排版与文本处理,学习如何创建既美观又易读的文本内容。 文本基础属性 🚀 字…...
嵌入式现状、机遇、挑战与展望
在当今数字化浪潮中,嵌入式系统宛如一颗璀璨的明珠,熠熠生辉,深刻地渗透到了我们生活的方方面面,成为推动现代科技进步不可或缺的关键力量。从智能家居的便捷控制,到工业生产的精准运作,再到汽车的智能驾驶…...
关于Postgresql旧版本安装
抛出问题 局点项目现场,要求对如下三类资产做安全加固,需要在公司侧搭建测试验证环境,故有此篇。 bclinux 8.2 tomcat-8.5.59 postgrel -11 随着PG迭代,老旧版本仅提供有限维护。如果想安装老版本可能就要费劲儿一些。现在&…...
【AI日记】24.12.14 kaggle 比赛 2-4 EDA
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset内容:构建自己的EDA(探索性数据分析)框架时间:5 小时感想:大规模数据集&a…...
《深入浅出HTTPS》读书笔记(18):公开密钥算法RSA(续)
【RSA算法安全性】 幂运算的逆过程就是求对数问题,而模运算可以认为是离散问题,组合起来RSA算法就是离散对数模型,只要密钥长度足够长,离散对数很难破解。 破解私钥有两个方法: ◎公钥持有人有e和n,而要计…...
LabVIEW面向对象编程有什么特点?
LabVIEW面向对象编程(OOP)的特点主要体现在它如何结合传统面向对象编程(OOP)的理念与LabVIEW的图形化编程模式,提供灵活的抽象和模块化的功能。以下是LabVIEW面向对象编程的几个主要特点: 1. 类&#x…...
【Hive数据仓库】Hive部署、Hive数据库操作(增删改查)、表操作(内部表、外部表、分区表、桶表)
目录 一、本地模式 1、安装MySQL 2、登录MySQL 3、修改密码 4、安装Hive 5、配置Hive系统环境变量 6、初始化Derby数据库 7、连接Hive用于测试 8、测试Hive 9、修改Hive配置文件 10、上传MySQL驱动包 11、初始化MySQL 12、连接Hive用于启动服务 二、远程模式 1、…...
bugku-simple MQTT-wp解析
1.下载题目打开题目,是一个流量包,题目说是MQTT,然后打开流量之后的流量都是MQTT,我们来搜一下MQTT是什么流量 MQTT流量: 是一种基于发布订阅模式的轻量级的通讯协议,并且该协议构建于TCP/IP协议之上&…...
【第四节】Git 分支管理
目录 前言 一、Git 分支简介 二、 分支的基本操作 2.1 创建分支 2.2 切换分支 2.3 列出分支 三、 分支的合并与删除 3.1 合并分支 3.2 删除分支 四、处理合并冲突 五、 总结 前言 Git 的分支管理是其核心功能之一,允许开发者在不影响主线开发的情况下进行…...
IDEA 修改格式化仅格式化本次改动代码
最近总是发现格式化的时候会格式化文件所有代码,提交Git 后再看提交日志,就很不清晰。修改方式如下 中文: 格式化代码快捷键[中文配置]: 英文: 格式化代码快捷键[英文配置]:...
UOB大华银行|校招网申综合能力SHL测评题库英语版本真题分析
大华银行有限公司(大华银行)是亚洲银行业的翘楚,大华银行总部位于新加坡,并在中国、印度尼西亚、马来西亚、泰国及越南设立了全资法人银行,在全球拥有约500 间分行及办事处,分布在亚太、欧洲与北美的19 个国…...
Redis应用—2.在列表数据里的应用
大纲 1.基于数据库 缓存双写的分享贴功能 2.查询分享贴列表缓存时的延迟构建 3.分页列表惰性缓存方案如何节约内存 4.用户分享贴列表数据按页缓存实现精准过期控制 5.用户分享贴列表的分页缓存的异步更新 6.数据库与缓存的分页数据一致性方案 7.热门用户分享贴列表的分…...
【Linux基础】基本开发工具的使用
目录 一、编译器——gcc/g的使用 gcc/g的安装 gcc的安装: g的安装: gcc/g的基本使用 gcc的使用 g的使用 动态链接与静态链接 程序的翻译过程 1. 一个C/C程序的构建过程,程序从源代码到可执行文件必须经历四个阶段 2. 理解选项的含…...
C++ 中面向对象编程如何实现动态绑定?
在 C 中,面向对象编程的一个重要特性就是动态绑定。动态绑定允许在程序运行时根据对象的实际类型来决定调用哪个函数,这为程序的灵活性和可扩展性提供了强大的支持。本文将详细介绍 C 中面向对象编程如何实现动态绑定。 一、静态绑定与动态绑定的概念 静…...
电源芯片的SYNC引脚
-----本文简介----- 主要内容包括: ① 电源芯片的SYNC引脚 ----- 正文 ----- 先赞↓后看,养成习惯! 1. SYNC引脚是什么? 电源芯片里面的SYNC引脚是 Synchronization clock in,意思是同步时钟输入。 2. SYNC引脚的作用…...
安卓报错Switch Maven repository ‘maven‘....解决办法
例如:Switch Maven repository ‘maven(http://developer.huawei.com/repo/)’ to redirect to a secure protocol 在库链接上方添加配置代码:allowInsecureProtocol true...
935. 骑士拨号器
935. 骑士拨号器 题目链接:935. 骑士拨号器 代码如下: class Solution { public:int knightDialer(int n) {if (n 1){return 10;}long long res 0;for (int j 0; j < 10; j){res dfs(n - 1, j);}return res % MOD;}int dfs(int i, int j){if (…...
linux下的posix信号量
目录 引言 信号量背景知识 PV操作 信号量接口 基于环形队列的PC模型 代码实现 demo模型 具体实现 引言 在多线程编程领域,同步机制是确保数据一致性和避免竞态条件的关键技术。Linux操作系统作为开源软件的杰出代表,提供了多种同步原语…...
【JavaWeb后端学习笔记】Spring框架下的Bean管理
Bean 1、Bean的获取2、Bean的作用域3、第三方Bean 1、Bean的获取 默认情况下,Spring项目启动时,会把Bean创建好交给IOC容器管理。当需要使用时,通过Autowired注解注入或者通过构造方法注入即可。 除此之外还可以通过Spring提供的Applicatio…...
如何在 ASP.NET Core 3.1 应用程序中使用 Log4Net
介绍 日志记录是应用程序的核心。它对于调试和故障排除以及应用程序的流畅性非常重要。 借助日志记录,我们可以对本地系统进行端到端的可视性,而对于基于云的系统,我们只能提供一小部分可视性。您可以将日志写入磁盘或数据库中的文件…...
Photoshop提示错误弹窗dll缺失是什么原因?要怎么解决?
Photoshop提示错误弹窗“DLL缺失”:原因分析与解决方案 在创意设计与图像处理领域,Photoshop无疑是众多专业人士和爱好者的首选工具。然而,在使用Photoshop的过程中,有时会遇到一些令人头疼的问题,比如突然弹出的错误…...
mall-admin-web开源项目搭建教程(图文)
本章教程,介绍如何在本地部署运行mall-admin-web这个开源项目。 开源地址:https://gitee.com/macrozheng/mall-admin-web mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计…...
nginx做为文件服务器
docker-compose 创建nginx version: 3services:nginx-web:image: nginx:1.23.4container_name: nginx-webenvironment:# 时区上海TZ: Asia/Shanghaiports:- "88:80"- "443:443"volumes:# 证书映射- /home/dockerdata/nginx/cert:/etc/nginx/cert# 配置文件…...
加速合并,音频与字幕的探讨
因上一节。合并时速度太慢了。显卡没用上。所以想快一点。1分钟的视频用了5分钟。 在合并视频时,进度条中的 now=None 通常表示当前处理的时间点没有被正确记录或显示。这可能是由于 moviepy 的内部实现细节或配置问题。为了加快视频合并速度并利用 GPU 加速,可以采取以下措…...
(3)spring security - 认识PasswordEncoder
目录 1.简介1.1.简单了解认证流程 2.密码验证3.PasswordEncoder的内置实现4.小结 目标: 简单了解认证的流程简单认识spring security中的Password Encoder 1.简介 还是以这幅图为基础,认识Password Encoder到底是什么? 1.1.简单了解认证流程…...
React 入门:JSX语法详解
简介 React是一个用于构建用户界面的JavaScript库,它引入了JSX语法,使得你可以在JavaScript代码中编写类似HTML的结构。JSX在编译后会被转换成合法的JavaScript对象。 JSX基础 JSX是一种看起来像HTML的JavaScript语法扩展。它并不直接被浏览器执行&am…...
Pandas常见函数
Pandas 是 Python 中用于数据分析和处理的强大工具库。以下是 Pandas 中一些常见的函数和方法,按用途分类总结: 1. 数据创建 pd.Series(data, index):创建一维的序列对象。pd.DataFrame(data, index, columns):创建二维的DataFra…...
【笔试】亚马逊
亚马逊的笔试题目有两道,一共70分钟 1.给一个数组代表每轮损失的血量power,另外一个变量是盾牌armor,可以选择任意一轮使用这个盾牌,可以抵挡min(power[i],armor)的攻击,请问最小血量是多少能够…...
【力扣算法】234.回文链表
快慢指针:一个指针走两步,一个指针走一步,当快指针走到链表末尾时,慢指针走到中间位置。 逆转链表:根据指针位置分成两个表,逆转第二个表。 按序判断就可以,如果是相同就是回文,反之…...
vue3-tp8-Element:对话框实现
效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…...
35、Firefly_rk3399 同步互斥
文章目录 1、简述问题2、原子操作(atomic_ops )指令解析: 3、锁函数说明3.1、自旋锁API例子 3.2、信号量(semaphore)API例子 3.3、互斥量/锁API例子 3.4、信号量和互斥锁的区别 4、锁的内核实现4.1、自旋锁(…...
Docker-Dockerfile、registry
Dockerfile 一、概述 1、commit的局限 很容易制作简单的镜像,但碰到复杂的情况就十分不方便,例如碰到下面的情况: 需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 2、Dockerfile是什么 Dockerfile是一种更强大的镜…...
chattts生成的音频与字幕修改完善,每段字幕对应不同颜色的视频,准备下一步插入视频。
上一节中,实现了先生成一个固定背景的与音频长度一致的视频,然后插入字幕。再合并成一个视频的方法。 但是:这样有点单了,所以: 1.根据字幕的长度先生成视频片断 2.在片段上加上字幕。 3.合并所有片断,…...
8、笔记本品牌分类介绍:LG - 计算机硬件品牌系列文章
LG笔记本品牌以其高性能和先进技术而闻名,提供多种型号以满足不同用户的需求。 LG笔记本产品线包括多种类型,以满足不同用户的需求。其中,LG Gram Pro系列以其超薄设计和高性能配置受到关注。该系列笔记本采用16:10的OLED显示屏&…...
在 Vue 2 中隐藏页面元素的方法
目录 在 Vue 2 中隐藏页面元素的方法 引言 1. 使用 v-if 指令 2. 使用 v-show 指令 3. 使用自定义类名与 v-bind:class 4. 使用内联样式与 v-bind:style 5. 使用组件的 keep-alive 和条件渲染 在 Vue 2 中隐藏页面元素的方法 引言 在开发 Web 应用时,我们经…...
基于springboot+vue的高校校园交友交流平台设计和实现
文章目录 系统功能部分实现截图 前台模块实现管理员模块实现 项目相关文件架构设计 MVC的设计模式基于B/S的架构技术栈 具体功能模块设计系统需求分析 可行性分析 系统测试为什么我? 关于我项目开发案例我自己的网站 源码获取: 系统功能 校园交友平台…...
Redis是什么?Redis和MongoDB的区别在那里?
Redis介绍 Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。以下是关于Redis的详细介绍: 一、数据结构支持 字符串(String) 这是Redis最…...
《开源时间序列数据:探索与应用》
《开源时间序列数据:探索与应用》 一、开源时间序列数据概述二、热门的开源时间序列数据库1. InfluxDB2. TimescaleDB3. Prometheus4. OpenTSDB5. Graphite6. Druid 三、开源时间序列数据的应用场景1. 物联网领域2. 金融领域3. 运维监控领域4. 能源领域 四、开源时间…...
Java后端面试场景题汇总
1.50 亿数据如何去重&排序? 如此大的数据集进行去重(例如50亿数据条目),我们需要考虑内存和存储空间的限制,同时还需要有一个高效的算法。一般来说,这样的数据量无法直接载入内存进行处理,因此需要采用磁盘存储和分布式处理的技术。主要有以下几种思路: 外部排序…...
方法引用和lambda表达式的奥妙
方法引用替代Lambda表达式 什么情况可以使用方法引用替代lambda表达式? 下面代码中两处使用了lambda表达式,一个是filter内,一个是forEach内。其中,forEach内的lambda表达式可以被方法引用替代,但是filter内的lambda…...
AI 智能名片 S2B2C 商城小程序在社群团购运营中的作用与价值
摘要:本文深入探讨了 AI 智能名片 S2B2C 商城小程序在社群团购运营中的重要作用。随着社群团购的兴起,如何有效运营成为关键问题。AI 智能名片 S2B2C 商城小程序凭借其独特功能,能够在促进消费者互动、提升产品传播效果、影响购买决策以及实现…...