(02)python-opencv图像处理——更改颜色空间HSV

news2024/10/10 7:18:24

前言

1、更改颜色空间

1.1BGR 到 Gray 的示例

1.2 BGR 到 HSV 的示例: 

​编辑 1.3 通过HSV进行颜色追踪 

1.3.1hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

1.3.2 BGR vs HSV:

1.3.3 为什么使用 HSV 颜色空间?

1.3.4 cv.inRange(hsv, lower_red1, upper_red1)

1.3.5 cv.bitwise_and(frame, frame, mask=mask)

参数解释:

返回值:

 1.4 通过HSV进行颜色追踪-框选出目标区域

1.4.1 cv.morphologyEx(mask, cv.MORPH_OPEN, np.ones((3, 3), np.uint8))函数

1.4.2 cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)函数

1.4.3 cv.contourArea(contour)函数

1.5 通过HSV进行颜色追踪-围绕边缘实现框选

参考文献

前言

主要案例是实现对颜色的追踪操作,这是一个案例可以直接复制代码进行展示

1、更改颜色空间

在本教程中:

  • 你会学到如何将图片从一个颜色空间转换到另一个,例如 BGR 到 Gray,BGR 到 HSV 等。
  • 另外,我们会创建一个从视频中提取彩色对象的应用。
  • 你会学到如下函数:cv.cvtColor()cv.inRange()

1.1BGR 到 Gray 的示例

BGR 是 OpenCV 中的默认颜色空间,它的顺序是蓝-绿-红,而不是红-绿-蓝。将 BGR 图像转换为灰度图像,可以通过以下代码实现:

import cv2 as cv
# 读取图片
image = cv.imread('images/demo2.png')
# 将 BGR 图片转换为灰度图像
gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 显示原图和灰度图
cv.imshow('Original Image', image)
cv.imshow('Gray Image', gray_image)

cv.waitKey(0)
cv.destroyAllWindows()

1.2 BGR 到 HSV 的示例: 

HSV 是色相 (Hue),饱和度 (Saturation) 和亮度 (Value) 的颜色空间。它在许多应用中,例如颜色分割时非常有用。

注意 对于 HSV, 色调(Hue)范围为 [0,179], 饱和度(Saturation)范围为 [0,255] ,明亮度(Value)为 [0,255]. 不同的软件使用不同的比例. 所以如果你想用 OpenCV 的值与别的软件的值作对比,你需要归一化这些范围。

import cv2 as cv
# 读取图片
image = cv.imread('images/demo2.png')
# 将 BGR 图片转换为 HSV 图像
hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)
# 显示原图和 HSV 图像
cv.imshow('Original Image', image)
cv.imshow('HSV Image', hsv_image)

cv.waitKey(0)
cv.destroyAllWindows()

 1.3 通过HSV进行颜色追踪 

现在我们知道了如何将 BGR 图片转化为 HSV 图片,我们可以使用它去提取彩色对象。HSV 比 BGR 在颜色空间上更容易表示颜色。在我们的应用中,我们会尝试提取一个红色的彩色对象,方法为:

  • 提取每一视频帧。
  • 将 BGR 转化为 HSV 颜色空间。
  • 我们用蓝色像素的范围对该 HSV 图片做阈值。
  • 现在提取出了红色对象,我们可以随意处理图片了 。
import cv2 as cv
import numpy as np
# 打开摄像头
cap = cv.VideoCapture(0)
while True:
    # 读取摄像头的一帧
    ret, frame = cap.read()
    if not ret:
        print("无法从摄像头获取帧")
        break
    # 将 BGR 帧转换为 HSV 颜色空间
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 定义红色的 HSV 范围(红色有两个范围)
    lower_red1 = np.array([0, 120, 70])    # 红色的低端色调范围
    upper_red1 = np.array([10, 255, 255])
    lower_red2 = np.array([170, 120, 70])  # 红色的高端色调范围
    upper_red2 = np.array([180, 255, 255])
    # 创建两个掩膜
    mask1 = cv.inRange(hsv, lower_red1, upper_red1)  # 对应第一个红色范围
    mask2 = cv.inRange(hsv, lower_red2, upper_red2)  # 对应第二个红色范围
    # 将两个掩膜合并,覆盖所有红色区域
    mask = mask1 + mask2
    # 使用位操作将掩膜应用到原图像,提取红色对象
    result = cv.bitwise_and(frame, frame, mask=mask)
    # 显示原始帧和提取的红色对象
    cv.imshow('Original Frame', frame)
    cv.imshow('Red Object Extraction', result)
    # 按下 'q' 键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头并关闭所有窗口
