血条识别功能实现及原理

从零开始学Python图像处理 - 血条识别

从实际问题中能快速的学习特定技能,通过完成一个能自动刷怪的工具,达成快速学习python图像处理和识别。

自动刷怪需要先识别怪物,在游戏中怪物类型很多,同时在移动中形态会一直发生变化,通过怪物图片来匹配难度太大,因此需要另辟蹊径。通过观察在所有怪物头顶存在红色血条,这个问题可以转化成识别红色血条,将 Y 坐标下移即是怪物的位置。

基本功能实现

import cv2 as cv
import numpy as npdef main_findMonster():"""主函数:用于检测图像中的特定目标(如怪物)该函数读取图像,将其从BGR颜色空间转换为HSV颜色空间,然后使用预定义的HSV范围创建阈值掩码,以识别图像中的特定目标。最后,使用形态学处理和轮廓检测来定位目标,并显示结果图像。"""# 读取目标图像,图像为BGR三通道格式target_bgr = cv.imread(image_path)# 将图像从BGR颜色空间转换为HSV颜色空间target_hsv = cv.cvtColor(target_bgr, cv.COLOR_BGR2HSV)# 创建两个阈值掩码,分别针对HSV颜色空间中的两个不同范围# 这是为了更好地检测图像中的特定颜色(如红色)threshold_mask1 = cv.inRange(target_hsv, (0, 180, 150), (10, 255, 255))threshold_mask2 = cv.inRange(target_hsv, (175, 180, 150), (180, 255, 255))# 将两个阈值掩码合并,以覆盖更广的颜色范围threshold_mask = threshold_mask1 + threshold_mask2# 设置形态学处理的核kernel_size = (5, 5)kernel = cv.getStructuringElement(cv.MORPH_RECT, kernel_size)# 形态学操作mask1 = cv.morphologyEx(threshold_mask, cv.MORPH_CLOSE, kernel)mask2 = cv.dilate(mask1, kernel, iterations=2)# 显示拼接图target_gray = cv.cvtColor(target_bgr, cv.COLOR_BGR2GRAY)# 轮廓检测与标记contours, _ = cv.findContours(mask2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)display_img = target_bgr.copy()for cnt in contours:x, y, w, h = cv.boundingRect(cnt)if h * 2 < w < h * 10:cv.rectangle(display_img, (x, y-5), (x + w, y), (255, 0, 0), 2)cv_show('Result', display_img)

在这里插入图片描述

以上代码中使用 OpenCV 来完成功能,涉及到的函数功能说明如下:

  1. cv.imread:读取图片
  2. cv.inRange:指定的颜色范围从图像中提取目标区域
  3. cv.morphologyEx / cv.dilate :形态学操作
  4. cv.findContours : 轮廓检测与标记

颜色阈值分割

cv.inRange是 OpenCV 中用于颜色阈值分割的核心函数。其主要作用是根据指定的颜色范围从图像中提取目标区域,生成一个二值掩码(Mask),便于后续的图像处理和分析。

原理,对输入图像的每个像素进行判断:

  • 若像素值在 [lowerb, upperb] 范围内 → 输出掩码中对应位置设为 255(白色)
  • 若像素值超出范围 → 输出掩码中对应位置设为 0(黑色)

支持多通道处理

  • 可处理单通道(灰度图)或多通道图像(如 RGB、HSV)
  • 多通道规则:像素需在所有通道上同时满足范围条件才会被保留
cv2.inRange(InputArray src,      # 输入图像(单/多通道)InputArray lowerb,   # 范围下界(Scalar 或数组)InputArray upperb,   # 范围上界(Scalar 或数组)OutputArray dst      # 输出二值掩码(单通道二值图 CV_8U 类型)
);

案例:

def test_inRange():# 读取图像img = cv2.imread("./image/img.png")if img is None:print("Error: Image not found.")return# 转换为 HSV 色彩空间hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 定义红色的 HSV 范围lower_red = np.array([0, 100, 100])upper_red = np.array([10, 255, 255])# 创建掩码mask1 = cv2.inRange(hsv_img, lower_red, upper_red)# 定义蓝色的 HSV 范围lower_blue = np.array([110, 50, 50])upper_blue = np.array([130, 255, 255])# 创建掩码mask2 = cv2.inRange(hsv_img, lower_blue, upper_blue)# 定义绿色的 HSV 范围lower_green = np.array([50, 100, 100])upper_green = np.array([70, 255, 255])# 创建掩码mask3 = cv2.inRange(hsv_img, lower_green, upper_green)mask = merge_images_with_white_gap([mask1, mask2, mask3], gap=20, scaling=0.3)# 显示结果cv_show("Mask", mask)

在这里插入图片描述

形态学操作

形态学操作是图像处理中一种基于形状的处理技术,主要用于分析和处理图像中的几何结构。它通常作用于二值图像,但也可以应用于灰度图像。

形态学操作的核心思想是使用一个称为"结构元素"(kernel)的模板在图像上滑动,并根据结构元素与图像局部区域的相互作用来改变图像的形状。常见的结构元素形状有矩形、椭圆和十字形。

基本形态学操作包括:

  • 腐蚀(Erosion):使图像中的前景物体(通常为白色区域)缩小或"变瘦",通过取局部最小值实现。可以用来消除小噪声点或分离接触的物体
  • 膨胀(Dilation):使前景物体扩大或"变胖",通过取局部最大值实现。可以填充小孔洞或连接断裂的部分
  • 开运算(Opening):先腐蚀后膨胀的操作组合。可以去除小的噪声点和平滑物体边缘
  • 闭运算(Closing):先膨胀后腐蚀的操作组合。可以填充物体内部的小孔洞和连接邻近物体

高级形态学操作包括:

  • 形态学梯度(Morphological Gradient):膨胀图减去腐蚀图,得到物体的轮廓
  • 顶帽变换(Top Hat):原图减去开运算图,用于突出比结构元素小的亮区域
  • 黑帽变换(Black Hat):闭运算图减去原图,用于突出比结构元素小的暗区域

基本操作与原理

