30min 的OpenCV learning Note
1.安装python和pycharm与环境搭配
打开Windows终端:(win+R)(一般使用清华镜像网站安装库比较快)
pip install opencv-contrib-python -i https://pypi.mirrors.ustc.edu.cn/simple
或者
python -m pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
2.基础操作学习
库函数:import cv2;import numpy
代码解释:
ONE(打开,图像大小与窗口):
1. print(cv2.getVersionString())
-
作用:打印当前安装的OpenCV库的版本号。这对于调试和确保你的代码与特定版本的OpenCV兼容非常有用。
-
函数格式:
cv2.getVersionString()
是一个无参数的函数,它返回一个字符串,表示安装的OpenCV库的版本号。
2. image = cv2.imread("opencv_logo.jpg")
-
作用:从指定路径加载图像文件。如果文件成功读取,图像数据将被存储在变量
image
中;如果文件不存在或无法读取,image
将被设置为None
。 -
函数格式:
cv2.imread(filepath, flags=cv2.IMREAD_COLOR)
-
filepath
:图像文件的路径。 -
flags
(可选):指定如何读取图像。常用的值有:-
cv2.IMREAD_COLOR
:加载彩色图像。任何图像的透明度都会被忽略(这是默认值)。 -
cv2.IMREAD_GRAYSCALE
:以灰度模式加载图像。 -
cv2.IMREAD_UNCHANGED
:包括alpha通道的加载图像。
-
-
3. print(image.shape)
-
作用:打印图像的形状。对于彩色图像,这将是一个包含三个元素的元组,分别表示图像的高度、宽度和颜色通道数(对于BGR图像,通道数为3)。如果图像是灰度图,则只包含两个元素:高度和宽度。
-
说明:这一步有助于了解图像的尺寸和是否成功加载(如果
image
是None
,尝试访问.shape
会引发错误)。
4. cv2.imshow("image", image)
-
作用:在一个窗口中显示图像。窗口的标题由第一个参数指定,图像数据由第二个参数提供。
-
函数格式:
cv2.imshow(winname, mat)
-
winname
:窗口的名称,是一个字符串。 -
mat
:要显示的图像。它应该是uint8或float32类型的numpy数组。
-
5. cv2.waitKey()
-
作用:等待用户按键。这个调用是必需的,以便
cv2.imshow()
创建的窗口能够保持打开状态,直到用户按下任意键。 -
函数格式:
cv2.waitKey([delay])
-
delay
(可选):等待键盘事件的时间(以毫秒为单位)。如果参数是0,则无限期等待键盘事件。
-
注意:在程序结束时,通常还需要调用cv2.destroyAllWindows()
来关闭所有OpenCV创建的窗口。这虽然不是这段代码的一部分,但在实际应用中是一个好习惯。
TWO(图像RGB颜色通道与灰色转换):
首先使用cv2.imshow
函数分别显示了图像image
的蓝色、绿色和红色通道,然后使用cv2.cvtColor
函数将图像从BGR颜色空间转换为灰度图像,并显示了转换后的灰度图像。
-
显示蓝色通道:
cv2.imshow("blue", image[:, :, 0])
这行代码显示了图像
image
的蓝色通道。在BGR颜色空间中,蓝色通道是图像的第三个维度(索引为2,但由于Python索引从0开始,所以是索引0)。但是,这里直接访问image[:, :, 0]
实际上是访问了第一个通道,即蓝色通道(这里OPENCV图像是以RGB格式加载的,这通常是正确的,因为OpenCV默认以BGR格式加载图像)。 -
显示绿色通道:
cv2.imshow("green", image[:, :, 1])
-
显示红色通道:
cv2.imshow("red", image[:, :, 2])
-
转换为灰度图像并显示:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
这两行代码首先将图像
image
从BGR颜色空间转换为灰度图像,并将结果存储在变量gray
中。cv2.cvtColor
函数是OpenCV中用于颜色空间转换的函数,cv2.COLOR_BGR2GRAY
是将其从BGR颜色空间转换为灰度颜色空间的转换代码。
THREE(图像截取):
使用Python的切片操作来从原始图像image
中裁剪出一个区域,并将这个裁剪后的区域存储在变量crop
中。然后使用cv2.imshow
函数来显示这个裁剪后的图像。
# 从原始图像中裁剪出一个区域 | |
# image[y_start:y_end, x_start:x_end] | |
# 其中,y_start和x_start是裁剪区域左上角的坐标(包含),y_end和x_end是裁剪区域右下角的坐标(不包含) | |
crop = image[10:170, 40:200] | |
# 使用OpenCV的imshow函数显示裁剪后的图像 | |
cv2.imshow("crop", crop) |
FOUR(创建图形【方形圆形字体】):
使用了OpenCV库(通过import cv2
)和NumPy库(通过import numpy as np
)来创建一个黑色的图像,并在该图像上绘制了一条线、一个矩形、一个圆和一段文本。
-
创建黑色图像:
image = np.zeros([300, 300, 3], dtype=np.uint8)
使用NumPy的
zeros
函数创建一个300x300像素的黑色图像(因为所有像素的RGB值都被初始化为0)。这是一个三维数组,其中前两个维度代表图像的高度和宽度,第三个维度代表颜色通道(RGB)。dtype=np.uint8
指定了数组的数据类型为无符号8位整数,这是图像数据常用的数据类型。 -
绘制线条:
cv2.line(image, (100, 200), (250, 250), (255, 0, 0), 2)
使用
cv2.line
函数在图像上绘制一条从点(100, 200)到点(250, 250)的红色(BGR格式中的(255, 0, 0))线条,线条的厚度为2。 -
绘制矩形:
cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2)
使用
cv2.rectangle
函数在图像上绘制一个左上角为(30, 100),右下角为(60, 150)的绿色(BGR格式中的(0, 255, 0))矩形,矩形的边框厚度为2。 -
绘制圆:
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
使用
cv2.circle
函数在图像上绘制一个圆心为(150, 100),半径为20的蓝色(BGR格式中的(0, 0, 255))圆,圆的边框厚度为3。 -
添加文本:
cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1)
使用
cv2.putText
函数在图像上添加文本“hello”。文本的左下角位于点(100, 50),字体类型为0(OpenCV内置字体之一),字体缩放比例为1,颜色为白色(BGR格式中的(255, 255, 255)),线条厚度为2。最后一个参数1
指定了线条类型(用于指定字体是否加粗等,但在这个上下文中,它主要影响文本的渲染方式。lineType
线条的类型,如cv2.LINE_8
、cv2.LINE_AA
等。对于文本来说,这个参数通常不重要,因为文本绘制有其自己的抗锯齿处理)。
FIVE(图像滤波):
分别应用高斯模糊(Gaussian Blur)和中值模糊(Median Blur)两种滤波技术,并显示原始图像和两种模糊处理后的图像。
有一点需要注意:在调用cv2.waitKey()
时,最好指定一个参数(通常是0),这样程序就会等待用户按键后再继续执行。虽然不指定参数在某些环境中可能也能正常工作,但明确指定参数是一个好习惯,可以避免潜在的混淆。
# 检查图像是否成功读取 | |
if image is None: | |
print("Error: Image could not be read.") | |
else: | |
# 应用高斯模糊,
| |
gauss = cv2.GaussianBlur(image, (5, 5), 0) | |
5:这是一个整数,指定了中值滤波器的邻域大小。它必须是正奇数。在这个例子中,滤波器的大小是5x5。中值滤波器用邻域内像素的中位数来替换中心像素的值,这对于去除椒盐噪声(salt-and-pepper noise)特别有效。 | |
median = cv2.medianBlur(image, 5) |
SIX(检测角点):
使用了OpenCV库来检测图像中的角点,并在原始图像上标记这些角点。
-
转换为灰度图像:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
使用
cv2.cvtColor()
函数将原始图像从BGR颜色空间转换为灰度图像。这是因为角点检测通常在灰度图像上进行,以减少计算量并简化问题。 -
检测角点:
corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10)
使用
cv2.goodFeaturesToTrack()
函数在灰度图像上检测角点。这个函数的参数包括:corners
是一个包含角点坐标的数组,每个角点是一个(x, y)
坐标的浮点数对。gray
: 输入的灰度图像。500
: 最多要返回的角点数量。注意,实际返回的角点数量可能少于这个值,具体取决于图像和其他参数。0.1
: 角点检测的质量级别,一个介于0到1之间的值,值越低,检测到的角点越多。10
: 最小角点之间的欧氏距离,以像素为单位。这有助于避免检测到的角点过于集中。
-
在图像上标记角点:
for corner in corners:
x, y = corner.ravel()
cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)
遍历检测到的角点,并使用
cv2.circle()
函数在原始图像上以每个角点为中心绘制一个圆。这里,corner.ravel()
用于将角点坐标(通常是一个二维数组)转换为一维数组,从而可以分别访问x
和y
坐标。圆的半径设置为3,颜色设置为粉红色((255, 0, 255)
),-1
表示圆将被填充。
SEVEN(匹配查找):
用于在一张图片中查找与给定模板相匹配的区域,并在原始图像上绘制这些区域的边界框。
-
模板匹配结果的索引:在
np.where(match >= 0.9)
中,返回的locations
是一个元组,其中包含了满足条件的坐标的索引。由于match
是一个二维数组,locations
将有两个元素,分别对应y
和x
坐标的索引。但是,由于OpenCV的坐标系统通常使用(x, y)
格式,您可能需要调整这些索引以正确映射到图像坐标。
# 转换为灰度图像 | |
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
# 定义模板 | |
template = gray[75:105, 235:265] | |
if template.size == 0: | |
print("Error: Template has zero size.") | |
exit() | |
# 执行模板匹配 | |
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED) | |
# 找到匹配位置 | |
threshold = 0.9 | |
locations = np.where(match >= threshold) |
w, h = template.shape[0:2]
:- 这行代码从模板图像的
shape
属性中获取模板的宽度(w
)和高度(h
)。template.shape
返回一个元组,通常包含三个元素(对于二维图像,第三个元素是颜色通道数,但在这里因为是灰度图,所以只有一个颜色通道,且我们不需要它)。通过[0:2]
切片,我们选取了前两个元素,即图像的高度和宽度,并将它们分别赋值给h
和w
。
- 这行代码从模板图像的
for p in zip(*locations[::-1]):
:locations = np.where(match >= threshold)
这行代码生成了一个包含两个数组的元组,这两个数组分别表示满足匹配阈值条件的y
(行索引)和x
(列索引)坐标的索引。locations[::-1]
将这两个数组的顺序反转,因为np.where
默认返回的是(y_indices, x_indices)
,而OpenCV中的坐标系统是(x, y)
。通过反转,我们得到(x_indices, y_indices)
。zip(*locations[::-1])
将这两个索引数组“解包”并重新组合成元组的元组,每个内部元组包含一对(x, y)
坐标。zip
函数在这里实际上是在做“转置”的工作。for p in ...
遍历这些(x, y)
坐标对。
x1, y1 = p[0], p[1]
:- 对于每个坐标对
p
,我们将其分解为x1
和y1
,即矩形边界框的左上角坐标。
- 对于每个坐标对
x2, y2 = x1 + w, y1 + h
:- 计算矩形边界框的右下角坐标。通过将左上角坐标
x1
和y1
分别加上模板的宽度w
和高度h
,我们得到边界框的右下角坐标x2
和y2
。
- 计算矩形边界框的右下角坐标。通过将左上角坐标
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
:- 使用
cv2.rectangle
函数在原始图像image
上绘制一个矩形。参数(x1, y1)
和(x2, y2)
定义了矩形的左上角和右下角坐标。 - 参数
(0, 255, 0)
定义了矩形的颜色,这里是绿色(BGR格式)。 - 最后一个参数
2
定义了矩形边界的线条粗细。
- 使用
EIGHT(读取灰度图):
从同一张图像中读取灰度图,然后分别应用拉普拉斯边缘检测和Canny边缘检测。但是,有一点需要注意,当您使用 cv2.Laplacian()
函数时,如果图像是8位无符号整数(即 np.uint8
类型),并且您指定了 cv2.CV_64F
作为输出图像的深度,那么返回的 laplacian
图像将是一个浮点数数组,其值可能超出标准8位图像的显示范围(即0到255)。
为了正确显示 laplacian
图像,您可能需要将其数据类型转换回 np.uint8
并进行归一化或截断到适当的范围。然而,对于可视化目的,简单的归一化到0-255范围并转换为 np.uint8
通常就足够了。
# 读取图像为灰度图 | |
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE) | |
# 应用拉普拉斯边缘检测 | |
laplacian = cv2.Laplacian(gray, cv2.CV_64F) | |
# 将拉普拉斯图像归一化到0-255范围并转换为uint8 | |
laplacian = np.uint8(np.absolute(laplacian / np.max(laplacian)) * 255) | |
# 应用Canny边缘检测 | |
canny = cv2.Canny(gray, 100, 200) |
注意关键点:
- 我使用了
np.absolute()
来确保所有值都是非负的,因为拉普拉斯算子可能会产生负值。 - 我使用了
np.max(laplacian)
来找到拉普拉斯图像中的最大值,并将其用作归一化的除数。这样,拉普拉斯图像中的所有值都将被缩放到0到255的范围内。
NiNE(阈值处理):
使用了全局阈值处理(固定阈值和Otsu阈值)、以及自适应阈值处理。
-
读取灰度图像:
gray = cv2.imread("bookpage.jpg", cv2.IMREAD_GRAYSCALE)
这行代码读取名为"bookpage.jpg"的图像文件,并将其转换为灰度图像。
-
全局固定阈值处理:
ret, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)
这里,您使用了一个固定的阈值(10)来将灰度图像转换为二值图像。所有灰度值大于10的像素点被设置为255(白色),其余被设置为0(黑色)。
ret
是实际使用的阈值(在这种情况下,它应该是您指定的10,但可能会因为图像数据类型或内部处理而略有不同)。 -
自适应阈值处理:
binary_adaptive = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
自适应阈值处理会根据图像中每个像素周围的局部区域来计算阈值。这里,您使用了高斯加权和(
cv2.ADAPTIVE_THRESH_GAUSSIAN_C
),这意味着在计算阈值时,每个像素的邻域将被高斯加权。115
是常数,从每个像素的加权平均值中减去以得到最终的阈值。1
表示邻域的大小(在这个例子中,它实际上指定了11x11的邻域大小,因为OpenCV中邻域大小是奇数且由参数值加1得到)。 -
Otsu阈值处理:
ret1, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
Otsu阈值处理是一种自动选择最佳阈值的方法,用于将图像分割为前景和背景。这里,您通过添加
cv2.THRESH_OTSU
标志来告诉cv2.threshold
函数自动计算最佳阈值。0
作为阈值参数在这里被忽略,因为Otsu方法会覆盖它。ret1
将包含计算出的最佳阈值。
TEN(腐蚀与膨胀):
import cv2 # 导入OpenCV库,这是一个用于图像处理和计算机视觉的强大库。 | |
import numpy as np # 导入NumPy库,这是一个用于科学计算的基础库,提供了高性能的多维数组对象和相关工具。 | |
# 使用OpenCV的imread函数读取名为"opencv_logo.jpg"的图像文件,并指定以灰度模式读取(cv2.IMREAD_GRAYSCALE)。 | |
# 这将返回一个灰度图像,其中每个像素的亮度值范围是0到255。 | |
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE) | |
# 使用OpenCV的threshold函数对灰度图像进行二值化处理。 | |
# 参数gray是源图像,200是阈值,255是当像素值超过阈值时应该赋予的新值(对于THRESH_BINARY_INV类型)。 | |
# cv2.THRESH_BINARY_INV是阈值类型,表示进行反二值化操作,即大于阈值的像素被设置为0(黑色),小于或等于阈值的像素被设置为255(白色)。 | |
# 函数返回两个值,第一个值(通常不关心)是实际使用的阈值(可能由于自动阈值选择算法而略有不同),第二个值是二值化后的图像。 | |
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV) | |
# 使用NumPy的ones函数创建一个5x5的二维数组,数组中的每个元素都是1,数据类型为无符号8位整数(np.uint8)。 | |
# 这个数组将用作形态学操作(如腐蚀和膨胀)中的结构元素或核。 | |
kernel = np.ones((5, 5), np.uint8) | |
# 使用OpenCV的erode函数对二值图像进行腐蚀操作。 | |
# 参数binary是输入图像,kernel是前面创建的结构元素。 | |
# 腐蚀操作会使图像中的前景对象(白色区域)变小,通常用于去除小的噪点或分离连接的对象。 | |
erosion = cv2.erode(binary, kernel) | |
# 使用OpenCV的dilate函数对二值图像进行膨胀操作。 | |
# 参数和腐蚀操作相同,但膨胀操作会使图像中的前景对象(白色区域)变大,通常用于填补前景对象中的小洞或连接相邻的对象。 | |
dilation = cv2.dilate(binary, kernel) |
ELEVEN(图像捕获):
用于从计算机的默认摄像头捕获视频流,并在一个窗口中实时显示这些视频帧。
# 初始化视频捕获对象,参数0通常代表计算机的默认摄像头 | |
capture = cv2.VideoCapture(0) | |
# 使用一个无限循环来持续捕获视频帧 | |
while True: | |
# capture.read()方法捕获视频帧 | |
# 它返回两个值: | |
# ret是一个布尔值,如果读取帧成功则为True,如果文件结束或发生错误则为False | |
# frame是捕获的帧图像 | |
ret, frame = capture.read() | |
# 如果正确读取了帧,ret为True | |
if ret: | |
# 显示捕获的帧 | |
cv2.imshow("camera", frame) | |
# cv2.waitKey(1)等待1毫秒,检查是否有键盘事件 | |
# 如果用户按下了键,则返回按键的ASCII码;如果没有按键,则返回-1 | |
key = cv2.waitKey(1) | |
# 如果用户按下了任意键(key不等于-1),则退出循环 | |
if key != -1: | |
break | |
# 释放视频捕获对象 | |
capture.release() |
注意,我在代码中添加了对ret
的检查。这是一个好习惯,因为它可以防止在无法从摄像头读取帧(例如,如果摄像头被断开)时显示空窗口或引发错误。
相关文章:
30min 的OpenCV learning Note
1.安装python和pycharm与环境搭配 打开Windows终端:(winR)(一般使用清华镜像网站安装库比较快) pip install opencv-contrib-python -i https://pypi.mirrors.ustc.edu.cn/simple 或者 python -m pip install open…...

