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(软件…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...