openCV笔记

图像

灰度图像

​ 0代表纯黑色,255代表白色(类似亮度)

通道拆分

通过索引拆分:
import cv2
lena=cv2.imread("lenacolor.png")
cv2.imshow("lena1",lena)
b=lena[:,:,0]
g=lena[:,:,1]
r=lena[:,:,2]
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
lena[:,:,0]=0
cv2.imshow("lenab0",lena)
lena[:,:,1]=0
cv2.imshow("lenab0g0",lena)
cv2.waitKey()
cv2.destroyAllWindows()
通过cv2.split()函数拆分:
import cv2
lena=cv2.imread("lenacolor.png")
b,g,r=cv2.split(lena)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()

图像属性

获取图像属性

shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或 者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一 幅图像是灰度图像(或二值图像)还是彩色图像。

size:返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道 数为 1。

dtype:返回图像的数据类型。

如:

import cv2
gray=cv2.imread("lena.bmp",0)
color=cv2.imread("lenacolor.png")
print("图像 gray 属性:")
print("gray.shape=",gray.shape)
print("gray.size=",gray.size)
print("gray.dtype=",gray.dtype)
print("图像 color 属性:")
print("color.shape=",color.shape)
print("color.size=",color.size)
print("color.dtype=",color.dtype)
重置图像属性
import cv2 as cv

# 读入原图片
img = cv.imread('test.jpg')
# 打印出图片尺寸
print(img.shape)
# 将图片高和宽分别赋值给x,y
x, y = img.shape[0:2]
# 显示原图
cv.imshow('OriginalPicture', img)
# 缩放到原来的二分之一,输出尺寸格式为(宽,高)
img_test1 = cv.resize(img, (int(y / 2), int(x / 2)))
cv.imshow('resize0', img_test1)
cv.waitKey() # 最近邻插值法缩放
# 缩放到原来的四分之一
img_test2 = cv.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv.INTER_NEAREST)
cv.imshow('resize1', img_test2)
cv.waitKey()
cv.destroyAllWindows()

图像运算

图像相加

直接加法运算:a+b=mod(a+b,256)

使用cv2.add:大于255则饱和

图像加权:使用cv2.addWeighted函数

​ dst=cv2.addWeighted(src1, alpha, src2, beta, gamma),其中gamma为亮度调节

图像位运算

按位与

​ dst = cv2.bitwise_and( src1, src2[, mask]] )

· 其中mask表示可选操作掩码,即指定要更改的输出数组的元素,也即输出图像像素只有mask对应位置元素不为0的部分才输出,否则 该位置像素的所有通道分量都设置为0

按位或

​ dst = cv2.bitwise_or( src1, src2[, mask]] )

按位非

​ dst = cv2.bitwise_not( src[, mask]] )

按位异或(与二进制加法类似)

​ dst = cv2.bitwise_xor( src1, src2[, mask]] )

位平面分解

提取某个位平面:
import cv2
import numpy as np i = 5 #提取第五位平面
rose = cv2.imread("Rose.jpg",0)
x = np.ones(rose.shape, dtype=np.uint8)*(2**i)
result = cv2.bitwise_and(rose, x)
cv2.imshow("img",result)
cv2.waitKey(0)
提取位平面并进行阈值处理:
import cv2
import numpy as np img = cv2.imread("1.jpg", 0)
cv2.imshow("rose",img)
r, c = img.shape
x = np.zeros((r, c, 8), dtype=np.uint8) #提取矩阵
for i in range(8):
x[:, :, i] = 2 ** i
r = np.zeros((r, c, 8), dtype=np.uint8) #存放8个位平面
for i in range(8):
r[:, :, i] = cv2.bitwise_and(img, x[:, :, i]) #提取位平面
img2 = cv2.bitwise_xor(r[:,:,6],r[:,:,7])
mask = r[:, :, i] > 0 #阈值处理
r[mask] = 255
mask = img2[:,:]>0
img2[mask] = 255
cv2.imshow("img",img2)
cv2.imshow("img0",r[:,:,7])
cv2.waitKey()