C--编译和链接见解
欢迎各位看官!如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论 感谢各位看官的支持!!! 一:翻译环境和运行环境 在ANSIIC的任何一种实现中,存在两个不同的环境1,…...
【QT Quick】基础语法:基础类与控件
QML 的基础类和控件中,我们可以看到主要的几个分类:基础控件类、窗口类以及组件类。以下是对这些控件及其属性、继承关系等的详细讲解: 控件关系总结 QtObject 是所有 QML 对象的基类。它定义了基础属性,主要用于逻辑和数据封装…...

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南
使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下,通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问,用户可以安全地远程操作…...
Gas费用是什么?
Gas费用是什么? 每5个Byte 需要1个GasGasLimit 用来限制合约最多执行多少次运算GasPrice 每次计算需要支付的费用在Web3的语境中,尤其是在以太坊(Ethereum)这样的区块链平台上,Gas费是一个核心概念。以下是关于Gas费的详细解释: 1. 定义 Gas是以太坊网络上的计算单位,…...
大语言模型(LLM)的子模块拆拆分进行联邦学习;大语言模型按照多头(Multi-Head)拆分进行联邦学习
目录 大语言模型(LLM)的子模块拆拆分进行联邦学习 方式概述 简单示例 大语言模型按照多头(Multi-Head)拆分进行联邦学习 场景设定 多头拆分与联邦学习 示例说明 大语言模型(LLM)的子模块拆拆分进行联邦学习 大语言模型(LLM)的子模块拆分进行联邦学习,主要涉及…...