cap.release()
cv.destroyAllWindows()

如果mask = mask2的时候效果更好哈

1.3.1hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

cv.cvtColor() 是 OpenCV 中用于转换图像颜色空间的函数。在你的例子中,hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) 将图像从 BGR 颜色空间转换为 HSV 颜色空间。这个操作在图像处理任务(如颜色对象提取)中非常常见,因为 HSV 颜色空间在颜色检测方面比 BGR 更直观和方便。

参数解释:

  1. frame:这是输入图像,通常是 BGR 格式的彩色图像(BGR 是 OpenCV 默认的颜色格式)。

  2. cv.COLOR_BGR2HSV:这是颜色空间转换的标志,表示将输入图像从 BGR 颜色空间转换为 HSV 颜色空间。OpenCV 中预定义了多种颜色空间转换的标志,BGR2HSV 是其中之一。

返回值:

  • hsv:输出图像,这是输入图像在 HSV 颜色空间下的表现形式。

1.3.2 BGR vs HSV:

  • BGR (蓝-绿-红) 是 OpenCV 使用的默认颜色空间,它表示的是三个颜色通道的强度值。

    • 例如,BGR(255, 0, 0) 代表蓝色,BGR(0, 255, 0) 代表绿色,BGR(0, 0, 255) 代表红色。

  • HSV (色调-饱和度-亮度) 是另一种表示颜色的方法,它将颜色信息分为三个独立的属性:

    1. H (Hue,色调):表示颜色的种类,范围为 [0, 179],例如 0 表示红色,120 表示绿色,240 表示蓝色。

    2. S (Saturation,饱和度):表示颜色的纯度,范围为 [0, 255],值越高表示颜色越纯,越低表示颜色越灰。

    3. V (Value,亮度):表示颜色的亮度,范围为 [0, 255],值越高表示颜色越亮。

1.3.3 为什么使用 HSV 颜色空间?

在颜色对象检测的任务中,HSV 比 BGR 更直观:

  1. 颜色分离更明显:在 BGR 中,颜色是由各通道的组合决定的,而在 HSV 中,色调 H 值直接表示颜色种类,使得对特定颜色的检测更方便。

  2. 更容易调节阈值:在 HSV 中,只需要调整色调(Hue)的范围来检测特定颜色,而在 BGR 中,你可能需要分别考虑三个通道的值。

如果你想检测红色对象,在 BGR 中可能很复杂,因为红色会涉及到 B、G、R 通道的值。而在 HSV 中,你只需要设定 H 在 0 和 10 或 170 和 180 之间,即可轻松提取红色。

HSV 转换的常见用途:

  • 颜色对象提取:例如,你想从图像或视频中提取某种颜色的物体,可以先将图像转换为 HSV 颜色空间,再通过定义 HSV 的范围,使用 cv.inRange() 来提取特定颜色。

  • 颜色过滤:你可以通过 HSV 的颜色空间,过滤掉不需要的颜色,保留或高亮感兴趣的部分。

1.3.4 cv.inRange(hsv, lower_red1, upper_red1)

参数说明:

  1. hsv:输入图像,通常是已经转换为 HSV 颜色空间的图像。

  2. lower_red1:颜色范围的下界,表示最低的 HSV 值。例如 [0, 120, 70],对应的是色调 (H)、饱和度 (S)、亮度 (V) 的最小值。

  3. upper_red1:颜色范围的上界,表示最高的 HSV 值。例如 [10, 255, 255],对应的是色调 (H)、饱和度 (S)、亮度 (V) 的最大值。

返回值:

  • mask:输出的二值图像(掩膜)。在这个掩膜中,符合给定 HSV 范围的像素会被设置为白色(255),不符合的像素会被设置为黑色(0)。