色彩空间

色彩空间基础

GRAY色彩空间

GRAY(灰度图像)通常指 8 位灰度图,其具有 256 个灰度级,像素值的范围是[0,255]。 当图像由 RGB 色彩空间转换为 GRAY 色彩空间时,其处理方式如下:

Gray = 0.299 · + 0.587 · + 0.114 ·

上述是标准的转换方式,也是 OpenCV 中使用的转换方式。有时,也可以采用简化形式完 成转换:

Gray = ( + + ) / 3

当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的,其处理方式如下:

= Gray

= Gray

= Gray

HSV色彩空间

分为色调,饱和度,亮度

色调环:

​ 0 红色

​ 60 黄色

​ 120 绿色

​ 180 青色

​ 240 蓝色

​ 300 品红色

在openCV中需要将色调值除以2来适应uint8存储类型

色彩空间的转换

调用cv2.cvtColor()函数

dst = cv2.cvtColor( src, code [, dstCn] )

式中:

· dst 表示输出图像,与原始输入图像具有同样的数据类型和深度。

· src 表示原始输入图像。可以是 8 位无符号图像、16 位无符号图像,或者单精度浮点数等。

· code 是色彩空间转换码,表 4-2 展示了其枚举值。

· dstCn 是目标图像的通道数。如果参数为默认的 0,则通道数自动通过原始输入图像和 code 得到

HSV色彩空间及其应用

H:色调,Hue

S:饱和度,Saturation

V:亮度,Value

色调

openCV中,色调值如下:

0 红色

30 黄色

60 绿色

90 青色

120 蓝色

150 品红色

饱和度:

​ 原值为[0,1],映射到openCV中为[0,255]

​ 灰度颜色R,G,B是相等的,故饱和度值为0

​ 若颜色饱和度很低,那么其计算得出的色调值就不可靠

亮度

​ 同样的,[0,1] —> [0,255]

标记指定颜色

颜色的差异主要体现在 H 通道值的不同上。所以,通过对 H 通道值进行筛选,便能够筛选出 特定的颜色。

我们可以通过cv2.inRange()函数来锁定特征值:

dst = cv2.inRange( src, lowerb, upperb )

其中:

· dst 表示输出结果,大小和 src 一致。

· src 表示要检查的数组或图像。

· lowerb 表示范围下界。

· upperb 表示范围上界。

· 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。

· 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。(即作为掩图)

通过基于掩码的按位与显示ROI
import cv2
import numpy as np img = cv2.imread("Rose.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 转成HSV格式
minRed = np.array([-10, 100, 100])
maxRed = np.array([10, 255, 255]) # 设置颜色范围
mask = cv2.inRange(img_hsv, minRed, maxRed) # 获得掩码
Red = cv2.bitwise_and(img, img, mask= mask) # 锁定红色区域
cv2.imshow("red",Red)
cv2.waitKey(0)
通道融合函数

cv2.merge(mv[, dst])

如:

import cv2
img=cv2.imread("barbara.bmp")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h,s,v=cv2.split(hsv)
v[:,:]=255
newHSV=cv2.merge([h,s,v])
art = cv2.cvtColor(newHSV, cv2.COLOR_HSV2BGR)
cv2.imshow("img",img)
cv2.imshow("art",art)
cv2.waitKey()
cv2.destroyAllWindows()
alpha通道

alpha通道一般代表透明度的值,取值为[0,255],表示从透明到不透明。

加入alpha通道的图像格式为BGRA。

例程:

import cv2
import numpy as np img = cv2.imread("Rose.jpg")
img_bgra = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA) # 转成BGRA格式
b,g,r,a = cv2.split(img_bgra)
a[:,:] = 0
new = cv2.merge([b,g,r,a])
cv2.imshow("red",new)
cv2.waitKey(0)

几何变换

缩放

dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )

其中:

  • dst 代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时), 或者可以通过 src.size()、fx、fy 计算得到。
  • src 代表需要缩放的原始图像。
  • dsize 代表输出图像大小。
  • fx 代表水平方向的缩放比例。
  • fy 代表垂直方向的缩放比例。
  • interpolation 代表插值方式。(默认双线性插值)

例程:

import cv2
import numpy as np
img=np.ones([2,4,3],dtype=np.uint8)
size=img.shape[:2]
rst=cv2.resize(img,size)
print("img.shape=\n",img.shape)
print("img=\n",img)
print("rst.shape=\n",rst.shape)
print("rst=\n",rst)

翻转

函数:dst = cv2.flip( src, flipCode )

其中:

  • dst 代表和原始图像具有同样大小、类型的目标图像。
  • src 代表要处理的原始图像。
  • flipCode 代表旋转类型,如下:

0代表绕着x轴翻转

正数代表绕y轴翻转(镜像)

负数代表绕x,y同时翻转(旋转180°)

仿射,透视

感觉用不太到,没看

重映射

表示把一幅图像内的像素点放置到另外一幅图像内的指定位置。

函数:dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]]

其中:

  • dst 代表目标图像,它和 src 具有相同的大小和类型。

  • src 代表原始图像。

  • map1 参数有两种可能的值:

    • 表示(x,y)点的一个映射。
    • 表示 CV_16SC2 , CV_32FC1, CV_32FC2 类型(x,y)点的 x值。
  • map2 参数同样有两种可能的值:

    • 当 map1 表示(x,y)时,该值为空。
    • 当 map1 表示(x,y)点的 x 值时,该值是 CV_16UC1, CV_32FC1 类型(x,y)点的 y 值。
  • Interpolation 代表插值方式,这里不支持 INTER_AREA 方法。

  • borderMode 代表边界模式。当该值为 BORDER_TRANSPARENT 时,表示目标图像内 的对应源图像内奇异点(outliers)的像素不会被修改。

  • borderValue 代表边界值,该值默认为 0。

不细嗦了。

阈值处理

直白的说,就是将大于某个值设为255,低的就设为0。

函数:

cv2.threshold()

cv2.adaptiveThreshold()

threshold函数

retval, dst = cv2.threshold( src, thresh, maxval, type )

式中:

  • retval 代表返回的阈值。
  • dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
  • src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
  • thresh 代表要设定的阈值。
  • maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值。
  • type 代表阈值分割的类型

cv2.THRESH_BINARY

大于thresh,设置为最大值,小于则为0

例:

import cv2
import numpy as np img = cv2.imread("Alice1.jpg",0)
x,y = img.shape[0:2]
t,img_bina = cv2.threshold(img,120,255,cv2.THRESH_BINARY)
new = cv2.resize(img_bina,(int(1/3*x),int(1/2*y)))
cv2.imshow("new",new)
cv2.waitKey(0)

cv2.THRESH_BINARY_INV

没啥,就反相。

其他的就不细嗦了

自适应阈值处理

dst = cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )

式中:

  • dst 代表自适应阈值处理结果。
  • src 代表要进行处理的原始图像。需要注意的是,该图像必须是 8 位单通道的图像。
  • maxValue 代表最大值。
  • adaptiveMethod 代表自适应方法。
  • thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV 中的一个。
  • blockSize 代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为 3、5、 7 等。
  • C 是常量。

其中自适应方法:

  • cv2.ADAPTIVE_THRESH_MEAN_C:领域内所有像素点权值一样
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通 过高斯方程得到各个点的权重值

例:

import cv2
import numpy as np img = cv2.imread("Alice1.jpg",0)
x,y = img.shape[0:2]
img_bina = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,17,3)
new = cv2.resize(img_bina,(int(1/3*x),int(1/2*y))) #缩放,更方便观察效果
cv2.imshow("new",new)
cv2.waitKey(0)

Otsu处理

简单来说,就是让opencv帮你算thresh。

食用方法:

t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

注意:

  • 设置的thresh要为0
  • 后面加上cv2.THRESH_OTSU方案

图像平滑处理

