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

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)
Sobel算子代码效果

二、梯度处理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)
Laplacian算子代码效果

三、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)
Canny算子函数代码效果

四、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)
findContours函数代码效果

五、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)
drawContours函数代码效果

六、透视变换函数

透视变换是 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 方向的梯度,主要功能包括: 强调图像中灰度值的…...

vue3的watch一次性监听多个值用法

vue3的watch一次性监听多个值 1、监听单个值 watch(() > route.params.keyword, (newValue, oldValue) > {console.log(监听值变化, newVal, oldVal)state.a newValue});2、监听多个值 watch(() > [route.params.id, route.params.keyword], (newValue, oldValue) &g…...

Electron和C/C++开发桌面应用对比

Electron和C/C开发桌面应用对比 1. Electron 的特点 优点 跨平台支持: Electron 基于 Chromium 和 Node.js,可以轻松构建跨平台应用(Windows、macOS、Linux)。开发者只需编写一套代码,即可在多个平台上运行。 使用 …...

Q学习(Q-Learning)详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

【前端】 canvas画图

一、场景描述 利用js中的canvas画图来画图,爱心、动画。 二、问题拆解 第一个是:canvas画图相关知识。 第二个是:动画相关内容。 三、知识背景 3.1 canvas画图相关内容 canvas画图的基本步骤 获取页面上的canvas标签对象获取绘图上下文…...

超标量处理器设计笔记(10) 寄存器重命名过程的恢复、分发

重命名 寄存器重命名过程的恢复使用 Checkpoint 对 RAT 进行恢复使用 WALK 对 RAT 进行恢复使用 Architecture State 对 RAT 进行恢复总结 分发(Dispatch) 寄存器重命名过程的恢复 当发生异常、分支预测失败时,指令占用 RAT、ROB 和 Issue …...

硬件设计-电源轨噪声对时钟抖动的影响

目录 定义 实际案例 总结 定义 首先了解抖动的定义,在ITU-T G.701中有关抖动的定义如下: 数字信号重要瞬间相对于其理想时间位置的短期非累积变化。 抖动是时钟或数据信号时序的短期时域变化。抖动包括信号周期、频率、相位、占空比或其他一些定时特…...

geeCache 一致性hash

目标:解决当自身结点没有改缓存时,从哪个结点获得这个缓存的问题 一、普通的hash算法 hash(Tom)%结点数量 缺点:缓存雪崩 缓存雪崩是指在某一时刻,大量缓存同时失效或宕机,导致大量请求直接访问数据库,从…...

【我的开源】ESCurlGen 一款 ElasticSearch curl 命令生成器

由于经常编写复杂的 Elasticsearch 查询,并通过代码生成查询条件,我发现每次使用 curl 请求 Elasticsearch 时,手动复制配置信息并构建 curl 命令的过程非常繁琐,尤其是在管理多个环境的情况下更为不便。因此,我利用 A…...

Python库NetworkX介绍

NetworkX 是一个用于创建、操作和研究复杂网络结构的 Python 库。它特别适用于图论和网络分析,提供了丰富的图形数据结构和许多常用的算法。无论是学术研究、数据科学还是实际应用,NetworkX 都是分析图网络和复杂关系的强大工具。 1. NetworkX的基本概述…...

Muduo网络库解析--网络模块(2)

前文 重写Muduo库实现核心模块的Git仓库 注:本文将重点剖析 Muduo 网络库的核心框架,深入探讨作者精妙的代码设计思路,并针对核心代码部分进行重写,将原本依赖 boost 的实现替换为原生的 C11 语法。需要说明的是,本文…...

【读书笔记】《论语别裁》语文的变与不变

1.内容摘要 在《论语别裁》第01章“学而”中,作者探讨了语言和文字的变与不变,通过中西文化的对比,分析了文字作为思想表达工具的独立性和持久性。作者指出,虽然外语(如英语和法语)在每三十年有明显变化&a…...

elasticsearch 使用预处理将JSON类型转换成Object类型

文章目录 使用 Ingest Pipeline 和 json 处理器示例:使用Ingest Pipeline 写入数据使用该Pipeline 在Elasticsearch(ES)中,您可以使用“预处理”(通常是通过处理器、Ingest Pipeline等方式)将JSON类型的数据…...

华为HarmonyOS NEXT 原生应用开发: 数据持久化存储(用户首选项)的使用 token令牌存储鉴权!

Preferences 数据持久化存储 用户首选项(Preferences) 1. 封装 仓库工具类 ● 这里可以选择将 数据字段 key 抽取为一个静态方法,这里选择让用户传参,看起来较容易理解! /*** 首选项 preferences - 实现数据持久化…...

每天40分玩转Django:Django视图和URL

Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…...

Kioptirx level4

具体步骤 通过nmap扫描我们所在的网段探测一下存活的主机,发现目标主机开放了80端口可以去访问一下 在访问的同时通过dirb去爆破一下目录,这边发现有一个john的目录不知道是什么可以去 这边在用dirsearch去扫一下防止有漏掉的页面我们没有访问到&#x…...

JPG 转 PDF:免费好用的在线图片转 PDF 工具

JPG 转 PDF:免费好用的在线图片转 PDF 工具 在日常工作和生活中,我们经常需要将图片转换为 PDF 格式。无论是制作电子文档、准备演示材料,还是整理照片集,将图片转换为 PDF 都是一个常见的需求。今天为大家介绍一款完全免费、无需…...

《Django 5 By Example》阅读笔记:p543-p550

《Django 5 By Example》学习第 19 天,p543-p550 总结,总计 8 页。 一、技术总结 1.fixtures (1)定义 A fixture is a collection of files that contain the serialized contents of the database. (2)作用 1)数据导入 一般来说,我们是…...

精品基于Python实现的微信小程序校园导航系统-微信小程序

[含文档PPT源码等] [包运行成功永久免费答疑辅导] 《django微信小程序校园导航系统》该项目采用技术Python的django框架、mysql数据库 ,项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、核心代码介绍视频等 软件开发环境及开发工具&#xf…...

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤:五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园(在线个人知识库)的经历,首先尝试的是网上普遍使用的方法,也就是本篇文章介绍的。 后面会继续…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

日常一水C

多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...