Qt 概述
1. Qlabel HelloWorld 程序 使用纯代码实现 // widget.cpp Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 给当前这个lable对象,指定一个父对象QLabel* label new QLabel(this);// C语言风格的字符串可以直接…...

移动应用的界面配置-手机银行APP
设置登录界面为线性布局,组件垂直居中排列设置主页为滚动模式,包括布局、添加背景图片设置按钮样式,包括形状、边框线的宽度和颜色 设置登录界面 设置界面为线性布局,组件垂直居中排列 --android:gravity"center_vertical…...

微服务nginx解析部署使用全流程
目录 1、nginx介绍 1、简介 2、反向代理 3、负载均衡 2、安装nginx 1、下载nginx 2、解压nginx安装包 3、安装nginx编辑 1、执行configure命令 2、执行make命令 4、启动nginx 1、查找nginx位置并启动 2、常用命令 3、反向代理 1、介绍反向代理配置 1、基础配置…...

华硕天选笔记本外接音箱没有声音
系列文章目录 文章目录 系列文章目录一.前言二.解决方法第一种方法第二种方法 一.前言 华硕天选笔记本外接音箱没有声音,在插上外接音箱时,系统会自动弹出下图窗口 二.解决方法 第一种方法 在我的电脑上选择 Headphone Speaker Out Headset 这三个选项…...
Unity中Socket_TCP异步连接,加入断线检测以及重连功能
1、服务端 using System; using System.Collections.Generic; using System.Text; #region 命名空间 using System.Net; using System.Net.Sockets; using System.Threading; using UnityEngine; #endregionnamespace AsynServerConsole {/// <summary>/// Tcp协议异步通…...
Android build子系统(01)Ninja构建系统解读
说明:本文将解读Ninja构建系统,这是当前Android Framework中广泛使用的构建工具。我们将从Ninja的起源和背景信息开始,逐步解读Ninja的优势和核心原理,并探讨其一般使用场景。然后介绍其在Android Framework中的应用及相关工具&am…...
徐老师的吉祥数
题目背景 文件读写 输入文件avoid.in 输出文件avoid.out 限制 1000ms 512MB 题目描述 众所周知, 3这个数字在有些时候不是很吉利,因为它谐音为 “散” 所以徐老师认为只要是 3的整数次幂的数字就不吉利 现在徐老师想知道,在某个范围[l,r] …...

