我在Vscode学OpenCV 图像处理三(图像梯度--边缘检测【图像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 边缘检测】)
文章目录
- 一、图像梯度
- 1.1 介绍
- 1.2 涉及函数
- 二、高频强调滤波器
- 2.1 Sobel 算子
- 2.1.1 Sobel 理论基础
- 2.1.2 Sobel 算子及函数使用
- (1)对参数取绝对值
- (2)控制dx,dy方向的求导阶数
- 1. **计算 x 方向边缘(梯度):**
- 2. **计算 y 方向边缘(梯度):**
- 3. **参数 `dx` 和参数 `dy` 的值均为 1**
- 4. **计算 x 方向和 y 方向的边缘叠加:**
- 2.1.3通过实际例子表示
- (1)简单图像
- (2)复杂的,实际的相片
- 2.1.4 近似值
- 2.2 Scharr 算子
- 2.2.1 等价的函数。
- 2.2.2需要满足的条件:dx >= 0 && dy >= 0 && dx+dy = 1
- 2.2.3 Sobel 算子和 Scharr 算子的比较
- 2.3 拉普拉斯 Laplacian 算子
- 2.3.1 函数
- 三、Canny 边缘检测
- 3.1 Canny 原理
- 3.2 Canny 函数及使用
这里需要区分开边缘检测和轮廓检测
边缘检测并非万能,边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。
OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图像内的轮廓信息,而函数cv2.drawContours()能够将轮廓绘制出来。
一、图像梯度
图像梯度是指图像中灰度强度变化的方向和幅度。梯度计算对于许多计算机视觉和图像处理任务非常重要,如边缘检测、特征提取等。
图像梯度通常使用Sobel、Scharr或其他卷积核进行计算。这些卷积核可以在图像上进行卷积操作,以便检测图像中的水平和垂直边缘。梯度的方向表示灰度变化最快的方向,而梯度的幅度表示这个变化的强度。
·
图像梯度是指图像中像素值变化的快慢和方向。在图像处理中,常用于检测图像中的边缘和轮廓。图像梯度的计算可以通过一阶或二阶导数的方法来实现。
1.1 介绍
-
一阶导数(梯度):
- 水平方向梯度(Gx): 表示图像在水平方向上的变化率。
- 垂直方向梯度(Gy): 表示图像在垂直方向上的变化率。
- 梯度幅值: 通过Gx和Gy的组合计算,通常使用欧几里得范数(平方和的平方根)表示:
-
梯度方向:
- 梯度方向角度(θ): 通过arctan(Gy/Gx)计算,表示梯度的方向。
-
边缘检测:
- 基于图像梯度的边缘检测算法,如Sobel、Prewitt、Roberts等,通过卷积运算来获取图像梯度。
-
Canny边缘检测:
- Canny边缘检测是一种常用的边缘检测方法,它利用图像梯度的幅值和方向来检测边缘。
-
图像增强:
- 图像梯度也可以用于图像增强,通过调整图像梯度的幅值和方向来改善图像的视觉效果。
在实际图像处理中,图像梯度是一个重要的特征,它不仅用于边缘检测,还可以应用于目标检测、图像分割和其他计算机视觉任务。通过分析图像梯度,可以获取关于图像结构和内容的有用信息。
1.2 涉及函数
-
Sobel算子:
cv2.Sobel(src, ddepth, dx, dy, ksize)
: 对图像进行Sobel算子的卷积操作,其中dx
和dy
表示求导的阶数,ksize
是卷积核的大小。
-
Scharr算子:
cv2.Scharr(src, ddepth, dx, dy)
: 类似于Sobel,用于对图像进行Scharr算子的卷积操作。
-
Laplacian算子:
cv2.Laplacian(src, ddepth)
: 对图像进行Laplacian算子的卷积操作,用于增强图像中的高频信息。
-
Canny边缘检测:
cv2.Canny(image, threshold1, threshold2)
: 使用Canny边缘检测算法,threshold1
和threshold2
是梯度阈值,用于定义边缘的强弱。
-
角度和幅值计算:
cv2.phase(x, y)
: 计算输入图像梯度的相位角度。cv2.magnitude(x, y)
: 计算输入图像梯度的幅值。
-
图像梯度计算:
cv2.Sobel()
,cv2.Scharr()
, 和cv2.Laplacian()
的输出可以通过cv2.magnitude()
和cv2.phase()
计算幅值和相位。
-
图像增强:
- 借助梯度信息可以进行图像增强,例如通过调整梯度的幅值来实现锐化。
-
图像显示:
cv2.imshow(window_name, image)
: 用于显示图像,可以用来显示梯度图等中间结果。
二、高频强调滤波器
在OpenCV中,梯度滤波器或高通滤波器通常用于突出图像中的边缘和细节。这些滤波器是一种高频强调滤波器,可以通过卷积操作来应用于图像。、
-
Sobel滤波器:
- Sobel滤波器是一种常用的梯度滤波器,用于在图像中检测边缘。它分为水平和垂直两个方向。
sobelx = cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3) sobely = cv2.Sobel(src, cv2.CV_64F, 0, 1, ksize=3)
这里,
1
和0
分别表示水平和垂直方向,ksize
是卷积核的大小。 -
Scharr滤波器:
- Scharr滤波器类似于Sobel,但对边缘的响应更强。你可以使用
cv2.Scharr()
函数来应用Scharr滤波器。
scharrx = cv2.Scharr(src, cv2.CV_64F, 1, 0) scharry = cv2.Scharr(src, cv2.CV_64F, 0, 1)
- Scharr滤波器类似于Sobel,但对边缘的响应更强。你可以使用
-
Laplacian滤波器:
- Laplacian滤波器用于增强图像的高频部分,通常用于边缘检测。
laplacian = cv2.Laplacian(src, cv2.CV_64F)
-
Canny边缘检测:
- Canny边缘检测是一种综合了梯度信息的方法,包括非极大值抑制和双阈值处理。
edges = cv2.Canny(src, threshold1, threshold2)
其中,
threshold1
和threshold2
是梯度阈值,用于定义边缘的强弱。
这些滤波器可以帮助突出图像中的边缘信息,对于图像处理中的特定任务,你可以根据需要选择合适的滤波器。
2.1 Sobel 算子
2.1.1 Sobel 理论基础
Sobel算子是一种常用的边缘检测算法,用于计算图像中像素点的梯度强度。在Sobel算子中,中心点相连的系数为2,是为了更好地捕捉图像中的边缘信息。
Sobel算子包含两个3x3的卷积核(一个用于检测水平边缘,另一个用于检测垂直边缘)
- 水平方向Sobe检测核:
-1 -2 -10 0 01 2 1
水平方向Sobel算子的卷积核主要关注图像中水平方向的变化。它通过将权重分配给中间列和左右列的像素,来检测图像中的水平边缘。
- 垂直方向Sobel检测核:
-1 0 1
-2 0 2
-1 0 1
垂直方向Sobel算子的卷积核主要关注图像中垂直方向的变化。它通过将权重分配给中间行和上下行的像素,来检测图像中的垂直边缘。
- 梯度计算:
假设要计算图像中某个像素位置的值,例如该位置为图像中的中心点(i,j)位置。卷积操作的计算步骤如下:
-
将Sobel算子的中心(1,1)位置与图像中以该点为中心的3x3区域进行对应元素相乘,并将结果相加。
-
(1)对于水平边缘检测核:
(-1 * I(i-1, j-1)) + (-2 * I(i, j-1)) + (-1 * I(i+1, j-1)) + (0 * I(i-1, j)) + (0 * I(i, j)) + (0 * I(i+1, j)) + (1 * I(i-1, j+1)) + (2 * I(i, j+1)) + (1 * I(i+1, j+1))
其中,I(i, j) 表示图像中像素位置为 (i, j) 的值。
简化:
P5x = (P3-P1) + 2·(P6-P4) + (P9-P7)
- (2) 垂直边缘检测核的计算公式:
(-1 * I(i-1, j-1)) + (0 * I(i, j-1)) + (1 * I(i+1, j-1)) +
(-2 * I(i-1, j)) + (0 * I(i, j)) + (2 * I(i+1, j)) +
(-1 * I(i-1, j+1)) + (0 * I(i, j+1)) + (1 * I(i+1, j+1))
简化:
P5y = (P7-P1) + 2·(P8-P2) + (P9-P3)
Sobel算子的应用可以帮助检测图像中的边缘,因为在边缘处,图像的强度发生明显的变化,导致梯度的幅值较大。Sobel算子在实际图像处理中广泛应用,尤其是在计算机视觉和图像分析领域,为后续的边缘检测和图像特征提取提供了基础。
2.1.2 Sobel 算子及函数使用
dst = cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])
其中参数的含义如下:
src
: 输入图像,通常是灰度图像。ddepth
: 输出图像的深度(数据类型)。通常使用cv2.CV_64F
或-1
(让处理结果与原始图像保持一致)。
当 ddepth 设置为 -1 时,如果 Sobel 滤波器的计算导致了负数,这些负数将被截断为 0。这可能导致信息的丢失,因为负数通常在图像处理中是有意义的。
为了避免信息丢失,推荐使用更高的数据类型来进行计算,例如 cv2.CV_64F,即64位浮点型。这样,计算结果将以浮点数的形式保存,包括负数。然后,可以通过取绝对值或其他操作将其映射为需要的数据类型,例如 cv2.CV_8U,即8位无符号整数。
dx
和dy
: 分别表示在 x 和 y 方向上的导数的阶数,通常是 0 或 1。ksize
: 可选参数,表示 Sobel 滤波器的大小,通常是 1、3、5 或 7。默认值是 3。
当该值为-1 时,则会使用 Scharr 算子进行运算。scale
: 可选参数,用于缩放导数的比例因子。默认值是 1,是没有缩放的。delta
: 可选参数,表示可选的增加到输出图像的值,用于调整图像的亮度。默认值是 0。borderType
: 可选参数,表示图像边界的处理方式。默认值是cv2.BORDER_DEFAULT
。
这个函数的作用是应用 Sobel 滤波器,计算图像中每个像素点的梯度。dx
和 dy
参数决定了计算的梯度方向,常见的取值为 0、1,表示水平和垂直方向的梯度。ksize
参数用于指定 Sobel 滤波器的大小。
绝对值的原因:为了让偏导数正确地显示出来,需要将值为负数的近似偏导数转换为正数。即,要将偏导数取绝对值,以保证偏导数总能正确地显示出来。
`
如果不取绝对值,梯度的正负将分别表示变化的方向。但在实际应用中,我们更关心图像中是否存在边缘以及边缘的强度,而不太在意边缘的具体方向。因此,为了简化计算并准确表示边缘的变化强度,常常使用绝对值来忽略方向信息。
设想在二维图像中有两个线条 A 和 B,A 线条是一条黑到白的线,B 线条是一条白到黑的线。
若针对 A 线条所在列,右侧像素值减去左侧像素值所得近似偏导数的值为-1。 针对 B 线条所在列,右侧像素值减去左侧像素值所得近似偏导数的值为 1。针对 A 线条所在行,下方像素值减去上方像素值所得近似偏导数为-1。 针对 B 线条所在行,下方像素值减去上方像素值所得近似偏导数为 1。
示例:
import cv2
import numpy as np# 读取图像
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)# 应用 Sobel 滤波器计算水平方向的梯度
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)# 应用 Sobel 滤波器计算垂直方向的梯度
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
这将分别计算图像中每个像素点的水平和垂直方向的梯度。你可以根据需要进一步处理这些梯度图像,例如计算梯度幅值和方向,用于边缘检测或其他图像处理任务。
(1)对参数取绝对值
cv2.convertScaleAbs()
是 OpenCV 中用于线性缩放和截断的函数。它的目的是将输入数组进行线性缩放并进行截断,最后将结果转换为无符号8位整数(cv2.CV_8U
)类型。
该函数的基本语法如下:
#该函数的作用是将原始图像 src 转换为 256 色位图
import cv2
dst = cv2.convertScaleAbs(src [, alpha[, beta]])
其中:
src
: 输入数组,即待处理的图像或数据。
alpha
: 缩放因子,用于乘以输入数组的每个元素。默认值为 1。
beta
: 偏移量,用于在缩放后对每个元素进行加法运算。默认值为 0。
import cv2
import numpy as np# 读取图像
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)# 缩放和平移图像,然后取绝对值
alpha = 1.5
beta = 20
result = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)# 显示原图和处理后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
(2)控制dx,dy方向的求导阶数
需要注意的是,dx和dy的值不能同时为0,因为至少要在一个方向上进行梯度计算,否则Sobel算子无法发挥作用。
1. 计算 x 方向边缘(梯度):
dx=1, dy=0
,表示只计算图像中每个像素点在 x 方向上的梯度。这有助于检测图像中水平方向的边缘。
注意里面的ddepth的不同和求导的数字1和2造成的差别:
*
ddepth=-1
ddepth=cv2.CV_64F
2. 计算 y 方向边缘(梯度):
dx=0, dy=1
,表示只计算图像中每个像素点在 y 方向上的梯度。这有助于检测图像中垂直方向的边缘。
3. 参数 dx
和参数 dy
的值均为 1
dx=1, dy=1
,表示同时计算图像中每个像素点在 x 和 y 方向上的梯度。这将产生一个包含综合梯度信息的结果,用于检测边缘的强度和方向。
出现零星的微小白点,每个点的大小为一个像素。
4. 计算 x 方向和 y 方向的边缘叠加:
- 通过组合不同的参数,如
dx=1, dy=0
和dx=0, dy=1
,可以实现计算 x 方向和 y 方向的边缘的叠加,得到更全面的边缘信息。
dx= cv2.Sobel( src , ddepth , 1 , 0 )
dy= cv2.Sobel( src , ddepth , 0 , 1 )
dst=cv2.addWeighted( src1 , alpha , src2 , beta , gamma )
2.1.3通过实际例子表示
(1)简单图像
为了保留更多的有效信息,利用“cv2.CV_64F”,参数 dx
和 dy 的值设置为“dx=1, dy=0”后执行该函数,再对该函数的结果计算绝对值并进行对比
import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread('img8/testSobelimg.jpg', cv.IMREAD_GRAYSCALE)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0)
testsoblex = cv.Sobel(img, -1, 1, 0)
print(sobelx)
sobelxbeside = cv.convertScaleAbs(sobelx)#%%sobely = cv.Sobel(img, cv.CV_64F, 0, 1)
testsobley = cv.Sobel(img, -1, 0, 1)
print(sobely)
sobelybeside = cv.convertScaleAbs(sobely)#%%sobelxy = cv.Sobel(img, -1, 1, 1)
print(sobelxy)
Sobelxyy = cv.Sobel(img, -1, 1, 1)
plt.imshow(sobelxy, cmap='gray')#%%sobelxy = cv.addWeighted(sobelx, 1, sobely, 1, 0)
print(sobelxy)
plt.imshow(sobelxy, cmap='gray')
Sobelxybeside = cv.convertScaleAbs(sobelxy)#%%Sobelx = cv.convertScaleAbs(sobelxy)
print(Sobelx)
plt.imshow(Sobelx, cmap='gray')#%% md#%%plt.figure(figsize=(12, 8))plt.subplot(3, 3, 1), plt.imshow(img, cmap='gray'), plt.title('原始图像')plt.subplot(3, 3, 2), plt.imshow(sobelx, cmap='gray'), plt.title('sobelx')
plt.subplot(3, 3, 3), plt.imshow(sobely, cmap='gray'), plt.title('sobely')plt.subplot(3, 3, 4), plt.imshow(Sobelxyy, cmap='gray')plt.subplot(3, 3, 5), plt.imshow(sobelxbeside, cmap='gray'), plt.title('sobelxbeside')
plt.subplot(3, 3, 6), plt.imshow(sobelybeside, cmap='gray'), plt.title('sobelybeside')plt.subplot(3, 3, 7), plt.imshow(Sobelxybeside, cmap='gray')
plt.subplot(3, 3, 8), plt.imshow(testsoblex, cmap='gray'), plt.title('testsoblex')
plt.subplot(3, 3, 9), plt.imshow(testsobley, cmap='gray'), plt.title('testsobley')plt.show()
(2)复杂的,实际的相片
我们可以看到ddepth是-1和cv_64F的区别,在人物和这个细微
2.1.4 近似值
2.2 Scharr 算子
为了弥补Sobel不太精准的情况,我们可以用 Scharr 算子并看作对 Sobel 算子的改进:
dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )
# 最好ddepth-cv2.cv_64F
dst= cv2.convertScaleAbs(dst)
2.2.1 等价的函数。
dst=cv2.Scharr(src, ddepth, dx, dy)
和 cv2.Sobel()中,如果 ksize=-1,则会使用 Scharr 滤波器。
dst=cv2.Sobel(src, ddepth, dx, dy, -1)
2.2.2需要满足的条件:dx >= 0 && dy >= 0 && dx+dy = 1
参数 ddepth 的值应该设置为“cv2.CV_64F”,并对函数
cv2.Scharr()的计算结果取绝对值,才能保证得到正确的处理结果。
2.2.3 Sobel 算子和 Scharr 算子的比较
Sobel算子和Scharr算子都是用于图像边缘检测的滤波器,它们在一些方面有相似之处,但也存在一些差异。以下是Sobel算子和Scharr算子的比较:
-
灵敏度:
-
Sobel算子:
Sobel算子对边缘的响应相对较强,但相对来说,对噪声的敏感性也较高。 -
Scharr算子:
Scharr算子在对边缘的响应上更加平滑,对噪声的敏感性相对较低。
-
-
计算复杂度:
-
Sobel算子:
Sobel算子的计算较为简单,适用于一些对计算资源要求较低的场合。 -
Scharr算子:
Scharr算子的计算复杂度相对较高,但在一些对精确性要求较高的场景中可能更为合适。
-
-
性能:
-
Sobel算子:
Sobel算子广泛应用于一般的边缘检测任务,性能较好。 -
Scharr算子:
Scharr算子在一些特定的图像分析任务中可能表现得更好,尤其是对于强边缘的检测。
-
在选择使用Sobel算子或Scharr算子时,通常会根据具体的应用场景和任务需求来权衡它们之间的差异。
2.3 拉普拉斯 Laplacian 算子
它是通过对图像进行二阶微分操作来实现的,能够突出图像中像素值变化较大的区域。拉普拉斯算子通常应用于灰度图像。,需要计算两个方向的梯度值。
前两个算子,都是m连通型的(即:对角),现在介绍一个4连通的。
计算像素点 P5 的近似导数值,
P5lap = (P2 + P4 + P6 + P8) - 4·P5
计算结果的值可能为正数,也可能为负数。所以,需要对计算
结果取绝对值,以保证后续运算和显示都是正确的。
2.3.1 函数
laplacian = cv2.Laplacian(src, ddepth[, ksize[, scale[, delta[, borderType]]]])laplacian = cv2.Laplacian(o,cv2.CV_64F)laplacian = cv2.convertScaleAbs(laplacian) # 回uint8
src
:输入图像,通常是灰度图像。ddepth
:输出图像的深度(数据类型),通常使用cv2.CV_64F
。ksize
:拉普拉斯算子的卷积核大小,通常为1。scale
:拉普拉斯算子的缩放因子,用于调整结果的幅值。delta
:可选的增加到输出图像的值,用于调整图像的亮度。borderType
:图像边界处理类型,默认为cv2.BORDER_DEFAULT
。
不用像Sobel算子一样,需要算x和y方向的再加起来。
三、Canny 边缘检测
3.1 Canny 原理
【去噪–计算梯度的幅度与方向–非极大值抑制–确定边缘】
Canny 边缘检测是一种经典的图像处理技术,通常包括以下几个步骤:
-
高斯滤波(Gaussian Blur):
- 首先,图像会经过高斯滤波以平滑噪声和细节。这有助于减少后续步骤中的误差和不必要的细节。
让临近的像素具有更高的重要度。对周围像素计算加权平均值,较近的像素具有较大的权重值。
-
灰度转换(Grayscale Conversion):
- 将图像转换为灰度,将彩色图像转换为单通道灰度图像。这样可以简化处理,并减少计算复杂性。
-
计算梯度(Gradient Calculation):
- 使用卷积操作,如Sobel算子,计算图像的梯度。梯度的方向和强度有助于找到图像中的边缘。
- 使用卷积操作,如Sobel算子,计算图像的梯度。梯度的方向和强度有助于找到图像中的边缘。
梯度:
方向:
- 非极大值抑制(Non-maximum Suppression):
- 对梯度图进行非极大值抑制,以保留局部梯度最大的点,从而使边缘更细化。
- 滞后阈值处理(Hysteresis Thresholding):
- 使用两个阈值进行滞后阈值处理。通常,有一个较低的阈值(弱边缘)和一个较高的阈值(强边缘)。根据梯度强度,将像素标记为强边缘、弱边缘或非边缘。强边缘会被保留,而与强边缘连接的弱边缘也会被保留。
设定阈值:
- 选择两个阈值,一个是高阈值(maxVal),另一个是低阈值(minVal)。这两个阈值的选择通常依赖于具体的应用和图像特性。
判断边缘属性:
- 对图像中的每个像素进行检查,根据其梯度值与设定的阈值之间的关系,判断其边缘的属性:
- 如果梯度值大于或等于高阈值(maxVal),则将该像素标记为强边缘。
- 如果梯度值介于高阈值和低阈值之间(minVal到maxVal之间),则将该像素标记为虚边缘(需要保留)。
- 如果梯度值小于或等于低阈值(minVal),则抑制该像素,认为它不是边缘。
处理虚边缘:
- 对于被标记为虚边缘的像素,进一步判断其是否与强边缘相连。如果与强边缘相连,则将其标记为强边缘,否则抑制它。 这个步骤的目标是最终确定哪些边缘是真实的、强的,哪些是需要保留的虚边缘,以及哪些应该被抑制。这样的处理可以有效减少噪声和虚假边缘,提高Canny边缘检测的准确性。
3.2 Canny 函数及使用
edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
edges 为计算得到的边缘图像。
image 为 8 位输入图像。
如果为了细节,就设置的小一些
threshold1 表示处理过程中的第一个阈值。
threshold2 表示处理过程中的第二个阈值。
import cv2
import matplotlib.pyplot as plt# 读取图像
image_path = './'
original_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)# 高斯滤波,去除噪声
blurred_image = cv2.GaussianBlur(original_image, (5, 5), 0)# 使用Canny函数进行边缘检测
edges = cv2.Canny(blurred_image, 50, 150) # 50是低阈值,150是高阈值# 显示原始图像、模糊图像和边缘图像
plt.figure(figsize=(10, 6))plt.subplot(131)
plt.imshow(original_image, cmap='gray')
plt.title('Original Image')plt.subplot(132)
plt.imshow(blurred_image, cmap='gray')
plt.title('Blurred Image')plt.subplot(133)
plt.imshow(edges, cmap='gray')
plt.title('Canny Edges')plt.show()
相关文章:

我在Vscode学OpenCV 图像处理三(图像梯度--边缘检测【图像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 边缘检测】)
文章目录 一、图像梯度1.1 介绍1.2 涉及函数 二、高频强调滤波器2.1 Sobel 算子2.1.1 Sobel 理论基础2.1.2 Sobel 算子及函数使用(1)对参数取绝对值(2)控制dx,dy方向的求导阶数1. **计算 x 方向边缘(梯度&a…...

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑤
单元测试 一、任务要求 题目1:根据下列流程图编写程序实现相应处理,执行j10*x-y返回文字“j1:”和计算值,执行j(x-y)*(10⁵%7)返回文字“j2:”和计算值,执行jy*log(x10)返回文字“j3:”和计算值…...

seata分布式事务(与dubbo集成)
1.seata是什么? Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的注解 GlobalTransactional:全局事务注解,添加了以后可实现分布式事务的回滚和提交,用法与spring…...

Leetcod面试经典150题刷题记录 —— 数学篇
Leetcode面试经典150题刷题记录-系列Leetcod面试经典150题刷题记录——数组 / 字符串篇Leetcod面试经典150题刷题记录 —— 双指针篇Leetcod面试经典150题刷题记录 —— 矩阵篇Leetcod面试经典150题刷题记录 —— 滑动窗口篇Leetcod面试经典150题刷题记录 —— 哈希表篇Leetcod…...

x-cmd pkg | csview - 美观且高性能的 csv 数据查看工具
目录 介绍首次用户功能特点类似工具与竞品进一步阅读 介绍 csview 是一个用于在命令行中查看 CSV 文件的工具,采用 Rust 语言编写的,支持中日韩/表情符号。它允许用户在终端中以表格形式查看 CSV 数据,可以对数据进行排序、过滤、搜索等操作…...

前端八股文(性能优化篇)
目录 1.CDN的概念 2.CDN的作用 3.CDN的原理 4.CDN的使用场景 5.懒加载的概念 6.懒加载的特点 7.懒加载的实现原理 8.懒加载与预加载的区别 9.回流与重绘的概念及触发条件 (1)回流 (2)重绘 10. 如何避免回流与重绘&#…...

.Net Core项目在linux部署实战 1.sdk下载 2.环境变量配置/ect/profile 3.运行
1)下载.net core sdk https://download.visualstudio.microsoft.com/download/pr/01292c7c-a1ec-4957-90fc-3f6a2a1e5edc/025e84c4d9bd4aeb003d4f07b42e9159/dotnet-sdk-6.0.418-linux-x64.tar.gz 2)配置下环境变量 step1: // 解压到指定目录 mkdir -p $HOME/dotnet &…...

Python 基于Open3D的点云均匀下采样算法
目录 一、算法概述二、代码示例三、测试示例一、算法概述 点云均匀下采样算法:是在保持点云关键特征的前提下,减少点云数据的数量。 算法流程: 首先使用o3d.io.read_point_cloud函数读取点云数据。然后,使用uniform_down_sample函数进行均匀下采样,将点云数据按照指定的采…...

【MySQL】本地创建MySQL数据库详解
文章目录 下载MySQL安装重置密码本地连接 下载MySQL 下载网址:https://dev.mysql.com/downloads/mysql/ 安装 将下载好的压缩包解压到D盘。 在解压好的文件夹中创建my.ini文件。 将以下代码复制粘贴到创建好的my.ini文件中。注意修改文件路径。 [mysqld] #设置…...

18、golang时间管理
时间 时间是非常重要的,离开了时间,几乎没有哪个生产环境数据能够有意义。 在Go语言中,时间定义为Time结构体。 package mainimport ("fmt""time" )func main() {var t time.Now()fmt.Println(t) fmt.Printf("%…...

远程开发之vacode插件Remote - SSH
远程开发之vacode插件Remote - SSH vscode插件(Remote - SSH)ssh config自定义配置跳板机ssh-agent配置(使ForwardAgent配置生效, 免密拉代码)拷贝公钥到服务器(实现免密登录服务器) 通过vscode的Remote - SSH插件, 实现远程服务器进行像本地操作一样使用远程服务器, 亦可进行像…...

大模型实战营Day4 作业
基础作业: 构建数据集,使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手,效果如下图所示,本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称! 微调前(回答比较…...

翻译: Streamlit从入门到精通 基础控件 一
这个关于Streamlit的教程旨在帮助数据科学家或机器学习工程师,他们不是网络开发者,也不想花费数周时间学习使用这些框架来构建网络应用程序。 1. 什么是Streamlit? Streamlit是一个免费且开源的框架,用于快速构建和共享美观的机器…...

【复现】网康科技-防火墙存在RCE漏洞_17
目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 网康下一代防火墙(NGFW)是一款可以全面应对应用层威胁的高性能防火墙。通过深入洞察网络流量中的用户、应用和内容,并…...

vue2、vue3里面去掉访问地址中路由‘#‘号--nginx配置
需求 我们这里分享一下关于Vue2和Vue3里面如何去掉浏览器路由里面#号的问题,以及nginx的配置。 去掉#号问题之前我们先讨论一下html中的hash模式和history模式。 html中的hash模式 HTML的hash模式指的是URL中的锚点部分(#后面的内容)被用…...

AR HUD全面「上新」
AR HUD赛道正在迎来新的时代。 上周,蔚来ET9正式发布亮相,新车定位为D级行政旗舰轿车,其中,在智能座舱交互层面,继理想L系列、长安深蓝S7之后,也首次取消仪表盘,取而代之的是业内首个全焦段AR H…...

Open3D AABB包围盒计算与使用(19)
Open3D AABB包围盒计算与使用(19) 一、算法速览二、算法实现1.代码2.结果少年听雨歌楼上。红烛昏罗帐。壮年听雨客舟中。江阔云低、断雁叫西风。 而今听雨僧庐下。鬓已星星也。悲欢离合总无情。一任阶前、点滴到天明。 一、算法速览 AABB包围盒就是将点云用一个各条边沿着坐…...

HDFS相关API操作
文章目录 API文档环境配置API操作准备工作创建文件夹文件上传文件下载文件删除文件的更名和移动获取文件详细信息 API文档 HDFS API官方文档:https://hadoop.apache.org/docs/r3.3.1/api/index.html 环境配置 将Hadoop的Jar包解压到非中文路径(例如D:…...

【AI视野·今日Robot 机器人论文速览 第七十二期】Mon, 8 Jan 2024
AI视野今日CS.Robotics 机器人学论文速览 Mon, 8 Jan 2024 Totally 13 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Deep Reinforcement Learning for Local Path Following of an Autonomous Formula SAE Vehicle Authors Harvey Merton, Thoma…...

背包问题(补充中)
1.01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 v[i],价值是 w[i]。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 对于01背包问题,只有…...

十三、QPalette的简单使用(Qt5 GUI系列)
目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 在实际应用中,经常需要改变某个控件的颜色外观,如背景、文字颜色等。Qt提供的调色板类 QPalette 专门用于管理对话框的外观显示。QPalette 类相当于对话框或是控件的调色板&…...

uniapp小程序超出一行显示...并展示更多按钮
注意:全部标签需要浮动在父盒子右边哦 循环获取所有需要展示数据标签的高度 this.goods this.goods.map(item > ({...item,showBtn: false}));this.$nextTick(() > {uni.createSelectorQuery().in(this).selectAll(".cart-info").boundingClientRect((data)…...

Qt打包程序
添加链接描述...

实验用PFA材质烧杯和高硼硅玻璃材质有什么区别?
高硼硅玻璃烧杯和特氟龙烧杯是两种常见的实验室容器,它们有不同的特点和应用。 高硼硅玻璃烧杯: 高硼硅玻璃烧杯是一种由硅酸盐和硼酸盐等原料制成的玻璃材质。它具有以下特点: 耐热性能较好,可以承受较高的温度变化。 抗化学侵…...

Raspbian安装摄像头
Raspbian安装摄像头 1. 源由2. 摄像头2.1 选型2.2 系统2.3 安装 3. 配置&命令3.1 命令3.2 配置 4. 测试4.1 拍照4.1.1 libcamera-jpeg4.1.2 libcamera-still 4.2 视频流4.2.1 RTSP流4.2.2 TCP流 5. 参考资料 1. 源由 家里闲置两块树莓派,打算做个WiFi视频流RTS…...

迅腾文化用网络集成化生态系统助力品牌之路的坚实后盾
商业竞争激烈,品牌不仅是企业的标志和形象,更是其核心价值和竞争力的体现。然而,企业在品牌推广过程中面临着诸多如缺乏有效的渠道管理、品牌形象模糊以及竞争激烈的市场环境等。这些阻碍着企业的品牌发展和市场占有率的提升。本文将通过企业…...

2401C++,C++编译时自动加密
编译时加密串 编译时加密串,运行时动态解密.此自定义加密算法可增加破解的难度,因为攻击者不仅需要逆向工程代码,还需要理解加密算法. 这样对代码的改动小,不影响代码可读性. 下面是使用boost.hana编译时加密串的示例: #include <string> #include <iostream> #i…...

vue 自定义网页图标 favicon.ico 和 网页标题
效果预览 1. 添加配置 vue.config.js 在 module.exports { 内添加 // 自定义网页图标pwa: {iconPaths: {favicon32: "./favicon.ico",favicon16: "./favicon.ico",appleTouchIcon: "./favicon.ico",maskIcon: "./favicon.ico",msTil…...

JOSEF约瑟端子排中间继电器 DZY-204 DC110V 导轨安装,板前接线
DZY系列端子排中间继电器 系列型号: DZY-101端子排中间继电器 DZY-104端子排中间继电器 DZY-105端子排中间继电器 DZY-301端子排中间继电器 DZY-106端子排中间继电器 DZY-401端子排中间继电器 DZY-204端子排中间继电器 一、 概述 DZY-204端子排中间继电器用于各种…...

VMware workstation搭建与安装AlmaLinux-9.2虚拟机
VMware workstation搭建与安装AlmaLinux-9.2虚拟机 适用于需要在VMware workstation平台安装AlmaLinux-9.2(最小化安装、无图形化界面)虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径VMware-workstation 1…...