1.3.5 cv.bitwise_and(frame, frame, mask=mask)

cv.bitwise_and() 是 OpenCV 中用于按位与运算的函数。该函数的主要作用是将两个图像的每个像素按位进行与操作(AND),并生成一个新图像。结合掩膜使用时,它可以用于提取特定颜色或区域。

参数解释:
  1. src1:输入图像的第一个源,可以是 BGR 或其他颜色空间的图像。
  2. src2:输入图像的第二个源,通常与 src1 相同。这表示将 src1 中的像素与 src2 中的像素进行按位与运算。
  3. mask(可选):掩膜图像,指定哪些区域需要进行运算。掩膜中的白色区域(255)表示保留对应像素,黑色区域(0)表示不保留对应像素。
返回值:
  • output:输出图像,包含 src1src2 按位与运算的结果,或仅保留掩膜指定的区域。

 1.4 通过HSV进行颜色追踪-框选出目标区域

import cv2 as cv
import numpy as np
# 打开摄像头
cap = cv.VideoCapture(0)
while True:
    # 读取摄像头的一帧
    ret, frame = cap.read()
    if not ret:
        print("无法从摄像头获取帧")
        break
    # 将 BGR 帧转换为 HSV 颜色空间
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 定义红色的 HSV 范围
    lower_red1 = np.array([0, 120, 70])
    upper_red1 = np.array([10, 255, 255])
    lower_red2 = np.array([170, 120, 70])
    upper_red2 = np.array([180, 255, 255])
    # 创建两个掩膜,分别对应红色的低端和高端
    mask1 = cv.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv.inRange(hsv, lower_red2, upper_red2)
    # 合并掩膜,提取所有红色区域
    mask = mask2
    # 对掩膜进行形态学操作,去除噪点(可选)
    mask = cv.morphologyEx(mask, cv.MORPH_OPEN, np.ones((3, 3), np.uint8))
    mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, np.ones((3, 3), np.uint8))
    # 找到红色区域的轮廓
    contours, _ = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 在原图上绘制轮廓
    for contour in contours:
        if cv.contourArea(contour) > 500:  # 过滤掉较小的轮廓
            x, y, w, h = cv.boundingRect(contour)  # 获取包围轮廓的矩形框
            cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 绘制矩形框
    # 显示原始帧和红色区域的掩膜
    cv.imshow('Original Frame', frame)
    cv.imshow('Red Object Mask', mask)
    # 按下 'q' 键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头并关闭所有窗口
cap.release()
cv.destroyAllWindows()

1.4.1 cv.morphologyEx(mask, cv.MORPH_OPEN, np.ones((3, 3), np.uint8))函数

cv.morphologyEx() 是 OpenCV 中用于执行形态学操作的函数。形态学操作常用于图像处理,特别是在处理二值图像时,如去除噪声、填补孔洞等。cv.MORPH_OPEN 是形态学操作中的一种,称为开运算。后期的形态学中会进行进一步深入。

参数解释:

  1. src:输入图像,通常是二值图像(即掩膜),在这个情况下是你之前提到的 mask

  2. op:指定要执行的形态学操作。在你的例子中,使用的是 cv.MORPH_OPEN,表示执行开运算。

  3. kernel:结构元素,是一个用于形态学操作的卷积核。通常使用 np.ones() 创建一个全为 1 的矩阵,指定卷积核的大小和形状。例如,在你的例子中,使用的是一个 3x3 的矩阵。

返回值:

  • output:输出图像,经过形态学操作后的结果。

开运算 (cv.MORPH_OPEN) 的作用:

开运算是一个由两个基本操作组成的组合操作:

  1. 腐蚀(Erosion):用结构元素对图像进行腐蚀操作,通常用于去除小的噪声点。

  2. 膨胀(Dilation):随后对腐蚀后的图像进行膨胀操作,恢复原始图像中大部分的结构。

开运算的效果是:

  • 去除小的噪声和细小的连接。

  • 保留较大的结构,平滑边缘。

import cv2 as cv
import numpy as np

# 创建一个二值掩膜
mask = cv.imread('mask.jpg', cv.IMREAD_GRAYSCALE)

