当前位置: 首页 > news >正文

计算机视觉项目中的文件批量操作与文件批量预处理

计算机视觉项目中的文件批量操作与文件批量预处理

目录

  1. 数据集制作
  2. 文件批量重命名
  3. 文件批量移动
  4. 将文件批量按照一定格式进行重命名
  5. 修改xml文件内容的方法

引言

在计算机视觉项目中,文件批量操作和文件批量预处理是必不可少的步骤。它们涉及处理大量的图像文件,包括读取、处理、保存和预处理。本文将介绍一些常见的技术和方法,以帮助您在计算机视觉项目中有效地进行文件批量操作和文件批量预处理。

1. 数据集制作

人工智能就是有多少人工产生多少智能,在计算机视觉项目中,数据集至关重要,下面是如何使用视频抽帧技术实现数据集的制作。以下代码中_videoPlay函数是实时显示导入的视频,CutVideo函数实现手动抽帧,在显示时按c键则抽取当前帧,按Esc键关闭视频。ExtractAll函数是自动抽帧功能,frameGap参数是隔多少帧进行自动抽取。

class ExtractImg(object):def __init__(self, videopath: Path, savepath: Path, delay: int = 1) -> None:self.spath = savepathself.vpath = videopathself.delay = delaycv2.namedWindow("cv", cv2.WINDOW_NORMAL)cv2.resizeWindow("cv", 640, 480)self.cap = cv2.VideoCapture(str(self.vpath))self._timeflag = 0if not savepath.exists():os.mkdir(Path(savepath))def _videoPlay(self, size: list) -> None:self.cap.set(3, size[0])self.cap.set(4, size[1])while self.cap.isOpened():ret, frame = self.cap.read()# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)cv2.imshow("cv", frame)if cv2.waitKey(self.delay) & 0xFF == ord('c'):cv2.imwrite(str(PurePath.joinpath(self.spath,"{}.jpg".format(str(time.time())))), frame)print("保存成功")time.sleep(1)elif cv2.waitKey(self.delay) & 0xFF == 27:breakdef ExtractAll(self, frameGap: int = 3) -> None:"""这是将视频流中的帧全部抽出:frame: 跳帧:return:"""while self.cap.isOpened():self._timeflag += 1ret, frame = self.cap.read()if ret:cv2.imshow("cv", frame)if self._timeflag % frameGap == 0:cv2.imwrite(str(PurePath.joinpath(self.spath,"{}.jpg".format(str(time.time())))), frame)print("保存成功")if (cv2.waitKey(self.delay) & 0xFF == 27) or not ret:breakcv2.destroyAllWindows()self.cap.release()self._timeflag = 0def CutVideo(self) -> None:"""这是手动抽帧:return:"""ifm = input("文件中已经存在{}张图片,是否有继续添加""(Y or N):".format(len(os.listdir(self.spath))))if self.spath.exists() and ifm == 'Y':self._videoPlay(size=[640, 480])elif self.spath.exists() and ifm == 'N':return Noneelse:print("\n请输入Y(yes)或者N(no)")cv2.destroyAllWindows()self.cap.release()

2. 文件批量重命名

将文件夹下的图片进行升序的重命名。

  def statistics(path: Union[str, Path], dstpath: Union[Path, str], count: int = 0, random: bool = False) -> None:"""这是存放图片的文件夹安升序重命名:param path:需要重命名的文件文件:param count:观察图片总数添加使用"""assert isinstance(path, (Path, str)), print("请输入的路径")l = os.listdir(str(path))if not Path.exists(dstpath):Path.mkdir(dstpath)# l = sorted(l)print(l)# print(l)print("存在文件{}张!".format(len(l)))if random:np.random.shuffle(l)# print(l)# 将保存图片文件中的图片按照升序的方法重命名suffix = Path(l[0]).suffixfor file in tqdm(l):src = PurePath.joinpath(path, file)dst = PurePath.joinpath(dstpath, Path(str(count + int(Path(file).stem))).with_suffix(suffix))os.rename(src, dst)

3. 文件批量移动

下面的是将文件批量按照一定规则挑选出来放到目标文件夹下。

    def choosen(src: Union[str, Path] , folder: Union[Path,str] ,dst: Union[str, Path] , suffix: str) -> None:"""1.将xml/jpg文件夹中的文件名字拿出来并且在jpg/xml对应的文件夹中将名称相同的文件挑出来2.将文件夹中的文件随取出:param xmlsrc:目标xml文件:param imgsrc:frameImg文件:param dst:根据xml挑选出的img文件:return: None"""# l = os.listdir(str(xmlsrc))if not isinstance(folder,Path):pa = Path(folder)if not isinstance(src,Path):l = Path(src)# parent = src.parentfor i in l.iterdir():file = Path(i.name).with_suffix(suffix)(pa / file).rename(Path(dst) / file)