图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。

取近似值的主要方式:

  • 均值滤波
  • 方波滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波
  • 2D卷积

均值滤波

用周围n*n的区域内均值代表该处像素值

针对边缘点,取边角处。

卷积核:

\[K=
\frac{1}{M*N}
\begin{bmatrix}
1 \ 1\ 1\ ... \ 1\ 1\\
1 \ 1\ 1\ ... \ 1\ 1\\
.. \ ..\ .. \ .. \ .\\
1 \ 1\ 1\ ... \ 1\ 1\\
\end{bmatrix}
\]

式中,M 和 N 分别对应高度和宽度。一般情况下,M 和 N 是相等的,例如比较常用的 3×3、5×5、 7×7 等。如果 M 和 N 的值越大,参与运算的像素点数量就越多,图像失真越严重。

把卷积核的元素与待处理区域计算即可获得最终值

编程实现

函数语法:

dst = cv2.blur( src, ksize, anchor, borderType )

  • ksize 是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。 例如,其值可以为(5, 5),表示以 5×5 大小的邻域均值作为图像均值滤波处理的结果,。
  • anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
  • borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下不需要考虑该值的取值,直接采用默认值即可。

其一般形式为:

dst = cv2.blur( src, ksize,)

例:

import cv2
import numpy as np img = cv2.imread("AliceNoise.jpg",0)
img_blur = cv2.blur(img,(6,6))
x,y = img_blur.shape[:2]
new = cv2.resize(img_blur,(int(1/3*x),int(1/2*y))) #缩放,更方便观察效果
cv2.imshow("new",new)
cv2.waitKey(0)

方框滤波

基本原理

在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择 滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

函数实现

函数语法:

dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )

其中:

  • ddepth 是处理结果图像的图像深度,一般使用-1 表示与原始图像使用相同的图像深度。
  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以 3×3 大小的邻域均值作为图像均值滤波处理的结果
  • anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
  • normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围 内的值)处理,该参数是一个逻辑值,可能为真(值为 1)或假(值为 0)。
    • 当参数 normalize=1 时,表示要进行归一化处理,要用邻域像素值的和除以面积。
    • 当参数 normalize=0 时,表示不需要进行归一化处理,直接使用邻域像素值的和。

常用形式:

dst = cv2.boxFilter( src, ddepth, ksize )

高斯滤波

在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将 中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

函数语法

dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

其中

  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,滤波核的值必须是奇数
  • sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。
  • sigmaY 是卷积核在垂直方向上(Y 轴方向)的标准差。如果将该值设置为 0,则只采用 sigmaX 的值;如果 sigmaX 和 sigmaY 都是 0,则通过 ksize.width 和 ksize.height 计算得到。
    • sigmaX = 0.3×[(ksize.width-1)×0.5 -1] + 0.8
    • sigmaY = 0.3×[(ksize.height-1)×0.5-1] + 0.8

例:

import cv2
import numpy as np img = cv2.imread("Alice1.jpg")
# img_blur = cv2.blur(img,(6,6))
img_blur = cv2.GaussianBlur(img,(7,7),0,0)
x,y = img_blur.shape[:2]
new = cv2.resize(img_blur,(int(1/3.5*x),int(1/2*y))) #缩放,更方便观察效果
cv2.imshow("new",new)
cv2.waitKey(0)

中值滤波

中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻 域内所有像素值的中间值来替代当前像素点的像素值。

函数实现

dst = cv2.medianBlur( src, ksize)

其中:

  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,核大小必须是比 1 大的奇数,比如 3、5、7 等。

在中值滤波处理中,噪声成分很难被选上,所以可以在几乎不影响原有图像的情 况下去除全部噪声。但是由于需要进行排序等操作,中值滤波需要的运算量较大

例:

import cv2
import numpy as np img = cv2.imread("AliceNoise.jpg")
img_blur = cv2.medianBlur(img,3)
img_blur = cv2.GaussianBlur(img_blur,(3,3),0,0)
x,y = img_blur.shape[:2]
new = cv2.resize(img_blur,(int(1/3.5*x),int(1/2*y))) #缩放,更方便观察效果
cv2.imwrite("Alice2.jpg",img_blur)
cv2.imshow("new",new)
cv2.waitKey(0)

双边滤波

双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。

算法思想

在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为 0,直接忽略该点),这样就保护了边缘信息。

函数语法

dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType )

其中:

  • d 是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度 较慢。因此,在实时应用中,推荐 d=5。对于较大噪声的离线滤波,可以选择 d=9。
  • sigmaColor 是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的 滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为 0 时,滤波失去意义;该值为 255 时,指定直径内的所有点都能够参与运算。
  • sigmaSpace 是坐标空间中的 sigma 值。它的值越大,说明有越多的点能够参与到滤波计 算中来。当 d>0 时,无论 sigmaSpace 的值如何,d 都指定邻域大小;否则,d 与 sigmaSpace 的值成比例。
  • borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。

2D卷积

说白了,自定义卷积核

dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType )

其中:

  • kernel 是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不 同的核,则必须将彩色图像分解后使用不同的核完成操作。
  • delta 是修正值,它是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果。

opencv-python笔记(1)的更多相关文章

  1. Python下opencv使用笔记(一)(图像简单读取、显示与储存)

    写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大. ...

  2. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

  3. 《Mastering Opencv ...读书笔记系列》车牌识别(II)

    http://blog.csdn.net/jinshengtao/article/details/17954427   <Mastering Opencv ...读书笔记系列>车牌识别(I ...

  4. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  5. OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  6. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  7. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  8. opencv学习笔记D01

    目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...

  9. Python笔记之不可不练

    如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...

  10. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

随机推荐

  1. RabbitMQ基础学习Full版

    RabbitMQ 消息队列在软件中的应用场景 异步处理上(优于原先的方式) 为什么优于呢? 首先,通常情况下,如上图我们其实不用消息队列的情况下,其实也可以不用100ms,不用allof即可 那么优势 ...

  2. MySQL主主同步环境出现1236错误

    环境: MySQL 5.7.25 主主架构 故障现象: 发现互相之间的同步均发生异常,两端均出现1236错误,在两个主节点上分别执行show slave status显示的关键信息如下: Master ...

  3. [JVM]逃逸分析

    逃逸分析 JVM的内存分配策略 首先回顾一下JVM的内存分配策略. JVM的内存包括方法区.堆.虚拟机栈.本地方法栈.程序计数器.一般情况下JVM运行时的数据都是存在栈和堆上的.栈用来存放一些基本变量 ...

  4. Spring Boot 1.5.x 结合 JUnit5 进行接口测试

    在Spring Boot 1.5.x中,默认使用Junit4进行测试.而在对Controller进行接口测试的时候,使用 @AutoConfigureMockMvc 注解是不能注入 MockMvc 对 ...

  5. 鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)

    效果图 添加了一个NPC(小红鱼),玩家控制小黄鱼 鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署) 鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制) 鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC) 鸿 ...

  6. 二进制安装Kubernetes(k8s)v1.29.2

    二进制安装Kubernetes(k8s)v1.29.2 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k ...

  7. HTTP协议发展历程

    HTTP协议发展历程 HTTP超文本传输协议是一个用于传输超文本文档的应用层协议,它是为Web浏览器与Web服务器之间的通信而设计的,HTTP协议到目前为止全部的版本可以分为HTTP 0.9.HTTP ...

  8. win32 - 以编程方式访问远程计算机上的文件

    第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式.这是我们需要访问的共享文件夹.(不需要设置everyone权限) 第二步,我们需要为两台在同一domain下的计算机上建立连接. ...

  9. Java缓存框架整理

    Spring Cache 为基于Spring框架的应用提供了一套完整的缓存API抽象,具体的缓存实现可以对接如Ehcache,Redis等. https://docs.spring.io/spring ...

  10. day03--实际操作演示linux系统挂载过程

    # 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...