OpenCV快速入门:初探

文章目录

  • 一、什么是OpenCV
  • 二、安装OpenCV
  • 三、图像读取与显示
    • 读取图像
    • 显示图像
    • 等待按键与关闭窗口
  • 四、视频加载与摄像头调用
    • 从视频文件中读取
    • 从摄像头中读取
    • 关闭窗口与释放资源
  • 五、图像的基本存储方式
    • RGB矩阵
    • 矩阵操作与像素访问
    • 使用矩阵来显示图像
  • 六、图像保存
    • 读取图像
    • 保存图像
    • 完整代码
  • 七、深拷贝与浅拷贝
    • 1. 浅拷贝
    • 2. 深拷贝
    • 3. 选择适当的拷贝方式
  • 八、图像颜色空间
    • 1. RGB颜色空间
    • 2. 灰度颜色空间
    • 3. HSV颜色空间
    • 4. LAB颜色空间
    • 5. YUV颜色空间
  • 总结

一、什么是OpenCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛应用于计算机视觉和机器学习领域。它提供了丰富的功能,包括图像处理、计算机视觉、机器学习等,是许多计算机视觉项目的首选工具。
OpenCVlogo

二、安装OpenCV

在开始学习OpenCV之前,首先需要安装OpenCV库。安装过程因操作系统而异,但通常可以通过包管理器(如pip)轻松完成。以下是在Python中使用pip安装OpenCV的示例:

pip install opencv-python

确保环境中已经配置好Python,并且具备良好的网络连接。安装完成后,就可以开始使用OpenCV了。

在安装OpenCV后,可以通过简单的代码测试是否安装成功。以下是一个简单的Python脚本,用于检验OpenCV的安装:

import cv2# 输出OpenCV的版本信息
print("OpenCV version:", cv2.__version__)

执行这个脚本,如果成功输出OpenCV的版本信息,那么OpenCV安装就是成功的。如果遇到任何错误或没有输出,可能是安装过程中出现了问题,需要重新检查安装步骤。

三、图像读取与显示

使用OpenCV读取和显示图像是学习的第一步。下面是一个简单的示例代码:

import cv2# 读取图像
image = cv2.imread('test_image.jpg')# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

读取图像

首先,我们需要明白如何读取图像。在OpenCV中,可以使用cv2.imread()函数来实现。下面是一个简单的代码示例:

import cv2# 读取图像
image = cv2.imread('test_image.jpg')

在这里,我们使用cv2.imread()函数读取了名为 test_image.jpg 的图像。请确保已经将测试图像放到项目根目录,并重命名为 'test_image.jpg'

显示图像

读取图像之后,我们通常希望查看图像的内容。这时候就需要使用cv2.imshow()函数来显示图像:

# 显示图像
cv2.imshow('Image', image)

这行代码将图像显示在一个名为 ‘Image’ 的窗口中。窗口的名字可以根据需求自定义。

等待按键与关闭窗口

为了能够观察图像,我们需要等待用户按下一个键。使用cv2.waitKey()函数来实现,它会暂停程序,直到键盘有按键输入。通常,我们在按下任意键之后,使用cv2.destroyAllWindows()关闭图像窗口。

# 等待按键
cv2.waitKey(0)# 关闭窗口
cv2.destroyAllWindows()

这样,我们就完成了图像读取与显示的整个过程。当运行这段代码时,应该能够看到弹出的窗口显示了测试图像。

四、视频加载与摄像头调用

在计算机视觉和图像处理中,处理静态图像只是冰山一角,实际应用中,我们经常需要处理动态的视频流。OpenCV提供了强大的功能,可以轻松地从视频文件中读取帧或者调用摄像头实时捕捉图像。在这一章中,我们将介绍如何使用OpenCV加载视频文件和调用摄像头,实时显示视频帧。

从视频文件中读取

首先,我们看一下如何从视频文件中读取帧。下面是一个简单的代码示例:

import cv2# 从视频文件中读取
cap = cv2.VideoCapture('video.mp4')while True:ret, frame = cap.read()if not ret:breakcv2.imshow('Video', frame)if cv2.waitKey(30) & 0xFF == 27:  # 按ESC键退出breakcap.release()
cv2.destroyAllWindows()