作用原理函数
腐蚀(Erosion)使前景物体(白色区域)“变瘦”,消除小噪声点或分离粘连物体结构元素覆盖区域内,若存在黑色像素(值为0),则中心点置为黑色(取局部最小值)cv2.erode(img, kernel)
膨胀(Dilation)使前景物体“变胖”,填充孔洞或连接断裂部分结构元素覆盖区域内,若存在白色像素(255),则中心点置为白色(取局部最大值)cv2.dilate(img, kernel)
开运算(Opening)消除细小噪声和平滑边界,保留主体形状(去外噪先腐蚀后膨胀cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
闭运算(Closing)填充物体内部小孔洞或裂缝(去内噪先膨胀后腐蚀cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
形态学梯度(Morphological Gradient)突出物体轮廓(类似边缘检测)膨胀图减腐蚀图(dilation - erosioncv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
顶帽变换(Top Hat)提取比结构元素小的亮区域(如背景中的文字)原图减开运算图(src - opening
黑帽变换(Black Hat)提取比结构元素小的暗区域(如显微图像中的细胞核)闭运算图减原图(closing - src

结构元素(Kernel)的设计

结构元素形状直接影响效果,常见类型:

  • 矩形cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
  • 椭圆cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
  • 十字形cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))

尺寸选择:核越大,操作效果越显著,但可能过度失真。

腐蚀操作原理

形态学操作举例—腐蚀操作

def test_shape():img = cv2.imread("./image/1.png")hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 定义红色的 HSV 范围lower_red = np.array([0, 100, 100])upper_red = np.array([10, 255, 255])# 创建掩码mask1 = cv2.inRange(hsv_img, lower_red, upper_red)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))mask2 = cv2.erode(mask1, kernel, iterations=1)mask3 = cv2.erode(mask1, kernel, iterations=2)mask = merge_images_with_white_gap([mask1, mask2, mask3], gap=20, scaling=0.4)# 显示结果cv_show("Mask", mask)

在这里插入图片描述

腐蚀操作原理深究,可分为如下四步:

  1. 定义结构元素(如 kernel = np.ones((3,3), np.uint8))。
  2. 结构元素中心遍历图像每个像素。
  3. 检查结构元素覆盖区域是否全为前景:
  • 是 → 中心像素保留原值。
  • 否 → 中心像素置为背景值(二值图)或邻域最小值(灰度图)
  1. 重复迭代(iterations 参数控制次数),每次迭代以上次输出为输入

前景(Foreground):在二值图像中,前景通常指目标物体(像素值为1或255,如白色区域);背景则为非目标区域(像素值为0,如黑色区域)

腐蚀的数学表达式为:
AB=xBxA
其中 A 是图像,B 是结构元素。表示结构元素 B 平移至位置 x 时,B 完全包含于 A 内,则 x 属于腐蚀结果

    img1 = np.array([[1, 1, 1, 1, 1, 0],[1, 1, 1, 0, 1, 1],[1, 1, 1, 1, 1, 1],[1, 0, 0, 1, 1, 1],[1, 1, 0, 1, 1, 1],[0, 1, 1, 0, 1, 0],],dtype=np.uint8,)kernel1_33 = np.ones((3, 3), np.uint8)a = cv2.erode(img1, kernel1_33, iterations=1)print("a:", a, ) 
""" 
[[1 1 0 0 0 0][1 1 0 0 0 0][0 0 0 0 0 1][0 0 0 0 1 1][0 0 0 0 0 0][0 0 0 0 0 0]]"""

在这里插入图片描述

膨胀操作原理

形态学操作举例—膨胀操作

def test_shape2():img = cv2.imread("./image/1.png")hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 定义红色的 HSV 范围lower_red = np.array([0, 100, 100])upper_red = np.array([10, 255, 255])# 创建掩码mask1 = cv2.inRange(hsv_img, lower_red, upper_red)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))mask2 = cv2.dilate(mask1, kernel, iterations=1)mask3 = cv2.dilate(mask1, kernel, iterations=2)mask = merge_images_with_white_gap([mask1, mask2, mask3], gap=20, scaling=0.4)# 显示结果cv_show("Mask", mask)

在这里插入图片描述

膨胀操作按以下流程执行:

  1. 定义结构元素:选择形状、尺寸(如3×3矩形核)。
  2. 遍历图像:结构元素中心从图像左上角开始滑动,覆盖每个像素位置。
  3. 计算与更新:对每个位置,检查结构元素覆盖区域:
    • 二值图像:区域内存在前景像素则中心置1。
    • 灰度图像:取区域内最大灰度值赋给中心。
  4. 重复至完成:遍历全图后输出膨胀图像

基本数学原理

膨胀操作的数学本质是局部最大值滤波

公式表达:对于图像A和结构元素B,膨胀操作定义为:

(AB)(x,y)=(i,j)∈B|max(A(xi,yj))

其中(x,y)是图像坐标,(i,j)是结构元素B的坐标。

操作逻辑:结构元素在图像上滑动,计算其覆盖区域内像素的最大值,并将该值赋给中心像素(锚点),邻域像素值 [70, 100, 130] 的膨胀结果为最大值 130

不同形态学操作对比
在这里插入图片描述

轮廓检测

cv.findContours 是 OpenCV 中用于从二值图像中提取物体轮廓的核心函数,常用于目标检测、形状分析和图像分割。

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

返回值

  • contours:轮廓点坐标列表,每个轮廓是一个点集(NumPy数组)。
  • hierarchy:轮廓层级关系,描述轮廓间的嵌套结构(OpenCV 3.x返回;4.x需用_, contours, _ = cv.findContours(...)

参数:

  1. image二值输入图像

    • 必须是单通道二值图(黑白),前景为白色(255),背景为黑色(0)。
    • 需预处理:灰度化 → 二值化(如cv.threshold)或边缘检测(如cv.Canny
  2. mode轮廓检索模式

    模式作用
    cv.RETR_EXTERNAL只检测最外层轮廓(忽略内部孔洞)。
    cv.RETR_LIST检测所有轮廓,不建立层级关系(hierarchy无效)。
    cv.RETR_CCOMP检测所有轮廓,组织为两层(外层+内孔)。
    cv.RETR_TREE检测所有轮廓,建立完整的树形层级(嵌套轮廓分析)
  3. method轮廓近似方法

    方法特点
    cv.CHAIN_APPROX_NONE保存轮廓所有连续点(数据量大)。
    cv.CHAIN_APPROX_SIMPLE压缩冗余点,仅保留拐点(如矩形→4个顶点)。
    cv.CHAIN_APPROX_TC89_L1/KCOS使用Teh-Chin算法近似,平衡精度与效率
  4. offset(可选):轮廓点偏移量

    • 格式:(x_offset, y_offset),用于ROI区域提取的轮廓映射到原图坐标

轮廓提取流程
典型流程包括:

  • 预处理:灰度化、去噪(高斯滤波)。

  • 边缘增强:边缘检测(如Canny)或二值化(如Otsu阈值分割)。

  • 轮廓提取:通过算法(如findContours)连接边缘点生成轮廓。

  • 后处理:轮廓筛选(面积过滤)、多边形近似等

    轮廓检索模式效果测试

    def test_findContours():img = cv2.imread("./image/circle.jpg")# 复制图像以便绘制轮廓img1 = img.copy()img2 = img.copy()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)# 检测所有轮廓,建立完整的树形层级contours1, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 只检测最外层轮廓contours2, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓res1 = cv2.drawContours(img1, contours1, -1, (0, 0, 255), 2)res2 = cv2.drawContours(img2, contours2, -1, (0, 0, 255), 2)res = merge_images_with_white_gap([img,binary, res1, res2], gap=20, scaling=0.4, is_gray=False)cv_show("Contours", res)
    

    在这里插入图片描述

完整代码:

import cv2 as cv
import numpy as np
from util import cv_show , read_image , nothing,cv_show_await,merge_images_with_white_gapimage_path = "./image/2.png"
def main_findMonster():"""主函数:用于检测图像中的特定目标(如怪物)该函数读取图像,将其从BGR颜色空间转换为HSV颜色空间,然后使用预定义的HSV范围创建阈值掩码,以识别图像中的特定目标。最后,使用形态学处理和轮廓检测来定位目标,并显示结果图像。"""# 读取目标图像,图像为BGR三通道格式target_bgr = read_image(image_path)# 将图像从BGR颜色空间转换为HSV颜色空间target_hsv = cv.cvtColor(target_bgr, cv.COLOR_BGR2HSV)# 创建两个阈值掩码,分别针对HSV颜色空间中的两个不同范围# 这是为了更好地检测图像中的特定颜色(如红色)threshold_mask1 = cv.inRange(target_hsv, (0, 180, 150), (10, 255, 255))threshold_mask2 = cv.inRange(target_hsv, (175, 180, 150), (180, 255, 255))# 将两个阈值掩码合并,以覆盖更广的颜色范围threshold_mask = threshold_mask1 + threshold_mask2# 设置形态学处理的核kernel = setKernel()# 调用findMonster函数,在目标图像中使用阈值掩码和核来检测和定位目标display_img = findMonster(target_bgr, threshold_mask, kernel)# 显示处理后的图像,并等待用户按键cv_show_await("display_img", display_img)def create_trackbar():cv.namedWindow('Adjust HSV Thresholds')# 创建滑动条,初始值为默认的红色范围cv.createTrackbar('Lower H', 'Adjust HSV Thresholds', 0, 180, nothing)cv.createTrackbar('Upper H', 'Adjust HSV Thresholds', 10, 180, nothing)cv.createTrackbar('Lower S', 'Adjust HSV Thresholds', 210, 255, nothing)cv.createTrackbar('Upper S', 'Adjust HSV Thresholds', 255, 255, nothing)cv.createTrackbar('Lower V', 'Adjust HSV Thresholds', 180, 255, nothing)cv.createTrackbar('Upper V', 'Adjust HSV Thresholds', 255, 255, nothing)def get_threshold_mask(hsv_img):lower_h = cv.getTrackbarPos('Lower H', 'Adjust HSV Thresholds')upper_h = cv.getTrackbarPos('Upper H', 'Adjust HSV Thresholds')lower_s = cv.getTrackbarPos('Lower S', 'Adjust HSV Thresholds')upper_s = cv.getTrackbarPos('Upper S', 'Adjust HSV Thresholds')lower_v = cv.getTrackbarPos('Lower V', 'Adjust HSV Thresholds')upper_v = cv.getTrackbarPos('Upper V', 'Adjust HSV Thresholds')lower_red = np.array([lower_h, lower_s, lower_v])upper_red = np.array([upper_h, upper_s, upper_v])return cv.inRange(hsv_img, lower_red, upper_red)def setKernel():kernel_size = (5, 5)return cv.getStructuringElement(cv.MORPH_RECT, kernel_size)# 建立滑动条,动态测试调整HSV Thresholds
def test_findMonster():create_trackbar()target_bgr = read_image(image_path)  # 读取为BGR三通道kernel = setKernel()while True:target_hsv = cv.cvtColor(target_bgr, cv.COLOR_BGR2HSV)threshold_mask = get_threshold_mask(target_hsv)findMonster(target_bgr,threshold_mask,kernel)key = cv.waitKey(1) & 0xFFif key == 27:  # 按下 ESC 键退出break# 清理资源cv.destroyAllWindows()cv.waitKey(1)  # 防止某些系统残留窗口def findMonster(target_bgr,mask, kernel):# 形态学操作mask1 = cv.morphologyEx(mask, cv.MORPH_CLOSE, kernel)mask2 = cv.dilate(mask1, kernel, iterations=2)# 显示拼接图target_gray = cv.cvtColor(target_bgr, cv.COLOR_BGR2GRAY)combined = merge_images_with_white_gap([target_gray, mask, mask1, mask2], gap=10, scaling=0.2)cv_show('Combined Image', combined)# 轮廓检测与标记contours, _ = cv.findContours(mask2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)display_img = target_bgr.copy()for cnt in contours:x, y, w, h = cv.boundingRect(cnt)if h * 2 < w < h * 10:cv.rectangle(display_img, (x, y-5), (x + w, y), (255, 0, 0), 2)cv_show('Result', display_img)return display_img
import cv2 as cv
import os
import numpy as npdef nothing(x):passdef merge_images_with_white_gap(images, gap=20, scaling=1, is_gray=True):"""合并多张图像为水平排列的单张图像,图像间有白色间隔,支持缩放和灰度转换参数:images (list): 包含多张OpenCV格式图像的列表gap (int): 图像间的白色间隔宽度(像素),默认为20scaling (float): 最终图像的缩放比例,默认为1(不缩放)is_gray (bool): 是否转换为灰度图像,默认为False返回:np.ndarray: 合并后的图像,失败时返回None"""# 1. 输入校验if not images:print("Error: No images to merge.")return Noneif gap < 0:gap = 0if scaling <= 0:scaling = 1# 2. 灰度转换处理if is_gray:# 统一转为单通道灰度图processed_images = [cv.cvtColor(img, cv.COLOR_BGR2GRAY) if len(img.shape) == 3 else imgfor img in images]channel = 1  # 单通道else:# 统一转为三通道彩色图processed_images = []for img in images:if len(img.shape) == 2:  # 单通道转三通道processed_images.append(cv.cvtColor(img, cv.COLOR_GRAY2BGR))elif len(img.shape) == 3 and img.shape[2] == 4:  # 带透明通道processed_images.append(cv.cvtColor(img, cv.COLOR_BGRA2BGR))else:processed_images.append(img)channel = 3  # 三通道# 3. 计算合并尺寸max_height = max(img.shape[0] for img in processed_images)total_width = sum(img.shape[1] for img in processed_images) + gap * (len(processed_images) - 1)# 4. 创建白色背景画布if channel == 1:merged_image = np.full((max_height, total_width), 255, dtype=np.uint8)  # 单通道白底else:merged_image = np.full((max_height, total_width, channel), 255, dtype=np.uint8)  # 三通道白底[7](@ref)# 5. 图像拼接current_x = 0for img in processed_images:h, w = img.shape[:2] if channel == 1 else img.shape[:2]# 垂直居中放置y_offset = (max_height - h) // 2merged_image[y_offset : y_offset + h, current_x : current_x + w] = imgcurrent_x += w + gap  # 移动位置并添加间隔[4](@ref)# 6. 缩放处理if scaling != 1:new_width = int(total_width * scaling)new_height = int(max_height * scaling)merged_image = cv.resize(merged_image,(new_width, new_height),interpolation=cv.INTER_AREA if scaling < 1 else cv.INTER_CUBIC,)return merged_imagedef read_image(image_path):if not os.path.exists(image_path):print(f"Error: Image file {image_path} does not exist.")returnimage = cv.imread(image_path)if image is None:print(f"Error: Image file {image_path} does not exist.")return Nonereturn imagedef cv_show_await(name, img):cv.imshow(name, img)cv.waitKey(0)cv.destroyAllWindows()def cv_show(winname, img):try:# 尝试获取窗口属性,判断是否已经创建if not hasattr(cv_show, "windows"):cv_show.windows = set()if winname not in cv_show.windows:cv.namedWindow(winname, cv.WINDOW_AUTOSIZE)cv_show.windows.add(winname)cv.imshow(winname, img)except cv.error:# 如果窗口已关闭,则重新创建cv.namedWindow(winname, cv.WINDOW_AUTOSIZE)cv_show.windows.add(winname)cv.imshow(winname, img)

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

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

相关文章

网络地址和主机地址之间进行转换的类

#pragma once #include "Common.hpp" // 网络地址和主机地址之间进行转换的类class InetAddr { public:InetAddr(){}InetAddr(struct sockaddr_in &addr) : _addr(addr){// 网络转主机_port ntohs(_addr.sin_port); // 从网络中拿到的&#xff01;网络序列// _i…

《Python 项目 CI/CD 实战指南:从零构建自动化部署流水线》

🛠《Python 项目 CI/CD 实战指南:从零构建自动化部署流水线》 一、引言:为什么 Python 项目需要 CI/CD? 在现代软件开发中,CI/CD(持续集成 / 持续部署)已成为不可或缺的工程实践。它不仅提升了开发效率,还显著降低了部署风险。对于 Python 项目而言,CI/CD 的价值尤…

AJAX 技术

AJAX全称是 Asynchronous JavaScript and XML ( 异步的JavaScript 和 XML )&#xff0c;使用该技术后&#xff0c;可以实现不刷新整个网页&#xff0c;与服务器进行异步通信并更新部分网页。一&#xff09;为什么需要AJAX?传统网页在与服务器通信时&#xff0c;需要刷新整个页…

Python爬虫实战:研究NLTK库相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络新闻已成为人们获取信息的主要来源之一。每天产生的海量新闻文本蕴含着丰富的信息和知识,但也给信息获取和分析带来了挑战。如何从大量非结构化的新闻文本中自动提取有价值的信息,识别热点话题和趋势,成为当前自然语…

ARM 学习笔记(二)

参考文献&#xff1a;《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》1、MMU 1.1 背景早期的内存是比较小的&#xff0c;一般是几十k&#xff0c;不过相应的程序也是比较小的&#xff0c;这时程序可以直接加载到内存中运行。后来为了支持多个程序的并行&…

Github 贪吃蛇 主页设置

自动化脚本顶部元信息触发条件&#xff08;on:&#xff09;作业&#xff08;jobs:&#xff09;步骤&#xff08;steps:&#xff09;1. 生成 SVG2. 推送到 output 分支Commit & Push在 README 里引用参考&#xff1a;https://github.com/Platane/Platane/tree/master 首先写…

关于Spring RestTemplate

​ 一、概述RestTemplate 是 Spring Framework 提供的一个同步 HTTP 客户端工具&#xff0c;用于简化与 RESTful API 的交互。它封装了底层 HTTP 通信细节&#xff0c;提供了统一的 API 来发送各种 HTTP 请求&#xff08;GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并自…

异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql

设计准则“为什么要考虑这个问题”The forward logic is only about 10% of your code, everything else is 90%.主流逻辑 10%保障扩容和稳健的代码设计90%同步代码就是绑在一个绳上的蚂蚱异步就是实现了解耦这个异步或许有点类似于--一些分布式数据的处理 设计如何实现的呢?…

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

系列文章 序号 文章名称 1 Spring AI 项目实战(一):Spring AI 核心模块入门 2 Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码) 3 Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码) 4

指针数组和数组指针的应用案例

1. 指针数组应用&#xff1a;查找最长字符串用指针数组存储若干字符串&#xff0c;编写函数找出其中最长的字符串&#xff08;若有多个&#xff0c;返回第一个&#xff09;。#include <stdio.h> #include <string.h>// 函数原型&#xff1a;找出最长字符串 const c…

MCU进入低功耗模式前的引脚处理原则和方法 --> 以最小化低功耗电流

在MCU进入低功耗模式(如Sleep, Stop, Standby, Deep Sleep等)前,精心处理每一个GPIO引脚的状态是最大限度降低功耗电流的关键一步。悬空或配置不当的引脚是导致“漏电”的常见原因。以下是处理引脚以达到最小低功耗电流的原则和方法: 📌 核心原则 避免浮空输入: 浮空(…

张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;

关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导; 目录 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导; 一、校准方法:让模型概率更贴近真实正确…

ICT测试原理之--什么是假短

ICT测试原理之–什么是假短 文章目录ICT测试原理之--什么是假短一、假短的由来防止假短二、无法检测的短路示例解决无法检测的短路调试短路文件调试意外断路调试意外短路三、调试假短报告短路和断路报告假短报告短路设备/引脚功能性短路测试功能性短路测试的语法一、假短的由来…

三种深度学习模型(LSTM、CNN-LSTM、贝叶斯优化的CNN-LSTM/BO-CNN-LSTM)对北半球光伏数据进行时间序列预测

代码功能 该代码实现了一个光伏发电量预测系统&#xff0c;采用三种深度学习模型&#xff08;LSTM、CNN-LSTM、贝叶斯优化的CNN-LSTM&#xff09;对北半球光伏数据进行时间序列预测&#xff0c;并通过多维度评估指标和可视化对比模型性能。 算法步骤 1. 数据预处理 数据导入&am…

Typecho+阿里云CDN完整配置:防止DDoS攻击与IP暴露

文章目录 Typecho使用阿里云CDN保护网站真实IP地址的完整指南 背景与问题分析 技术选型与方案设计 详细实施步骤 第一步:阿里云CDN基础配置 第二步:DNS解析设置 第三步:源站服务器防护配置 Nginx服务器配置 防火墙配置(以Ubuntu为例) 第四步:Typecho配置调整 高级防护措施…

[硬件]运算放大器对相位噪声的影响与设计提示

运算放大器对相位噪声的影响与设计提示 文章目录运算放大器对相位噪声的影响与设计提示运放影响位噪声的主要因素如何最小化运放对相位噪声的影响总结运算放大器是常用的模拟电路元器件&#xff0c;通常用于放大信号&#xff0c;增强驱动。但是当使用运放放大一个信号时&#x…

github jekyll+chirpy主题搭建博客

github jekyllchirpy主题搭建博客 标签&#xff1a;后端、blog、jekyll 全文链接 本文简要介绍了如何基于 GitHub Pages、Jekyll 及 Chirpy 主题搭建个人博客的流程和注意事项。 主要内容 GitHub Pages 站点简介 可免费搭建个人博客&#xff0c;支持自定义域名&#xff0c;适…

Flutter状态管理篇之ValueNotifier(三)

目录 前言 一、ValueNotifier 概述 二、ValueNotifier 的实现原理 1.类定义 1.类定义 2.关键字段 3.关键方法 1.构造函数 2.getter:value 3.setter:value: 4.toString 2.继承自ChangeNotifier的机制 3.ValueListenable 接口 三、ValueNotifier 的用法 1.基本用法…

Ubuntu togo 系统安装指南

制作一个 “Ubuntu To Go” 系统&#xff08;也就是一个可以随身携带、在不同电脑上启动并拥有持久化存储的U盘系统&#xff09;是解决你问题的完美方案。 这样一来&#xff0c;你就可以&#xff1a; 不改动你现有的电脑系统 (保留你的Ubuntu 20.04 或 Windows)。拥有一个完整…

Python爬虫实战:研究pefile库相关技术

一、引言 可执行文件(Portable Executable,PE)是 Windows 操作系统中最常见的文件格式,包括.exe、.dll、.sys 等多种类型。对 PE 文件的分析在软件逆向工程、恶意软件检测、系统安全研究等领域具有重要意义。传统的 PE 文件分析主要依赖手动操作和专业工具,效率较低且对分…