# 使用开运算去除噪声
kernel = np.ones((3, 3), np.uint8)  # 创建一个3x3的结构元素
cleaned_mask = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)

# 显示结果
cv.imshow('Cleaned Mask', cleaned_mask)
cv.waitKey(0)
cv.destroyAllWindows()

处理过程:

  1. 读取掩膜:首先读取一个二值掩膜 mask

  2. 创建结构元素:使用 np.ones((3, 3), np.uint8) 创建一个 3x3 的结构元素。

  3. 应用开运算:调用 cv.morphologyEx(mask, cv.MORPH_OPEN, kernel) 执行开运算,去除掩膜中的小噪声。

  4. 显示结果:输出的 cleaned_mask 是经过开运算处理后的二值图像。

实际效果:

  • 开运算的输出图像将减少小的白色噪声点,同时保持较大物体的形状。这样可以为后续的图像处理(如轮廓检测)提供更清晰的输入。

总结:

  • cv.morphologyEx() 是一个强大的函数,用于执行多种形态学操作。

  • 开运算(cv.MORPH_OPEN)是处理二值图像中的噪声和细节的常用技术,特别适合于图像分割和目标提取等应用。

1.4.2 cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)函数

cv.findContours() 是 OpenCV 中用于检测图像中的轮廓的函数。轮廓是图像中相同颜色或相似亮度的边界曲线,可以用于形状分析和对象检测等任务。

contours, hierarchy = cv.findContours(image, mode, method)

参数解释:

  1. image:输入图像,通常是一个二值图像(如掩膜)。该图像将用于检测轮廓,轮廓通常是图像中物体的边界。注意,这个输入图像会被修改,通常在调用该函数前需要对其进行复制(如果需要保留原图像)。

  2. mode:轮廓检索模式,决定了如何检索轮廓。常用的选项包括:

    • cv.RETR_EXTERNAL:仅检索外部轮廓,忽略内部轮廓。

    • cv.RETR_LIST:检索所有轮廓,并将其放入列表中,但不建立层级关系。

    • cv.RETR_TREE:检索所有轮廓,并建立轮廓之间的层级关系。

  3. method:轮廓逼近方法,决定了如何存储轮廓的点。常用的选项包括:

    • cv.CHAIN_APPROX_SIMPLE:压缩轮廓,存储轮廓的端点,节省存储空间。

    • cv.CHAIN_APPROX_NONE:存储所有轮廓点,不进行任何压缩。

返回值:

  • contours:返回一个列表,其中包含图像中所有检测到的轮廓。每个轮廓是一个由轮廓点组成的 numpy 数组。

  • hierarchy:返回一个层级数组,表示轮廓之间的关系(可选,通常用于需要分析轮廓层级的场景)。

1.4.3 cv.contourArea(contour)函数

cv.contourArea() 是 OpenCV 中用于计算轮廓面积的函数。它接受一个轮廓作为输入,并返回该轮廓所围成区域的面积。

参数解释:

  • contour:输入轮廓,通常是通过 cv.findContours() 函数获得的轮廓。轮廓是一个由多个点组成的数组,定义了物体的边界。

返回值:

  • area:返回轮廓所围成区域的面积,单位是像素。

使用示例:

在你的示例 cv.contourArea(contour) > 500 中,函数的作用可以分为以下几步:

  1. 计算轮廓面积:调用 cv.contourArea(contour) 计算当前轮廓的面积。

  2. 与阈值比较:将计算出的面积与阈值(例如 500 像素)进行比较,以筛选出较大的轮廓。

1.5 通过HSV进行颜色追踪-围绕边缘实现框选

import cv2 as cv
import numpy as np

# 打开摄像头
cap = cv.VideoCapture(0)