在这里,我们使用cv2.VideoCapture()函数创建了一个视频捕捉对象,它可以从指定路径的视频文件中读取帧。然后,我们通过循环不断读取视频的每一帧,使用cv2.imshow()函数实时显示。
请确保已经将测试视频放到项目根目录,并重命名为 'video.mp4'

从摄像头中读取

如果想实时从摄像头中获取图像,只需稍作修改即可:

import cv2# 从摄像头中读取
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()cv2.imshow('Video', frame)if cv2.waitKey(30) & 0xFF == 27:  # 按ESC键退出breakcap.release()
cv2.destroyAllWindows()

在这里,我们将cv2.VideoCapture()的参数设置为0,表示使用默认摄像头。如果有多个摄像头,可以尝试不同的参数值。

关闭窗口与释放资源

在处理视频时,及时关闭窗口和释放资源是很重要的。在循环结束后,我们使用cap.release()释放摄像头或视频文件的资源,并使用cv2.destroyAllWindows()关闭所有窗口。

五、图像的基本存储方式

在图像处理中,图像被看作是一个由像素组成的矩阵。每个像素包含了图像在特定位置的颜色信息。理解图像的存储方式对于图像处理算法的实现至关重要。在OpenCV中,图像以矩阵的形式进行存储,其中矩阵的行和列对应于图像的高度和宽度,而矩阵的元素则是像素的颜色值。

RGB矩阵

对于彩色图像,通常有三个矩阵对应于红、绿、蓝三个颜色通道。每个矩阵中的元素表示图像相应位置上对应颜色通道的强度值。可以表示为:

I = [ R G B ] I = \begin{bmatrix} R & G & B \end{bmatrix} I=[RGB]

其中, R , G , B R, G, B R,G,B 分别是红、绿、蓝颜色通道的矩阵。这是一个三维矩阵,每个元素是一个标量,表示对应位置的像素值。

矩阵操作与像素访问

通过矩阵操作,我们可以对图像进行各种操作,例如裁剪、旋转和缩放。图像处理算法通常涉及对矩阵进行一系列数学运算,以实现各种效果。

在OpenCV中,我们可以使用NumPy库来处理图像矩阵。例如,要访问图像的特定像素,可以使用以下代码:

import cv2# 读取图像
image = cv2.imread('test_image.jpg')# 获取图像大小
height, width = image.shape[:2]# 访问特定像素(假设坐标为(50, 100))
pixel_value = image[50, 100]# 修改像素值
image[50, 100] = [255, 255, 255]  # 将该像素设为白色# 显示修改后的图像
cv2.imshow('Modified Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用矩阵来显示图像

在OpenCV中,可以使用cv2.imshow()函数来显示图像,但是图像的显示是基于实际的图像文件,而不是直接基于矩阵。因此,我们需要通过NumPy库创建一个示例矩阵,将其保存为图像文件,然后再显示。

以下是一个示例代码,演示了如何创建一个简单的矩阵并将其显示:

import cv2
import numpy as np# 创建一个示例矩阵(红色正方形)
example_matrix = np.zeros((300, 300, 3), dtype=np.uint8)
example_matrix[50:250, 50:250] = [0, 0, 255]  # 设置矩阵中的一部分为红色cv2.imshow('Example Image', example_matrix)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,我们创建了一个大小为300x300的示例矩阵,将其中一部分设置为红色,并使用cv2.imshow()显示它。
Example Image

六、图像保存

在图像处理和计算机视觉的应用中,图像的保存是一个常见而重要的操作。OpenCV提供了简便的方法,使得图像保存变得非常容易。

读取图像

首先,我们需要一个图像来进行保存操作。在这里,我们使用了cv2.imread()函数读取一张图像:

import cv2image = cv2.imread('test_image.jpg')

这行代码将名为 test_image.jpg 的图像加载到内存中,作为我们后续保存的对象。确保已经将测试图像放到项目根目录,并重命名为 'test_image.jpg'

保存图像

接下来,我们使用cv2.imwrite()函数将图像保存为新的文件。以下是保存图像的示例代码:

# 保存图像
cv2.imwrite('output_image.jpg', image)

这行代码将读取的图像保存为名为 'output_image.jpg' 的新文件。这个文件会被保存在当前工作目录中。

完整代码

下面是一个完整的代码示例,包含了图像的读取和保存操作:

import cv2# 读取图像
image = cv2.imread('test_image.jpg')# 保存图像
cv2.imwrite('output_image.jpg', image)

七、深拷贝与浅拷贝

在OpenCV中,深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是涉及图像处理时的两个重要概念。理解它们之间的区别对于正确处理图像数据至关重要,因为不同的拷贝方式会导致对图像数据的不同处理结果。

1. 浅拷贝

浅拷贝是指在拷贝过程中,只复制对象的引用而不复制对象本身的数据。在图像处理中,这意味着新的对象与原始对象共享相同的数据,对其中一个对象的修改会影响到另一个对象。

在OpenCV中,浅拷贝通常通过使用赋值操作符或者使用 view 函数来实现。例如:

import cv2
import numpy as np# 创建一个示例矩阵(红色正方形)
image1 = np.zeros((300, 300, 3), dtype=np.uint8)
image1[50:250, 50:250] = [0, 0, 255]  # 设置矩阵中的一部分为红色# 浅拷贝 一
image2 = image1
# 浅拷贝
image2 = image1.view()image1[100:200, 100:200] = [0, 255, 0]  # 设置红色中的一部分为绿色cv2.imshow('Shallow Image', cv2.hconcat([image1, image2]))
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述例子中,image2image3image1 的浅拷贝。如果对 image1 进行修改,例如改变像素值或通道,这些修改会反映在 image2image3 上,因为它们共享相同的数据。
浅拷贝

2. 深拷贝

相比之下,深拷贝是一种复制整个对象及其数据的拷贝方式。在图像处理中,深拷贝创建了一个完全独立于原始对象的副本,对副本的修改不会影响原始对象。

OpenCV提供了深拷贝的方法,通常可以使用 copy 函数来实现:

import cv2
import numpy as np# 创建一个示例矩阵(红色正方形)
image1 = np.zeros((300, 300, 3), dtype=np.uint8)
image1[50:250, 50:250] = [0, 0, 255]  # 设置矩阵中的一部分为红色# 深拷贝
image2 = image1.copy()image1[100:200, 100:200] = [0, 255, 0]  # 设置红色中的一部分为绿色cv2.imshow('Shallow Image', cv2.hconcat([image1, image2]))
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,image2image1 的深拷贝。任何对 image2image1的修改都不会互相影响。
深拷贝

3. 选择适当的拷贝方式

在图像处理中,选择适当的拷贝方式取决于具体的应用场景。如果需要多个对象共享相同的数据,可以使用浅拷贝以节省内存。但是,如果需要独立处理图像数据而不影响原始数据,深拷贝则是更合适的选择。

我们需要根据具体需求谨慎选择适当的拷贝方式,以确保对图像数据的处理得到正确的结果。

八、图像颜色空间

图像的颜色空间是指用于表示和描述图像颜色的一种数学模型。在OpenCV中,图像通常以BGR(蓝绿红)格式存储,其中每个像素由三个分量组成。在图像处理过程中,经常需要转换颜色空间以满足特定的需求。本章将介绍一些常见的图像颜色空间以及在OpenCV中的相应操作。
郁金香

1. RGB颜色空间

在RGB颜色空间中,每个像素由红色(R)、绿色(G)和蓝色(B)三个分量组成。RGB颜色表示使用三个值来描述一种颜色,每个值通常在0到255的范围内,表示对应颜色通道的强度。

RGB颜色空间的颜色表示公式如下:

颜色 = ( R , G , B ) \text{颜色} = (R, G, B) 颜色=(R,G,B)

其中, R R R G G G B B B
表示红、绿、蓝通道的颜色强度。这种表示方式是直接的物理表示,即每个通道的值越大,对应颜色的强度越高。

在实际计算机图形处理中,通常将RGB值归一化到范围[0, 1]之间,公式如下:

( R , G , B ) = ( r 255 , g 255 , b 255 ) (R, G, B) = \left(\frac{r}{255}, \frac{g}{255}, \frac{b}{255}\right) (R,G,B)=(255r,255g,255b)

其中, r r r g g g b b b 分别是0到255范围内的整数值。这样,RGB值的范围就被映射到[0,
1]之间,方便进行计算和处理。

在OpenCV中,我们可以通过以下方式将图像从BGR转换为RGB:

import cv2# 读取图像
image_bgr = cv2.imread('test_image.jpg')# 将BGR转换为RGB
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)# 显示图像
cv2.imshow('Image', image_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

郁金香COLOR_BGR2RGB

2. 灰度颜色空间

灰度颜色空间是一种单通道的颜色表示方式,每个像素只有一个灰度值,表示图像的亮度。在灰度图像中,每个像素的值表示灰度级别,通常在0到255之间。

对于彩色图像,可以通过一些加权和来将其转换为灰度图像。最常见的灰度化公式是加权平均法,其中红、绿、蓝通道的值分别乘以一组权重系数,然后将它们相加。常用的加权平均法是:

灰度值 = 0.299 ⋅ 红色通道 + 0.587 ⋅ 绿色通道 + 0.114 ⋅ 蓝色通道 \text{灰度值} = 0.299 \cdot \text{红色通道} + 0.587 \cdot \text{绿色通道} + 0.114 \cdot \text{蓝色通道} 灰度值=0.299红色通道+0.587绿色通道+0.114蓝色通道

这个公式是基于人眼对不同颜色敏感度的权重,使得亮度在人眼感知中更为准确。这是因为人眼对于绿色的感知更为敏感,所以在计算灰度值时对绿色的权重较高。

在OpenCV中,可以使用以下方式将图像转换为灰度:

# 将BGR转换为灰度
image_gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)