使用html写一个能发起请求的登录界面
目录 head部分 内联样式部分 body部分 login-form类的div myModal类的div id script部分 总的代码 界面与操作演示 <!DOCTYPE html> <html lang"en"> <!DOCTYPE html> 这是文档类型声明,告诉浏览器这是一个 HTML文档。 <…...

五子棋双人对战项目(2)——登录模块
目录 一、数据库模块 1、创建数据库 2、使用MyBatis连接并操作数据库 编写后端数据库代码 二、约定前后端交互接口 三、后端代码编写 文件路径如下: UserAPI: UserMapper: 四、前端代码 登录页面 login.html: 注册页面…...
几种操作系统和几种cpu
常见的操作系统:windows,linux,macOS,统信,deepin,raspberry,andriod,iOS,鸿蒙,等等。 常见的cpu:intel,amd,龙芯&#x…...

[Cocoa]_[初级]_[使用NSNotificationCenter作为目标观察者实现时需要注意的事项]
场景 在开发Cocoa程序时,由于界面是用Objective-C写的。无法使用C的目标观察者[1]类。如果是使用第二种方案2[2],那么也需要增加一个代理类。那么有没有更省事的办法? 说明 开发界面的时候,经常是需要在子界面里传递数据给主界面࿰…...

彩虹易支付最新版源码及安装教程(修复BUG+新增加订单投诉功能)
该源码当前版本为较新的版本,新增了订单投诉功能和一套精美的二次元模板。 此版本为全开源版本,所有文件均未加密。系统默认安装完成后无法直接打开,需要进一步配置。 本站特别针对BUG文件进行了修复,且在PHP7.4环境下表现良好。…...
ping香港服务器超时的原因通常有哪些?
Ping命令用于测试计算机与目标服务器之间的网络连接。当您在尝试使用ping命令检测服务器时遇到超时的情况,通常可能是由以下原因造成的: 1. 网络连接问题: - 本地网络故障:如网线损坏、路由器故障或配置不当。 - ISP(互联网服务提…...

书生大模型实战(从入门到进阶)L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践
目录 1 环境准备 1.1 安装rust 1.2 安装Android Studio 1.3 设置环境变量 2 转换模型 2.1 安装mlc-llm 2.2 (可选)转换参数 2.3 (可选)生成配置 2.4 (可选)上传到huggingface 2.5 (可选) 测试转换的模型 3 打包运行 3.1 修改配置文件 3.2 运行打包命令 3.3 创建签…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...