4. 将文件批量按照一定格式进行重命名

下面将文件按照5位数字的格式进行重命名 1.jpg->00001.jpg

    def batchrenames(src: Union[str, Path], dst: Union[str, Path], sorted: bool = False) -> None:"""进行特定格式的重命名:param src:原文件:param dst: 存储文件:param sorted: 是否已经有顺序,若有学按照1.jpg ->00001.jpg:return: None"""d = {1: "0000",  # 这是命名格式的字典2: "000",3: "00",4: "0",5: ""}l = os.listdir(src)suffix = Path(l[0]).suffixl.sort(key=lambda x: int(x.split('.')[0]))if sorted:for obj in tqdm(l):old = PurePath.joinpath(src, obj)new = PurePath.joinpath(dst, d[len(obj.split('.')[0])] + obj.split('.')[0] + suffix)os.rename(old, new)else:# for c, i in tqdm(enumerate(l)):pass

5. 修改xml文件内容的方法

这是修改xml文件内容的代码。

    def revampXml(xml_path: Union[Path, str], update_content: str) -> None:"""这是一个修改xml文件内容的方法,将xml文件爱中的类别改称另一个类别:param xml_path: 存放xml文件的路径:param xml_dw: xpath关键字:param update_content: 更新的内容:return:None"""# 打开xml文档if not isinstance(xml_path, Path):xml_path = Path(xml_path)for i in tqdm(xml_path.iterdir()):xmlfile = xml_path / f"{i}"doc = ET.parse(xmlfile)root = doc.getroot()# 查找修改路劲for obj in root.iter("object"):sub1 = obj.find("name")if sub1.text == "motorboat":# 修改标签内容sub1.text = update_content# 保存修改doc.write(xmlfile)

总结

本文介绍了计算机视觉项目中的文件批量操作与文件批量预处理技术。 掌握这些技术将使您能够高效地处理大规模的图像数据,并为计算机视觉项目的成功实施提供强大的支持。

希望本文对您在计算机视觉项目中的文件批量操作与文件批量预处理有所启发!让我们一起推动计算机视觉的发展,创造更多可能性!

以下是完整代码

# -*- coding: utf-8 -*-
# @Author  : cvYouTian
# @Software: PyCharmfrom pathlib import Path, PurePath
import xml.etree.ElementTree as ET
from typing import Union
import numpy as np
# import torch
from tqdm import tqdm
import time
import cv2
import osclass ExtractImg(object):def __init__(self, videopath: Path, savepath: Path, delay: int = 1) -> None:self.spath = savepathself.vpath = videopathself.delay = delaycv2.namedWindow("cv", cv2.WINDOW_NORMAL)cv2.resizeWindow("cv", 640, 480)self.cap = cv2.VideoCapture(str(self.vpath))self._timeflag = 0if not savepath.exists():os.mkdir(Path(savepath))def _videoPlay(self, size: list) -> None:self.cap.set(3, size[0])self.cap.set(4, size[1])while self.cap.isOpened():ret, frame = self.cap.read()# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)cv2.imshow("cv", frame)if cv2.waitKey(self.delay) & 0xFF == ord('c'):cv2.imwrite(str(PurePath.joinpath(self.spath,"{}.jpg".format(str(time.time())))), frame)print("保存成功")time.sleep(1)elif cv2.waitKey(self.delay) & 0xFF == 27:breakdef ExtractAll(self, frameGap: int = 3) -> None:"""这是将视频流中的帧全部抽出:frame: 跳帧:return:"""while self.cap.isOpened():self._timeflag += 1ret, frame = self.cap.read()if ret:cv2.imshow("cv", frame)if self._timeflag % frameGap == 0:cv2.imwrite(str(PurePath.joinpath(self.spath,"{}.jpg".format(str(time.time())))), frame)print("保存成功")if (cv2.waitKey(self.delay) & 0xFF == 27) or not ret:breakcv2.destroyAllWindows()self.cap.release()self._timeflag = 0def CutVideo(self) -> None:"""这是手动抽帧:return:"""ifm = input("文件中已经存在{}张图片,是否有继续添加""(Y or N):".format(len(os.listdir(self.spath))))if self.spath.exists() and ifm == 'Y':self._videoPlay(size=[640, 480])elif self.spath.exists() and ifm == 'N':return Noneelse:print("\n请输入Y(yes)或者N(no)")cv2.destroyAllWindows()self.cap.release()@staticmethoddef statistics(path: Union[str, Path], dstpath: Union[Path, str], count: int = 5305, random: bool = False) -> None:"""这是存放图片的文件夹安升序重命名:param path:需要重命名的文件文件:param count:观察图片总数添加使用"""assert isinstance(path, (Path, str)), print("请输入的路径")l = os.listdir(str(path))if not Path.exists(dstpath):Path.mkdir(dstpath)# l = sorted(l)print(l)# print(l)print("存在文件{}张!".format(len(l)))if random:np.random.shuffle(l)# print(l)# 将保存图片文件中的图片按照升序的方法重命名suffix = Path(l[0]).suffixfor file in tqdm(l):src = PurePath.joinpath(path, file)dst = PurePath.joinpath(dstpath, Path(str(count + int(Path(file).stem))).with_suffix(suffix))os.rename(src, dst)@staticmethoddef choosen(src: Union[str, Path]="/home/you/Desktop/2023海上高速目标检测/val", folder: Union[Path,str]="/home/you/Desktop/2023海上高速目标检测/annotations",dst: Union[str, Path]="/home/you/Desktop/2023海上高速目标检测/train", suffix: str=".xml") -> None:"""1.将xml/jpg文件夹中的文件名字拿出来并且在jpg/xml对应的文件夹中将名称相同的文件挑出来2.将文件夹中的文件随取出:param xmlsrc:目标xml文件:param imgsrc:frameImg文件:param dst:根据xml挑选出的img文件:return: None"""# l = os.listdir(str(xmlsrc))if not isinstance(folder,Path):pa = Path(folder)if not isinstance(src,Path):l = Path(src)# parent = src.parentfor i in l.iterdir():file = Path(i.name).with_suffix(suffix)(pa / file).rename(Path(dst) / file)@staticmethoddef batchrenames(src: Union[str, Path], dst: Union[str, Path], sorted: bool = False) -> None:"""进行特定格式的重命名:param src:原文件:param dst: 存储文件:param sorted: 是否已经有顺序,若有学按照1.jpg ->00001.jpg:return: None"""d = {1: "0000",  # 这是命名格式的字典2: "000",3: "00",4: "0",5: ""}l = os.listdir(src)suffix = Path(l[0]).suffixl.sort(key=lambda x: int(x.split('.')[0]))if sorted:for obj in tqdm(l):old = PurePath.joinpath(src, obj)new = PurePath.joinpath(dst, d[len(obj.split('.')[0])] + obj.split('.')[0] + suffix)os.rename(old, new)else:# for c, i in tqdm(enumerate(l)):pass@staticmethoddef text(file: Union[Path, str]):l = []f = open(file)for i in f.readlines():i = i.strip()stem = Path(i).stemsuffix = Path(i).suffixn1, n2 = int(stem) - 1, int(stem) + 1l.append(str(n1) + ".xml")l.append(str(n2) + ".xml")print(l)@staticmethoddef revampXml(xml_path: Union[Path, str], update_content: str) -> None:"""这是一个修改xml文件内容的方法,将xml文件爱中的类别改称另一个类别:param xml_path: 存放xml文件的路径:param xml_dw: xpath关键字:param update_content: 更新的内容:return:None"""# 打开xml文档if not isinstance(xml_path, Path):xml_path = Path(xml_path)for i in tqdm(xml_path.iterdir()):xmlfile = xml_path / f"{i}"doc = ET.parse(xmlfile)root = doc.getroot()# 查找修改路劲for obj in root.iter("object"):sub1 = obj.find("name")if sub1.text == "motorboat":# 修改标签内容sub1.text = update_content# 保存修改doc.write(xmlfile)@staticmethoddef movefile(folder_path: Union[Path, str], dst: Union[Path, str], suffix: str) -> None:"""批量移动剪切文件:param folder_path: 原文件夹路径:param dst: 目标文件夹路径:param suffix: 移动的文件格式/后缀:return:"""if not isinstance(folder_path, Path):folder_path = Path(folder_path)# for i in folder_path.iterdir():#     if i.is_dir():#         ExtractImg.movefile(folder_path / i, suffix, res)#     else:#         if i.suffix == suffix:#             res.append(str(i))# # return res if suffix is None or suffix == "" else list(filter(lambda x: str(x).endswith(suffix),res))# return resfor i in tqdm(folder_path.rglob(f"*{suffix}")):i.rename(dst / i.name)@staticmethoddef convert_box(size, box):dw, dh = 1. / size[0], 1. / size[1]x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]return x * dw, y * dh, w * dw, h * dhif __name__ == "__main__":# 目标视频文件videopath = Path("videoSet/seabird6.mp4")# 图片保存文件savepath = Path("./dataset/imgs")# xin = Path("./VOC6detect/imgss")# savepath = Path("frameSave")# 目标xml文件# xmlpath = Path("./VOC6detect/annotations")# old = Path("/home/you/Desktop/dateset/20(pass)/seabird5")# new = Path("/home/you/Desktop/dateset/11(pass)/temp")# pa = Path("./labels/")# xin = Path()# renamepath = Path("/home/you/Desktop/dateset/4(pass)/a-1")# 实例化a = ExtractImg(videopath=videopath, savepath=savepath)a.choosen()# VOC2YOLO# a.convert_label()# 将帧全部抽出# a.ExtractAll(frameGap=8)# 手动抽帧# a.CutVideo()# 根据xml文选出对应的文件# a.choosen(xmlsrc=xmlpath, imgsrc=savepath, dst=xin)# 将数字命名的图片按照加上一个数字的方式命名# a.statistics(path=Path("./DATA/xml"), dstpath=Path("./DATA/t"), count=5305)# 对已经有顺序或者没顺序的文件进行特定格式的重命名78.jpg -> 00078.jpg# a.batchrenames(src=new, dst=old, sorted=True)# a.text("./data1.txt")# 对xml文件进行修改# a.revampXml(xml_path= "/home/you/Desktop/tools/dataset/annotations", update_content="speedboat")# 批量拿到文件夹中的某格式的文件# a.movefile(folder_path="/home/you/Desktop/网上快艇", dst=pa, suffix=".jpg")

相关文章:

计算机视觉项目中的文件批量操作与文件批量预处理

计算机视觉项目中的文件批量操作与文件批量预处理 目录 数据集制作文件批量重命名文件批量移动将文件批量按照一定格式进行重命名修改xml文件内容的方法 引言 在计算机视觉项目中,文件批量操作和文件批量预处理是必不可少的步骤。它们涉及处理大量的图像文件&am…...

PHP数组转对象和对象转数组

PHP数组转对象和对象转数组 <?php function array_to_object($arr){$obj new stdClass();foreach ($arr as $key > $val) {if (is_array($val) || is_object($val)) {$obj->$key array_to_object($val);} else {$obj->$key $val;}}return $obj; } function o…...

前后端分离开发中的传参

1.post请求&#xff0c;后台代码使用RequestBody注解接收前端传过来的参数 PostMapping("/saveHosp") public Result SaveHosp(RequestBody HospitalSet hospitalSet){//此处省略中间代码......} 此时前端传过来的参数须为JSON格式&#xff0c;前端VUE传参数为&…...

mount: wrong fs type, bad option, bad superblock报错 ubuntu

问题描述 mount: wrong fs type, bad option, bad superblock Ubuntu无法挂载磁盘。 原因 很大概率是你的硬盘是NTFS。 解决 sudo apt install ntfs-3g即可。...

【图像分类】CNN+Transformer结合系列.3

介绍两篇图像分类的论文&#xff1a;ResMLP&#xff08;arXiv2305&#xff09;&#xff0c;MetaFormer&#xff08;CVPR2022&#xff09;&#xff0c;两者都与Transformer有关系&#xff0c;前者基于transformer结构的特点设计ResMLP&#xff0c;后者认为宏观架构才是Transform…...

IDA分析实例android_crackme/EasyJNI/Transformers/pingan2

文章目录 第一个实例android_crackme将32位的android_server放到手机目录下给android_server赋予root更改root用户组运行android_serverpc端端口转发安装apk&#xff0c;并运行app打开32位IDA并attach到进程先使用jadx看java层逻辑定位要分析的方法IDA 给两个方法打断点 第二个…...

拿捏--->求一元二次方程的根

文章目录 题目描述算法思路代码示例 题目描述 从键盘输入a, b, c的值&#xff0c;编程计算并输出一元二次方程ax2 bx c 0的根&#xff0c;当a 0时&#xff0c;输出“Not quadratic equation”&#xff0c;当a ≠ 0时&#xff0c;根据△ b2 - 4ac的三种情况计算并输出方程…...

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…...

spring5源码篇(12)——spring-mvc请求流程

spring-framework 版本&#xff1a;v5.3.19 文章目录 一、请求流程1、处理器映射器1.1、 RequestMappingHandlerMapping1.2、获取对应的映射方法1.3、添加拦截器 2、获取合适的处理器适配器3、通过处理器适配器执行处理器方法3.1、拦截器的前置后置3.2、处理器的执行3.2.1 参数…...

风辞远的科技茶屋:来自未来的信号枪

很久之前&#xff0c;有位朋友问我&#xff0c;现在科技资讯这么发达了&#xff0c;你们还写啊写做什么呢&#xff1f; 我是这么看的。最终能够凝结为资讯的那个新闻点&#xff0c;其实是一系列事情最终得出的结果&#xff0c;而这个结果又会带来更多新的结果。其中这些“得出”…...

MongoDB教程-8

ObjectId 在之前的所有章节中&#xff0c;我们一直在使用MongoDB的Object Id。在本章中&#xff0c;我们将了解ObjectId的结构。 ObjectId是一个12字节的BSON类型&#xff0c;具有以下结构-- 1. 前4个字节代表自unix epoch以来的秒数 接下来的3个字节是机器标识符 接下来的2…...

Redis 理论部分

前面写了很多redis项目&#xff0c;今天在通过redis的理论加深redis的了解&#xff0c;顺便做个总结 Redis 理论部分 1.redis 速度快的原因 纯内存操作单线程操作&#xff0c;避免频繁的上下文切换以及资源争用的问题&#xff0c;多线程需要占用更多的cpu资源采用非阻塞I/O多…...

Android—Monkey用法

文章目录 Monkey知识 Monkey知识 介绍 Monkey是Android中的一个命令行工具&#xff0c;可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等)&#xff0c;实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软…...

几个影响 cpu cache 性能因素及 cache 测试工具介绍

》内核新视界文章汇总《 文章目录 1 cache 性能及影响因素1.1 内存访问和性能比较1.2 cache line 对性能的影响1.3 L1 和 L2 缓存大小1.4 指令集并行性对 cache 性能的影响1.5 缓存关联性对 cache 的影响1.6 错误的 cacheline 共享 (缓存一致性)1.7 硬件设计 2 cpu cache benc…...

Java从入门到精通(二)· 基本语法

Java从入门到精通&#xff08;二&#xff09; 基本语法 一 变量 1.字面量 计算机是用来处理数据的&#xff0c;字面量就是告诉程序员&#xff1a;数据在程序中的书写格式。 特殊的字符&#xff1a; \n 表示换行&#xff0c; \t 表示一个制表符&#xff0c;即一个tab 2.变量…...

云安全攻防(三)之 面向云原生环境的安全体系

面向云原生环境的安全体系 根据云原生环境的构成&#xff0c;面向云原生环境的安全体系可包含三个层面的安全体制&#xff0c;它们分别是容器安全、编排系统安全和云原生应用安全&#xff0c;下面&#xff0c;我们逐步来讲解这三点&#xff1a; 容器安全 容器环境&#xff0…...

BGP汇总和破解水平分割

一&#xff0c;BGP的宣告问题 在BGP协议中每台运行BGP的设备上&#xff0c;宣告本地直连路由在BGP协议中运行BGP协议的设备来宣告&#xff0c;通过IGP学习到的&#xff0c;未运行BGP协议设备产生的路由&#xff1b; 在BGP协议中宣告本地路由表中路由条目时&#xff0c;将携带本…...

BUG:pm2启动verdaccio报错:Invalid or unexpected toke

输入命令&#xff1a; pm2 state verdaccio 问题描述&#xff1a; pm2 logs verdaccio报错翻译&#xff1a;数据格式错误 导致我呢提原因&#xff0c;没有找到运行文件&#xff0c; 发现问题&#xff1a;因为命令默认查找verdaccio是去系统盘查找。 解决方式 1&#xff1a;…...

Zookeeper笔记

为什么要使用Zookeeper dubbo需要一个注册中心&#xff0c;而Zookeeper是我们在使用Dubbo是官方推荐的注册中心 Zookeeper介绍 Zookeeper的集群机制 Zookeeper是为了其他分布式程序提供服务的&#xff0c;所以不能随便就挂了。Zookeeper的集群机制采取的是半数存活机制。也…...

【视觉SLAM入门】5.1. 特征提取和匹配--FAST,ORB(关键点描述子),2D-2D对极几何,本质矩阵,单应矩阵,三角测量,三角化矛盾

"不言而善应" 0. 基础知识1. 特征提取和匹配1.1 FAST关键点1.2 ORB的关键点--改进FAST1.3 ORB的描述子--BRIEF1.4 总结 2. 对极几何&#xff0c;对极约束2.1 本质矩阵(对极约束)2.1.1 求解本质矩阵2.1.2 恢复相机运动 R &#xff0c; t R&#xff0c;t R&#xff0c;…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

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

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...