OpenCV图像的基本操作
图像的基本操作(Python)
素材图
P1:die.jpg
P2:cool.jpg
V:rabbit.mp4
, 下载地址
读取展示-图像
import cv2img_1 = cv2.imread('./die.jpg') # default cv2.IMREAD_COLOR
print("die.jpg shape(imread default) : ", img_1.shape) # 展示图像信息 (行,列,颜色通道数)(h,w,c)
cv2.imshow("die default", img_1)img_2 = cv2.imread('./die.jpg', cv2.IMREAD_GRAYSCALE) # 指定为灰度图
print("die.jpg shape(imread gray) : ", img_2.shape) # 展示图像信息 (行,列,颜色通道数)(h,w,c)
cv2.imshow("die gray", img_2)
cv2.imwrite("./grayscale.jpg", img_2) # 保存图像信息img_3 = cv2.imread('./cool.jpg') # default cv2.IMREAD_COLOR
print("cool.jpg shape(imread default) : ", img_3.shape) # 展示图像信息 (行,列,颜色通道数)(h,w,c)
cv2.imshow("cool default", img_3)cv2.waitKey(0) # 单位是毫秒
cv2.destroyAllWindows() # 释放所有窗口
cv2.imshow()
原型:cv2.imshow(winname, mat)
参数:
winname
(窗口名称): 字符串,表示显示窗口的名称。mat
(图像矩阵): 要显示的图像矩阵,通常是一个NumPy数组。
返回值: 无
功能:
cv2.imshow
主要是用于显示图像,而不是播放视频。**当你使用 cv2.imshow
显示视频帧时,它只会显示当前帧,并不会按照视频的原速度播放。**你需要在代码中通过循环读取视频的帧,并将每一帧传递给 cv2.imshow
,以模拟视频的播放效果。
注意: 如果两次imshow的winname相同的话,那将自动关闭前一个窗口。
cv2.waitKey()
原型:cv2.waitKey([delay])
参数:
delay
(延迟时间): 表示等待时间的毫秒数,如果设置为0,表示无限等待用户输入。默认值是0。
返回值:
- 返回按键的 ASCII 值(整数)。如果没有按键被按下,返回-1。
功能:
- 等待用户按下键盘上的按键。
- 在指定的延迟时间内等待用户输入,然后继续执行程序。
cv2.destroyAllWindows()
原型:cv2.destroyAllWindows()
参数: 无
返回值: 无
功能:
- 关闭所有通过
cv2.namedWindow()
或cv2.imshow()
创建的窗口。通常在程序执行的最后调用这个函数,以确保在程序结束时关闭所有图形界面窗口,防止它们在程序退出后仍然保留。
cv2.imread()
原型:cv2.imread(filename [,flags])
参数:
filename
(文件名): 要读取的图像文件的路径。flags
(标志): 可选参数,表示如何读取图像。默认值是cv2.IMREAD_COLOR
,表示以彩色图像的形式读取。可以使用以下常量:cv2.IMREAD_COLOR
: 以彩色图像形式读取(默认值),注:OpenCV读取的图像是BGR格式,而非RGB。cv2.IMREAD_GRAYSCALE
: 以灰度图像形式读取。cv2.IMREAD_UNCHANGED
: 读取包括 alpha 通道在内的所有图像信息。
返回值:
- 读取的图像数据,以
NumPy
数组的形式表示。
功能:
- 读取指定路径下的图像文件,并将其加载到一个
NumPy
数组中,以便在程序中进行处理和分析。
cv2.imwrite()
原型: cv2.imwrite(filename, img [,params])
参数:
filename
(文件名): 要写入的目标文件的路径。img
(图像数据): 要写入文件的图像数据,通常是一个NumPy
数组。params
(可选参数): 写入文件时的附加参数。可以指定图像质量、压缩格式等。
返回值:
- 如果成功写入文件,则返回
True
;否则返回False
。
功能:
- 将图像数据写入指定的文件。
读取展示-视频
import cv2# 打开视频文件
cap = cv2.VideoCapture('./rabbit.mp4')# 检查视频是否成功打开
if not cap.isOpened():print("Error: 无法打开视频文件.")opn = 0
else:opn = 1while opn:# 读取视频帧ret, frame = cap.read()# 检查是否成功读取帧(视频播放完成退出)if not ret:print("Error: 无法读取帧.")break# 转换为灰度帧gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 在窗口中显示帧cv2.imshow('Video Player', gray)# 检查用户是否按下了 'q' 键,如果是则退出循环if cv2.waitKey(25) & 0xFF == 27:break# 释放资源
cap.release()
cv2.destroyAllWindows()
cv2.VideoCapture()
原型:cv2.VideoCapture([filename or index, apiPreference])
参数:
filename
(可选): 视频文件的路径。index
(可选): 摄像头设备的索引号,用于选择要使用的摄像头。通常从0开始递增。apiPreference
(可选): 指定视频捕获 API 的首选项。可以是cv2.CAP_ANY
、cv2.CAP_V4L2
、cv2.CAP_FFMPEG
等。
功能:
- 打开一个视频文件、摄像头或其他图像来源,准备读取帧。
- 提供方法用于从视频源中读取帧,获取视频的参数等信息。
返回值:
-
VideoCapture
对象:一个用于从视频源读取帧的对象。下面介绍该对象常用属性:-
read()
:- 读取视频的下一帧。
- 返回一个布尔值
ret
,表示帧是否成功读取,以及帧的图像数据frame
(视频帧的NumPy
数组)。
ret, frame = cap.read()
-
get(propId)
:- 获取视频的属性值,例如帧的宽度、高度、帧速率等。
propId
是用于指定要获取的属性的标识符。
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
-
set(propId, value)
:- 设置视频的属性值,例如帧的宽度、高度、帧速率等。
propId
是用于指定要设置的属性的标识符,value
是要设置的属性值。
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
-
release()
:- 释放
VideoCapture
对象占用的资源,关闭视频源。
cap.release()
- 释放
-
isOpened()
:- 检查
VideoCapture
对象是否成功打开了视频源。
if not cap.isOpened():print("Error: Could not open video source.")
- 检查
-
cv2.cvtColor()
原型:cv2.cvtColor(src, code)
参数:
src
(源图像): 要进行颜色空间转换的输入图像,通常是一个NumPy
数组。code
(颜色空间转换代码): 指定颜色空间转换的方式,如cv2.COLOR_BGR2GRAY
表示将BGR
彩色图转换为灰度图。- 还有两个可选参数,用于设置输出图像的尺寸、深度、通道数,这里不进行介绍。
返回值:
- 转换后的图像,仍是一个
NumPy
数组。
功能:
- 将输入图像从一个颜色空间转换到另一个颜色空间。
其他:(关于code的其他可选项)
- BGR 转灰度:
cv2.COLOR_BGR2GRAY
- BGR 转HSV:
cv2.COLOR_BGR2HSV
- BGR 转RGB:
cv2.COLOR_BGR2RGB
- 灰度转BGR:
cv2.COLOR_GRAY2BGR
- RGB 转BGR:
cv2.COLOR_RGB2BGR
ROI(感兴趣的范围——裁剪)
图像数据的表示方式:
用 “:” 表示区间(左闭右开)
import cv2
img = cv2.imread('./die.jpg')
print(img.shape) #(40, 240, 3)# 取三维矩阵的前一行、前两列、深度为all
print(img[0:1, 0:2], "\n")
# [[[40 39 83] [[[BGR][BGR] ] ]
# [39 38 82]]] 三维 —— 图像(r * w) * BGR(h = 3)# 取三维矩阵的前一行、前两列、深度为0
print(img[0:1, 0:2, 0], "\n")
# [[40 39]] 二维 (r * w) 仅显示BGR其中之一(B)print(img[0:1, 0:2, 1], "\n")
# [[39 38]] 仅显示(G)print(img[0:1, 0:2, 2], "\n")
# [[83 82]] 仅显示(R)
查看图像指定区域(imshow时可实现裁剪效果):
import cv2
img = cv2.imread('./die.jpg')
print(img.shape)cv2.imshow("image", img)
cv2.imshow("cut", img[50:150, 0:200])cv2.waitKey(0)
cv2.destroyAllWindows()
提取/合并 图像的R、G、B
import cv2img = cv2.imread('./die.jpg')# 提取 如果直接show相当于灰度图像,把颜色值当作亮度
img_B = img[:, :, 0]
img_G = img[:, :, 1]
img_R = img[:, :, 2]
# 合并 合并时要注意维度保持一致
img_T = cv2.merge((img_B, img_G, img_R))
置空通道 (e.g只保留R通道)
import cv2img = cv2.imread('./die.jpg')img_T = img.copy()img_T[:, :, 0] = 0 # 置空 B 通道
img_T[:, :, 1] = 1 # 置空 G 通道cv2.imshow("img_T", img_T)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.merge()
原型:cv2.merge(mv[, dst])
参数:
mv
:包含要合并的图像通道的序列(例如,一个包含三个通道的元组或列表)。dst
:输出图像,可选。
返回值:
如果指定了 dst
参数,则返回输出图像 dst
;否则,返回合并后的图像。
功能:
cv2.merge
函数用于将多个单通道的图像合并成一个多通道的图像。通常,在图像处理中,图像被拆分为单个通道进行处理,然后再合并回来。mv
参数是一个包含要合并的图像通道的序列,通常是一个包含多个单通道图像的元组或列表。在合并时要注意每个通道的尺寸和数据类型保持一致,并注意通道的顺序。
关于dst参数
手动指定 dst
和使用返回值接收的主要区别在于对输出图像的处理和内存管理
手动指定 dst
:
- 如果你手动指定了
dst
,则你需要提前创建一个多通道的数组,用于存储合并后的结果。这样可以避免在函数内部创建新的数组,有助于更好地控制内存的分配和释放。 - 通过手动指定
dst
,你可以在函数调用之后继续使用这个数组,而不需要将它的内容复制到其他数组中。
使用返回值接收:
- 如果你使用返回值接收合并后的结果,那么函数会在内部创建一个新的多通道数组,并将合并后的图像存储在其中。这个新数组将作为函数的返回值返回。
- 使用返回值接收合并后的图像时,你不需要提前创建输出数组,但需要注意新数组的内存管理。你可能需要确保及时释放不再需要的内存,以避免内存泄漏。
在实际应用中,选择手动指定 dst
还是使用返回值接收通常取决于对内存和代码结构的特定需求。如果你有特定的内存管理需求或者想要更好地控制输出数组的生命周期,那么手动指定 dst
可能更为合适。否则,使用返回值接收通常更为简便。
缩放&融合
import cv2img1 = cv2.imread('./die.jpg')
img2 = cv2.imread('./cool.jpg')# 两张图片尺寸不一致不能进行计算(融合)
print(img1.shape) # (240, 240, 3)
print(img2.shape) # (1000, 1000, 3)img2_T = cv2.resize(img2, (240, 240))res = cv2.addWeighted(img1, 0.4, img2_T, 0.6, 0)cv2.imshow("blend", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
按缩放因子进行scale
import cv2img = cv2.imread('./die.jpg')
print(img.shape) # (240, 240, 3)# 将y坐标拉伸2倍数,x不变
img_T = cv2.resize(img, (0, 0), fx=1, fy=2)
print(img.shape) # (240, 240, 3)cv2.imshow("img", img)
cv2.imshow("scale", img_T)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.resize()
原型:cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数:
-
src
: 输入图像。 -
dsize
: 输出图像的大小,可以是元组(width, height)
或者None
。 -
dst
: 输出图像,可选。 -
fx
: 沿水平轴的缩放因子,可选。 -
fy
: 沿垂直轴的缩放因子,可选。 -
interpolation
: 插值方法,用于图像的缩放。默认为cv2.INTER_LINEAR
。常见的插值方法包括:
cv2.INTER_NEAREST
: 最近邻插值cv2.INTER_LINEAR
: 线性插值(默认)cv2.INTER_CUBIC
: 三次样条插值cv2.INTER_AREA
: 区域插值
返回值:
- 返回缩放后的图像。
功能:
- 该函数用于调整图像大小,可以进行放大或缩小。可以通过指定输出图像的大小 (
dsize
) 或者缩放因子 (fx
,fy
) 来控制缩放的程度。
cv2.addWeighted()
函数原型:cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
参数:
src1
:第一个输入图像。alpha
:src1
的权重。src2
:第二个输入图像。beta
:src2
的权重。gamma
:添加到每个和的标量值,用于调整输出图像的亮度。dst
:输出图像,可选。dtype
:输出图像的数据类型,可选。
返回值:
- 如果指定了
dst
参数,则返回输出图像dst
;否则,返回合并后的新图像。
功能:
cv2.addWeighted
函数用于将两个图像线性组合,即按照一定的权重相加。具体而言,它的计算公式为:
d s t = s r c 1 × a l p h a + s r c 2 × b e t a + g a m m a dst=src1×alpha+src2×beta+gamma dst=src1×alpha+src2×beta+gamma
- 这个函数在图像混合、图像融合、对比度调整等方面非常有用。例如,可以使用
cv2.addWeighted
将两个图像按照一定的比例融合,调整图像的对比度和亮度。
数值计算
cv2.add()
img1 = img1 + 5 # 每个像素值都增加了5
imgT = img2 + img1 # img1 的每个像素值都与相应位置上的 img2 的像素值相加# 因为每个值都是uint8,所以可能会出现越界溢出的情况(%256)
# cv2.add() 可以实现饱和截断(溢出时会保持在255)
cv2.add(img1,img2)
matplotlib.pyplot绘制子图
import cv2
import matplotlib.pyplot as plt
import numpy as np # 暂时没用到# 读取图像
img1 = cv2.imread('./die.jpg')
img2 = cv2.imread('./grayscale.jpg')
img3 = cv2.imread('./cool.jpg')# 使用Matplotlib显示不同边界填充方式的图像(221: 2*2的网格的第1个位置)
plt.subplot(221), plt.imshow(img1), plt.title('die')
plt.subplot(222), plt.imshow(img2), plt.title('grayscale')
plt.subplot(223), plt.imshow(img3), plt.title('cool')plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
边界填充
import cv2
import matplotlib.pyplot as plt
import numpy as np # 暂时没用到# 读取图像
img = cv2.imread('./die.jpg')# 定义上、下、左、右填充的大小
top_size, bottom_size, left_size, right_size = (70, 70, 70, 70)# 使用不同的边界填充方式生成新的图像
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=0)# 使用Matplotlib显示不同边界填充方式的图像(231: 2*3的网格的第1个位置)
plt.subplot(231), plt.imshow(img), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant), plt.title('CONSTANT')# 显示图像
plt.show()# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
cv2.copyMakeBorder()
函数原型:cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])
参数:
src
:输入图像。top
、bottom
、left
、right
:指定在每个边界添加的像素数。borderType
:- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常数值填充。
dst
:输出图像,可选。value
:当borderType
为cv2.BORDER_CONSTANT
时使用的边界常数。
返回值:
- 如果指定了
dst
参数,则返回输出图像dst
;否则,返回添加边界后的新图像。
功能:
-
cv2.copyMakeBorder
函数用于在图像的四个边界上添加边界。你可以指定要添加的像素数以及边界的类型。不同的borderType
选项会导致不同的边界填充方式。 -
这个函数在图像处理中常用于图像扩展、填充以及处理边界条件的情况,例如在进行卷积运算时。
Numpy
.shape
shape
是 NumPy
数组的一个属性。在 NumPy
中,shape
用于获取数组的维度信息。
示例:array.shape
返回值:
- 一个元组(tuple),表示数组的维度。
功能:
- 提供数组的维度信息,以元组的形式返回。
- 对于二维数组,返回的元组包含两个元素,表示行数和列数;对于三维数组,包含三个元素,以此类推。
.copy()
在NumPy
中,copy()
方法用于创建数组的副本(复制)。这个方法返回一个新的数组对象,该对象是原始数组的完整副本,包括数据和属性。这意味着对新数组的任何更改都不会影响原始数组,反之亦然。
相关文章:

OpenCV图像的基本操作
图像的基本操作(Python) 素材图 P1:die.jpg P2:cool.jpg V:rabbit.mp4, 下载地址 读取展示-图像 import cv2img_1 cv2.imread(./die.jpg) # default cv2.IMREAD_COLOR print("die.jpg shape(imre…...

小白水平理解面试经典题目LeetCode 594 Longest Harmonious Subsequence(最大和谐字符串)
594 最大和谐字符串 这道题属于字符串类型题目,解决的办法还是有很多的,暴力算法,二分法,双指针等等。 题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在,给你一个整数数组 nums …...

Vue-35、Vue中使用ref属性
1、ref属性 2、代码 <template><div id"app"> <!-- <img alt"Vue logo" src"./assets/logo.png">--><h1 v-text"msg" ref"title"></h1><button click"showDOM" ref&…...

网络通信(15)-C#TCP客户端掉线重连实例
本文上接前面的文章使用Socket在C#语言环境下完成TCP客户端的掉线重连实例。 掉线重连需要使用心跳包发送测试网络的状态,进而进入重连循环线程。 前面实例完成的功能: 客户端与服务器连接,实现实时刷新状态。 客户端接收服务器的数据。 客户端发送给服务器的数据。 客…...

React进阶 - 14(说一说”虚拟DOM“中的”Diff算法“)
本章内容 目录 一、了解 Diff 算法二、key 值的重要性三、为什么不建议使用 index 做 key 值 上一节我们初步了解了 React中的”虚拟 DOM“ ,本节我们来说一说”虚拟DOM“中的”Diff算法“ 一、了解 Diff 算法 在上一篇中,我们有讲到:当 st…...

