opencv-python笔记(1)
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的区域内均值代表该处像素值
针对边缘点,取边角处。
卷积核:
\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)的更多相关文章
- Python下opencv使用笔记(一)(图像简单读取、显示与储存)
写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大. ...
- Python下opencv使用笔记(图像频域滤波与傅里叶变换)
Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654 收藏 展开 本文转载自 https://blog ...
- 《Mastering Opencv ...读书笔记系列》车牌识别(II)
http://blog.csdn.net/jinshengtao/article/details/17954427 <Mastering Opencv ...读书笔记系列>车牌识别(I ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法
1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- opencv学习笔记D01
目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...
- Python笔记之不可不练
如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
随机推荐
- RabbitMQ基础学习Full版
RabbitMQ 消息队列在软件中的应用场景 异步处理上(优于原先的方式) 为什么优于呢? 首先,通常情况下,如上图我们其实不用消息队列的情况下,其实也可以不用100ms,不用allof即可 那么优势 ...
- MySQL主主同步环境出现1236错误
环境: MySQL 5.7.25 主主架构 故障现象: 发现互相之间的同步均发生异常,两端均出现1236错误,在两个主节点上分别执行show slave status显示的关键信息如下: Master ...
- [JVM]逃逸分析
逃逸分析 JVM的内存分配策略 首先回顾一下JVM的内存分配策略. JVM的内存包括方法区.堆.虚拟机栈.本地方法栈.程序计数器.一般情况下JVM运行时的数据都是存在栈和堆上的.栈用来存放一些基本变量 ...
- Spring Boot 1.5.x 结合 JUnit5 进行接口测试
在Spring Boot 1.5.x中,默认使用Junit4进行测试.而在对Controller进行接口测试的时候,使用 @AutoConfigureMockMvc 注解是不能注入 MockMvc 对 ...
- 鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)
效果图 添加了一个NPC(小红鱼),玩家控制小黄鱼 鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署) 鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制) 鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC) 鸿 ...
- 二进制安装Kubernetes(k8s)v1.29.2
二进制安装Kubernetes(k8s)v1.29.2 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k ...
- HTTP协议发展历程
HTTP协议发展历程 HTTP超文本传输协议是一个用于传输超文本文档的应用层协议,它是为Web浏览器与Web服务器之间的通信而设计的,HTTP协议到目前为止全部的版本可以分为HTTP 0.9.HTTP ...
- win32 - 以编程方式访问远程计算机上的文件
第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式.这是我们需要访问的共享文件夹.(不需要设置everyone权限) 第二步,我们需要为两台在同一domain下的计算机上建立连接. ...
- Java缓存框架整理
Spring Cache 为基于Spring框架的应用提供了一套完整的缓存API抽象,具体的缓存实现可以对接如Ehcache,Redis等. https://docs.spring.io/spring ...
- day03--实际操作演示linux系统挂载过程
# 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...