while True:
    # 读取摄像头的一帧
    ret, frame = cap.read()
    if not ret:
        print("无法从摄像头获取帧")
        break

    # 将 BGR 帧转换为 HSV 颜色空间
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

    # 定义红色的 HSV 范围
    lower_red1 = np.array([0, 120, 70])
    upper_red1 = np.array([10, 255, 255])
    lower_red2 = np.array([170, 120, 70])
    upper_red2 = np.array([180, 255, 255])

    # 创建两个掩膜,分别对应红色的低端和高端
    mask1 = cv.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv.inRange(hsv, lower_red2, upper_red2)

    # 合并掩膜,提取所有红色区域
    mask = cv.add(mask1, mask2)

    # 对掩膜进行形态学操作,去除噪点(可选)
    mask = cv.morphologyEx(mask, cv.MORPH_OPEN, np.ones((3, 3), np.uint8))
    mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, np.ones((3, 3), np.uint8))

    # 找到红色区域的轮廓
    contours, _ = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    # 在原图上绘制轮廓
    for contour in contours:
        if cv.contourArea(contour) > 500:  # 过滤掉较小的轮廓
            cv.drawContours(frame, [contour], -1, (0, 255, 0), 2)  # 用绿色绘制轮廓

    # 显示原始帧和红色区域的掩膜
    cv.imshow('Original Frame', frame)
    cv.imshow('Red Object Mask', mask)

    # 按下 'q' 键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv.destroyAllWindows()

cv.drawContours(frame, [contour], -1, (0, 255, 0), 2)

这行代码用于在原始帧上绘制轮廓,轮廓的颜色为绿色,线条宽度为 2 像素。通过这种方式,红色区域的边缘将被绘制出来,而不是用矩形框包围。

实际效果:

  • 运行这个修改后的代码时,程序将识别并框选红色对象的边缘,显示更精确的轮廓,而不是简单的矩形框。这种方式能够更好地表现物体的形状和边界。

总结:

  • 使用 cv.drawContours() 代替矩形框绘制,使得检测结果更贴合物体的实际形状,适用于需要对形状进行更细致分析的应用场景。

2、图像的几何变换

参考文献

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle-函数-instr()的妙用以及相似功能like

INSTR(C1,C2[,I[,J]]) 【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置; 【说明】多字节符(汉字、全角符等),按1个字符计算 【参数】 C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 第J次出现的位置,默认为1 【…

安全帽未佩戴预警系统 劳保防护用品穿戴监测系统 YOLO

在建筑、矿山、电力等高危行业中,工人面临着各种潜在的危险,如高空坠物、物体打击等。安全帽能够有效地分散和吸收冲击力,大大降低头部受伤的严重程度。一旦工人未正确佩戴安全帽,在遭遇危险时,头部将直接暴露在危险之…

Linux网络编程 -- 网络套接字预备与udp

本文主要介绍网络编程的相关知识,在正式介绍网络编程之前,我们得先了解一些前置的知识。 1、端口号 我们上网其实就是两种动作,一个是将远处的数据拉取到本地,另一个是把我们的数据发送给远端。其实大部分的网络通信行为都是用户…

基于springboot vue3 工商局商家管理系统设计与实现

博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

【公共祖先】二叉树专题

里面涉及多个plus题 前言1.二叉树的最近公共祖先2.二叉搜索树的最近公共祖先3.二叉树的最近公共祖先II4.二叉树的最近公共祖先III5.二叉树的最近公共祖先IV 前言 公共祖先这一类题目,难度不大,但是非常实用,也是面试问到概率比较大的一类题目…

夜间数据库IO负载飙升?MySQL批量删除操作引发的问题排查

目录 问题现象 问题分析 修改建议 总结 问题现象 近日,某用户反馈他们的MySQL数据库实例在凌晨时段会频繁出现IO负载急剧上升的情况,这种状态会持续一段时间,随后自行恢复正常。为了查明原因,该用户通过DBdoctor工具收集了相…

DLL中函数导出时的注意事项

1.使用.def文件导出函数 1.1示例代码:使用stdcall 关键字 和 extern "C" 关键字修饰 dll中函数 BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATT…

sahi密集检测的推理技巧

最近在做一些计数的项目,样本中存在一些非常密集的目标,如果混杂一起训练指标很难达到要求,所以考虑在训练时不加入密集目标,训练使用正常的样本,在推理时使用密集检测方案。 在高分辨率图像中检测小目标一直是一个技…

【Qt+Python项目构建】- 02 Qt creator 14.0 + PySide6 如何让图像控件的尺寸变化和窗口一致