#GPU|LLM|AIGC#集成显卡与独立显卡|显卡在深度学习中的选择与LLM GPU推荐
区别 核心区别:显存,也被称作帧缓存。独立显卡拥有独立显存,而集成显卡通常是没有的,需要占用部分主内存来达到缓存的目的 集成显卡: 是集成在主板上的,与主处理器共享系统内存。 一般会在很多轻便薄型的…...

HCIP-IPV6实验
实验拓扑 实验需求 全网可达 实验思路 配置IP地址 配置路由协议-ospf 配置R2 配置IPV6 配置R2Tunnel 将所有地址引流到Tunnel0/0/0接口 ripng配置 汇总 实验步骤 配置IP地址 以R2为例 [Huawei]sys r2 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip address 12.1.1…...

如何训练和导出模型
介绍如何通过DI-engine使用DQN算法训练强化学习模型 一、什么是DQN算法 DQN算法,全称为Deep Q-Network算法,是一种结合了Q学习(一种价值基础的强化学习算法)和深度学习的算法。该算法是由DeepMind团队在2013年提出的,…...

Springboot注解@Aspect(一)之@Aspect 作用和Aop关系详解
目录 Aspect的使用 配置 作用 通知相关的注解 例子 结果: Aspect作用和Spring Aop关系 示例 标签表达式 Aspect的使用 配置 要启用 Spring AOP 和 Aspect 注解,需要在 Spring 配置中启用 AspectJ 自动代理,但是在 Spring Boot 中&a…...