郁金香COLOR_BGR2GRAY

3. HSV颜色空间

HSV颜色空间(色调 - 饱和度 - 明度)是一种将颜色信息以更直观的方式表示的颜色模型。在HSV中,颜色由三个分量组成:色调(Hue)、饱和度(Saturation)和明度(Value)。

HSV的颜色表示公式如下:

( H , S , V ) (H, S, V) (H,S,V)

其中, H H H 表示色调, S S S 表示饱和度, V V V 表示明度。

具体的计算公式如下:

V = max ⁡ ( R , G , B ) V = \max(R, G, B) V=max(R,G,B)

S = { V − min ⁡ ( R , G , B ) V if  V ≠ 0 0 if  V = 0 S = \begin{cases} \frac{V - \min(R, G, B)}{V} & \text{if } V \neq 0 \\ 0 & \text{if } V = 0 \end{cases} S={VVmin(R,G,B)0if V=0if V=0

H = { 0 if  R = G = B 60 ⋅ ( G − B ) V − min ⁡ ( R , G , B ) if  V = R 120 + 60 ⋅ ( B − R ) V − min ⁡ ( R , G , B ) if  V = G 240 + 60 ⋅ ( R − G ) V − min ⁡ ( R , G , B ) if  V = B H = \begin{cases} 0 & \text{if } R = G = B \\ \frac{60 \cdot (G - B)}{V - \min(R, G, B)} & \text{if } V = R \\ 120 + \frac{60 \cdot (B - R)}{V - \min(R, G, B)} & \text{if } V = G \\ 240 + \frac{60 \cdot (R - G)}{V - \min(R, G, B)} & \text{if } V = B \end{cases} H= 0Vmin(R,G,B)60(GB)120+Vmin(R,G,B)60(BR)240+Vmin(R,G,B)60(RG)if R=G=Bif V=Rif V=Gif V=B

在处理8位和16位图像时,RGB通道的值会被转换为浮点数格式,并进行缩放以适应0到1的范围。
在这里,如果 H < 0 H < 0 H<0,则 H = H + 360 H=H + 360 H=H+360 H H H 的取值范围是 [0, 360] 度, S S S V V V 的取值范围是 [0, 1]。

在OpenCV中,这些值将被转换为目标数据类型:

  • 对于8位图像 V = 255 V , S = 255 S , H = H 2 V = 255V, S = 255S, H = \frac{H}{2} V=255V,S=255S,H=2H(以适应0到255的范围)。
  • 对于16位图像:(目前不支持)。
  • 对于32位图像 H , S , V H, S, V H,S,V 保持不变。

在OpenCV中,可以使用以下方式将图像从BGR转换为HSV:

# 将BGR转换为HSV
image_hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)

郁金香COLOR_BGR2HSV

4. LAB颜色空间

LAB颜色空间是一种颜色模型,它包含三个分量:亮度(L,Luminance)和两个色度分量(a和b)。LAB颜色空间相较于RGB颜色空间更符合人眼感知。

Lab颜色空间的计算公式如下:

[ X Y Z ] = [ 0.412453 0.212671 0.019334 0.357580 0.715160 0.119193 0.180423 0.072169 0.950227 ] ⋅ [ R G B ] \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = \begin{bmatrix} 0.412453 & 0.212671 & 0.019334 \\ 0.357580 & 0.715160 & 0.119193 \\ 0.180423 & 0.072169 & 0.950227 \end{bmatrix} \cdot \begin{bmatrix} R \\ G \\ B \end{bmatrix} XYZ = 0.4124530.3575800.1804230.2126710.7151600.0721690.0193340.1191930.950227 RGB

X = X X n , 其中  X n = 0.950456 X = \frac{X}{X_n}, \text{其中 } X_n = 0.950456 X=XnX,其中 Xn=0.950456

Z = Z Z n , 其中  Z n = 1.088754 Z = \frac{Z}{Z_n}, \text{其中 } Z_n = 1.088754 Z=ZnZ,其中 Zn=1.088754

L = { 116 ( Y 1.3 ) 1 / 3 − 16 当  Y > 0.008856 903.3 Y 当  Y ≤ 0.008856 L = \begin{cases} 116 \left(\frac{Y}{1.3} \right)^{1/3} - 16 & \text{当 } Y > 0.008856 \\ 903.3Y & \text{当 } Y \leq 0.008856 \end{cases} L={116(1.3Y)1/316903.3Y Y>0.008856 Y0.008856

a = 500 ( f ( X ) − f ( Y ) ) + delta a = 500(f(X) - f(Y)) + \text{delta} a=500(f(X)f(Y))+delta

b = 200 ( f ( Y ) − f ( Z ) ) + delta b = 200(f(Y) - f(Z)) + \text{delta} b=200(f(Y)f(Z))+delta

其中,

f ( t ) = { t 1 / 3 当  t > 0.008856 t 3.787 + 16 116 当  t ≤ 0.008856 f(t) = \begin{cases} t^{1/3} & \text{当 } t > 0.008856 \\ \frac{t}{3.787} + \frac{16}{116} & \text{当 } t \leq 0.008856 \end{cases} f(t)={t1/33.787t+11616 t>0.008856 t0.008856

delta = { 128 当 8位图像 0 当 浮点图像 \text{delta} = \begin{cases} 128 & \text{当 8位图像} \\ 0 & \text{当 浮点图像} \end{cases} delta={1280 8位图像 浮点图像

在处理8位和16位图像时,RGB通道的值会被转换为浮点数格式,并进行缩放以适应0到1的范围。
这将输出 0 ≤ L ≤ 100 , − 127 ≤ a ≤ 127 , − 127 ≤ b ≤ 127 0 \leq L \leq 100, -127 \leq a \leq 127, -127 \leq b \leq 127 0L100,127a127,127b127。然后,这些值将根据目标数据类型进行转换:

  • 对于8位图像 L = L × 255 100 , a = a + 128 , b = b + 128 L = \frac{L \times 255}{100}, a = a + 128, b = b + 128 L=100L×255,a=a+128,b=b+128
  • 对于16位图像:(目前不支持)
  • 对于32位图像 L , a , b L, a, b L,a,b 保持不变。

在OpenCV中,可以使用以下方式将图像从BGR转换为LAB:

# 将BGR转换为LAB
image_lab = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2LAB)

郁金香COLOR_BGR2LAB

5. YUV颜色空间

YUV颜色空间是一种将亮度(Y)和色度(UV)分离的表示方式。YUV颜色空间的使用可以带来一些优势,例如更好地适应人眼感知、在视频压缩中提供更好的效果等。在视频编码中,通过将图像分为亮度和色度两个分量,可以更高效地压缩视频信息。

YUV颜色空间是一种将亮度(Luminance)和色度(Chrominance)分开表示的颜色空间。在YUV中,Y表示亮度,而UV表示色度。

公式如下:

  • Y(亮度): 表示图像的亮度,即灰度信息。

Y = 0.299 ⋅ R + 0.587 ⋅ G + 0.114 ⋅ B Y = 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B Y=0.299R+0.587G+0.114B

  • U(蓝色色度): 表示蓝色与亮度之间的差异。

U = − 0.14713 ⋅ R − 0.288862 ⋅ G + 0.436 ⋅ B U = -0.14713 \cdot R - 0.288862 \cdot G + 0.436 \cdot B U=0.14713R0.288862G+0.436B

  • V(红色色度): 表示红色与亮度之间的差异。

V = 0.615 ⋅ R − 0.51498 ⋅ G − 0.10001 ⋅ B V = 0.615 \cdot R - 0.51498 \cdot G - 0.10001 \cdot B V=0.615R0.51498G0.10001B

其中,R、G、B分别为图像的红、绿、蓝通道的亮度值。这些系数是根据人眼对不同颜色敏感度的权重而确定的。

在OpenCV中,可以使用以下方式将图像从BGR转换为YUV:

# 将BGR转换为YUV
image_yuv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2YUV)

郁金香COLOR_BGR2YUV


总结

通过本文,我们初步了解了OpenCV的基础知识,包括安装、图像读取与显示、图像存储方式、视频加载与摄像头调用、图像保存以及颜色空间等。这些只是OpenCV功能的冰山一角,它有着更强大的能力,能够支持各种计算机视觉和图像处理任务。在未来的学习中,我们将深入挖掘OpenCV的更多功能和应用。

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

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

相关文章

Win10专业版如何重装-Win10专业版重装系统教程

Win10专业版如何重装&#xff1f;Win10专业版系统能够用户带来丰富的功能服务&#xff0c;用户操作需求轻松得到满足。如果我们在Win10专业版电脑中&#xff0c;遇到了系统问题&#xff0c;这时候可以考虑重新安装Win10专业版系统&#xff0c;从而解决系统出现的问题。下面小编…

gpt-4-vision-preview 识图

这些图片都是流行动画角色的插图。 第一张图片中的角色是一块穿着棕色方形裤子、红领带和白色衬衫的海绵&#xff0c;它站立着并露出开心的笑容。该角色在一个蓝色的背景前&#xff0c;显得非常兴奋和活泼。 第二张图片展示的是一只灰色的小老鼠&#xff0c;表情开心&#xf…

【0235】修改私有内存(private memory)中的MyBEEntry时,st_changecount值前后变化

上一篇: 【0234】PgBackendStatus 记录当前postgres进程的活动状态 1. pg_stat_activity中xxx实时信息如何实现? 客户端(eg:psql)在连接上postmaster之后,postmaster守护进程会fork()一个后端进场(backend process),之后此客户端的所有操作、交互均有此对应的Backen…

WPF 使用.ttf文件中的图标失败

本章讲述问题&#xff1a;WPF 使用.ttf文件中的图标失败&#xff0c;变成白框问题。 在WPF开发过程中&#xff0c;我们需要使用.ttf文件中的图标和文字&#xff0c;但是经常会遇到类似问题&#xff1a;WPF 在XMAL里增加图标字体时没办法实时显示出来只显示一个小方框&#xff0…

公寓水电管理系统

springbootmybatisthymeleaf 这次练习是尝试将layer与系统结合起来&#xff0c;将新增、修改、删除都和弹窗结合起来。 一、需求分析 二、数据库 三、模块 1、登录页面 哈哈哈&#xff0c;之前做的登录页面都好丑&#xff0c;这是目前做的最好看的一次了。 超级管理员&…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

20231117在ubuntu20.04下使用ZIP命令压缩文件夹

20231117在ubuntu20.04下使用ZIP命令压缩文件夹 2023/11/17 17:01 百度搜索&#xff1a;Ubuntu zip 压缩 https://blog.51cto.com/u_64214/7641253 Ubuntu压缩文件夹zip命令 原创 chenglei1208 2023-09-28 17:21:58博主文章分类&#xff1a;LINUX 小工具 文章标签命令行压缩包U…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现&#xff0c;这个领域才开始发生变化。现在&#xff0c;是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

GZ038 物联网应用开发赛题第8套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第8套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考评…

Android Studio Error “Unsupported class file major version 61“---异常信息记录

编译时异常信息 原因及解决办法 问题出在JAVA 17上&#xff0c;并且使用的Gradle JDK是&#xff1a;Android Studio java home版本17.0.1将其更改为&#xff1a;Android Studio默认JDK版本11.0.10 即可解决 操作步骤 1 2 3

uniapp App 端 版本更新检测

function checkVersion() { var req { //升级检测数据 appid: plus.runtime.appid, version: plus.runtime.version }; const timestamp Date.parse(new Date()); config.server.query_news uni.reque…

如何使用ONLYOFFICE来P惊悚特效图

如何使用ONLYOFFICE来P惊悚特效图 老朋友们可能会经常看见本号主又换头像了&#xff0c;各种各样精神分裂成一群人或者我和自己俩个人的头像&#xff0c;之前讲过的&#xff1a; 手把手教你如何自己一个人精神分裂成一群人https://mp.weixin.qq.com/s/yacKt7N3sZnarfMhXRNdBA…

零代码编程:用ChatGPT自动合并多个Word文件

一个文件夹中有多个docx格式的word文档&#xff1a; 想要把它们都合并成一个文件&#xff0c;然后打印&#xff0c;可以在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个处理word内容的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹…

redis实战篇(2)

优惠卷秒杀 通过本章节&#xff0c;我们可以学会Redis的计数器功能&#xff0c; 结合Lua完成高性能的redis操作&#xff0c;同时学会Redis分布式锁的原理&#xff0c;包括Redis的三种消息队列 3、优惠卷秒杀 3.1 -全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢…

EMNLP2023 | 基于显式证据推理的few-shot关系抽取CoT

深度学习自然语言处理 原创作者&#xff1a;wkk 论文&#xff1a;Chain of Thought with Explicit Evidence Reasoning for Few-shot Relation Extraction地址&#xff1a;https://arxiv.org/abs/2311.05922 摘要 Few-shot关系提取涉及使用有限数量的注释样本识别文本中两个特定…

肖sir__linux讲解(2.1)

linux命令 cp 复制命令 a、cp 原文件名称 新文 件名称&#xff08;不存在的文件&#xff09; 案例&#xff1a;cp a k 截图&#xff1a; b.cp 原文件名称 原有文 件名称&#xff08;存在的文件&#xff09; 案例:cp a b 截图&#xff1a; c、cp 指定路径复制 格式&#xff…

目标检测—YOLO系列(二 ) 全面解读论文与复现代码YOLOv1 PyTorch

精读论文 前言 从这篇开始&#xff0c;我们将进入YOLO的学习。YOLO是目前比较流行的目标检测算法&#xff0c;速度快且结构简单&#xff0c;其他的目标检测算法如RCNN系列&#xff0c;以后有时间的话再介绍。 本文主要介绍的是YOLOV1&#xff0c;这是由以Joseph Redmon为首的…

802.1Qbb

[TOC] 802.1Qbb 802.1Qbb是什么&#xff1f; 802.1Qbb&#xff08;基于优先级的流控制&#xff0c;PFC&#xff09;是以太网数据中心中一项重要的标准&#xff0c;用于提供无丢包的网络环境。这项标准是IEEE 802.1Q标准的一部分&#xff0c;旨在解决以太网数据中心网络中的拥…

vue3 + ts项目(无vite)报错记录

记录项目创建后遇到的报错 1.类型“Window & typeof globalThis”上不存在属性“_CONFIG”。ts(2339) 问题描述&#xff1a; 使用全局 window 上自定义的属性&#xff0c;TypeScript 会报属性不存在 解决&#xff1a;需要将自定义变量扩展到全局 window 上&#xff0c…

数据分析场景下,企业如何做好大模型选型和落地?

在数据驱动的数字化时代&#xff0c;有效的数据分析已成为企业成功的关键因素。而随着大模型带来能力突破&#xff0c;让AI与数据分析相互结合&#xff0c;使分析结果更好支撑业务&#xff0c;促进企业内部数据价值释放&#xff0c;成为了当下企业用户尤为关注的话题。 如何按照…