前言:【这是个AI不会回答的问题】 Qt Creator 新的版本又发出了,Pyside6 有很多新功能。但是,一些传统的方法要被淘汰了。 一个经典的例子是: 我有个一个图像要显示在Form里面的图像控件上,OK, 我现在拖…

Unity实现自定义图集(一)

以下内容是根据Unity 2020.1.0f1版本进行编写的   Unity自带有图集工具,包括旧版的图集(设置PackingTag),以及新版的图集(生成SpriteAtlas)。一般来说,unity自带的图集系统已经够用了,但是实际使用上还是存在一些可优化的地方,例如加载到Canvas上的资源,打图集不能…

JVM(学习预热 - 走进Java)(持续更新迭代)

目录 一、彻底认识Java虚拟机 开创世纪:Sun Classic 开创世纪:Exact VM 武林霸主:HotSpot VM 移动端虚拟机:Mobile/Embedded VM “三大”其二:BEA JRockit/IBM J9 VM 软硬结合:BEA Liquid VM/Azul VM…

更新子节点的优化策略1:目标old节点的位置预测

更新子节点的优化策略1:目标old节点的位置预测: 如果 oldStartVnode 和 newStartVnode 是同一个节点,直接 patchVnode,同时 oldStartIdx、newStartIdx 索引都加 1(向右移动)如果 oldEndVnode 和 newEndVno…

PE结构之 重定位表

那么,我们找到了某个 需要修改的绝对地址 的RVA, 将这个RVA转换成FOA后,这个绝对地址是读DWORD ,还是QWORD? 就是说,32位和64位是否有区别? 实验: 找到重定位表的数据,并观察在内存中和文件中的区别 将引用dll的exe文件,设置一下基址 同时DLL文件的基址和EXE文件设置一样,并…

肝了4天,我用ChatTTS和LLM让deeplearning.ai课程说上流畅中文

以下是「 豆包MarsCode 体验官」优秀文章,作者X2046。 我们都知道外网上有很多优秀的视频教程平台,比如 Coursera 和 deeplearning.ai。尤其是后者,由吴恩达老师与OpenAI、Langchain、LlamaIndex、AutoGen等公司和作者合作,推出了…

Spring Cloud Netflix Hystrix 熔断器讲解和案例示范

在分布式微服务架构中,每个服务之间相互依赖,当某个服务出现故障或延迟时,如果没有有效的故障隔离机制,可能导致整个系统雪崩式的失败。Netflix Hystrix 作为一种熔断器模式,旨在通过隔离服务之间的调用,提…

通过移动访问控制增强数据中心安全性

在当今数据驱动的世界里,信息是新的黄金标准,数据中心安全已成为每个 IT 部门的首要任务。数据隐私和道德管理不再仅仅是最佳实践,而是法律要求。因此,风险比以往任何时候都要高。 然后是内部威胁问题。根据 IBM 的 《2024 年数据…

Python案例--copy复制

在Python编程中,数据的复制是一个常见且重要的操作,它涉及到赋值、浅拷贝和深拷贝三种不同的概念。正确理解这三种操作对于编写高效且正确的程序至关重要。本文将通过一个简单的Python示例,探讨这三种数据复制方式的区别及其应用场景&#xf…

数据结构 ——— 单链表oj题:环状链表(求出环的入口节点)

目录 题目要求 手搓一个简易带环链表 代码实现 题目要求 给定一个链表的头节点 head,返回链表开始入环的第一个节点,如果链表无环,则返回NULL 手搓一个简易带环链表 代码演示: struct ListNode* n1 (struct ListNode*)mal…

深度学习:循环神经网络—RNN的原理

传统神经网络存在的问题? 无法训练出具有顺序的数据。模型搭建时没有考虑数据上下之间的关系。 RNN神经网络 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络。在处理序列输入时具有记忆性…

Mac上强大的菜单栏管理工具

想要Mac用的好,各种工具少不了,一款好用的软件对于提高使用效率和使用舒适度来说非常必要,iBar-强大的菜单栏图标管理工具 随着 Mac 运行的软件增加,状态栏中的图标也越来越多,不仅看得眼花缭乱,而且刘海屏…