自动化防DDoS脚本
简介 DDoS (分布式拒绝服务攻击)是一种恶意的网络攻击,旨在通过占用目标系统的资源,使其无法提供正常的服务。在DDoS攻击中,攻击者通常控制大量的被感染的计算机或其他网络设备,同时将它们协调起来向目标系…...
ubuntu怎么查看有几个用户
在Ubuntu中,可以使用以下命令来查看系统中的用户数量: cat /etc/passwd | wc -l这个命令会读取 /etc/passwd 文件中的用户信息,并使用 wc -l 命令来计算行数,即用户数量。 另外,你也可以使用以下命令来查看当前登录到…...

Linux | makefile简单教程 | Makefile的工作原理
前言 在学习完了Linux的基本操作之后,我们知道在linux中编写代码,编译代码都是要手动gcc命令,来执行这串代码的。 但是我们难道在以后运行代码的时候,难道都要自己敲gcc命令嘛?这是不是有点太烦了? 在vs中…...

pcl+vtk(十四)vtkCamera相机简单介绍
一、vtkCamera相机 人眼相当于三维场景下的相机, VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如屏幕、图像等。 相机位置:即相机所在的位置,用方法vtkCamera::SetPosition()设置。 相…...

TS基础知识点快速回顾(上)
基础介绍 什么是 TypeScript? TypeScript,简称 ts,是微软开发的一种静态的编程语言,它是 JavaScript 的超集。 那么它有什么特别之处呢? js 有的 ts 都有,所有js 代码都可以在 ts 里面运行。ts 支持类型支持&#…...
hook(post-receive)无法使用
hook(post-receive)无法使用 为什么无法使用? 只有一个问题:权限不够,你想想,blog.git是一个中转站,咱们要把上传的东西转到blog下面,肯定要有写入操作呀,这个Git仓库的…...

qt学习:tcp区分保存多个客户端
在前面文掌的tcp客服端服务端进行更改 qt学习:Network网络类tcp客户端tcp服务端-CSDN博客https://blog.csdn.net/weixin_59669309/article/details/135842933?spm1001.2014.3001.5501前面的服务端每次有新的客户端连接,就会覆盖掉原来的指针࿰…...

ORM-08-EclipseLink 入门介绍
拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.(手写简易版 mybatis) 1. EclipseLink概述 本章介绍了EclipseLink及其关键特性:包括在EclipseLink中的组件、元数据、应用程序架构、映射和API。 本…...

数据结构之树和二叉树定义
数据结构之树和二叉树定义 1、树的定义2、树的基本概念3、二叉树的定义 数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以…...

大模型学习与实践笔记(十三)
将训练好的模型权重上传到 OpenXLab 方式1: 先将Adapter 模型权重通过scp 传到本地,然后网页上传 步骤1. scp 到本地 命令为: scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…...

计算机网络——网络层(1)
计算机网络——网络层(1) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层:数据平面网络层概述核心功能协议总结 路由器工作原理路由器的工作步骤总结 网际协议IPv4主要特点不足IPv6主要特点现状 通用转发和SDN通用转发SDN(软件…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...