计算机视觉算法实现——SAM实例分割:原理、实现与应用全景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨
✨个人主页欢迎您的访问 ✨期待您的三连 ✨
✨个人主页欢迎您的访问 ✨期待您的三连✨

1. 实例分割领域概述
实例分割(Instance Segmentation)是计算机视觉领域最具挑战性的任务之一,它要求算法不仅能识别图像中的每个物体类别,还要精确区分同一类别中的不同个体实例。与语义分割(Semantic Segmentation)只关注像素级分类不同,实例分割需要同时完成物体检测和像素级分割两项任务,为每个独立物体实例生成精确的掩模(mask)。
在众多实例分割算法中,Meta AI于2023年推出的Segment Anything Model(SAM)引起了业界轰动。SAM以其零样本迁移能力和强大的泛化性能重新定义了图像分割的边界,被誉为"计算机视觉领域的GPT-3时刻"。该模型在1100万张图像和11亿个掩模的庞大数据集上训练,能够对任何图像中的任何物体进行分割,即使这些物体类别在训练数据中从未出现过。
实例分割技术已广泛应用于自动驾驶、医学影像分析、遥感图像解译、工业质检等领域。SAM的出现进一步降低了图像分割的技术门槛,使开发者无需针对特定领域训练专用模型,即可获得令人惊艳的分割效果。
2. SAM算法基本原理剖析
2.1 SAM的核心架构
SAM采用三模块设计理念,将复杂的分割任务分解为可协同工作的三个组件:
-
图像编码器(ViT-H):基于Vision Transformer的庞大主干网络,将输入图像编码为高维特征表示。具体使用ViT-H/16架构(参数量632M),处理1024×1024输入图像,输出64×64的嵌入向量。
-
提示编码器(Prompt Encoder):处理各种形式的用户交互提示(点、框、文本等),将其映射为与图像特征空间对齐的向量表示。支持:
-
稀疏提示(点、框):通过位置编码处理
-
密集提示(掩模):通过卷积层处理
-
-
轻量级掩模解码器(Mask Decoder):将图像嵌入和提示嵌入结合,动态预测目标掩模。采用类似Transformer的双向注意力机制,在仅0.1秒内即可生成高质量分割结果。
2.2 突破性技术特点
SAM的创新之处主要体现在三个方面:
-
提示工程(Promptable Segmentation):通过点、框、文本等多样化提示方式引导模型生成目标掩模,极大提升了人机交互灵活性。
-
分割一切(Zero-shot Transfer):得益于海量训练数据,SAM能分割训练时未见过的物体类别,在多个领域达到接近甚至超过专用模型的性能。
-
三模态输出:对于每个提示,SAM同时输出:
-
多个有效掩模(考虑分割歧义)
-
每个掩模的置信度分数
-
分割区域的稳定特征表示
-
2.3 训练方法论
SAM的训练过程采用可提示分割任务模拟实际应用场景:
-
从人工标注的掩模中随机采样提示(如点、框)
-
要求模型根据提示预测掩模
-
使用组合损失函数(包括掩模损失和IoU预测损失)优化模型
损失函数公式:

3. 数据集资源大全
3.1 官方SA-1B数据集
Meta发布的Segment Anything 1 Billion(SA-1B)数据集是迄今最大的分割数据集:
-
1100万张多样化图像
-
11亿个高质量掩模标注
-
平均每张图像包含100个标注对象
-
图像分辨率高达1500×2250
下载链接(需申请许可):
https://ai.facebook.com/datasets/segment-anything/
3.2 替代开源数据集
当SA-1B访问受限时,可考虑以下优质替代资源:
-
COCO 2017(通用物体分割)
-
118K训练图像,5K验证图像
-
80个物体类别,1.5M实例标注
-
下载:COCO - Common Objects in Context
-
-
LVIS v1.0(长尾分布分割)
-
1203个类别,超过2M高质量掩模
-
特别关注稀有物体类别
-
下载:LVIS
-
-
ADE20K(场景解析)
-
25K图像,覆盖150个场景类别
-
对象边界标注极为精细
-
下载:ADE20K dataset
-
3.3 数据预处理示例代码
import numpy as np
import torch
from torchvision import transforms
from PIL import Imageclass SAMDataProcessor:def __init__(self, image_size=1024):self.image_size = image_sizeself.transform = transforms.Compose([transforms.Resize((image_size, image_size)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])def process_image(self, image_path):"""处理输入图像为SAM所需格式"""image = Image.open(image_path).convert("RGB")original_size = image.size # (W,H)# 应用变换image_tensor = self.transform(image)# 生成缩放因子(用于将提示坐标还原到原图尺寸)scale_factors = (original_size[0] / self.image_size,original_size[1] / self.image_size)return {"image": image_tensor.unsqueeze(0), # 添加batch维度"original_size": original_size,"scale_factors": scale_factors}def process_prompt(self, prompt, scale_factors):"""处理用户提示(点/框)为模型输入格式"""if isinstance(prompt, tuple): # 点提示 (x,y)point = np.array([[prompt[0]/scale_factors[0], prompt[1]/scale_factors[1]]])return {"point_coords": torch.as_tensor(point, dtype=torch.float),"point_labels": torch.ones(1, dtype=torch.int) # 前景点}elif isinstance(prompt, list): # 框提示 [x1,y1,x2,y2]box = np.array([prompt[0]/scale_factors[0],prompt[1]/scale_factors[1],prompt[2]/scale_factors[0],prompt[3]/scale_factors[1]])return {"boxes": torch.as_tensor(box[None,:], dtype=torch.float)}else:raise ValueError("提示类型必须是点(x,y)或框[x1,y1,x2,y2]")
4. 完整代码实现
4.1 环境配置
pip install torch torchvision opencv-python matplotlib
pip install git+https://github.com/facebookresearch/segment-anything.git
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth # 下载预训练权重
4.2 SAM实例分割全流程实现
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
from segment_anything import sam_model_registry, SamPredictorclass SAMSegmenter:def __init__(self, model_type="vit_h", checkpoint_path="sam_vit_h_4b8939.pth", device="cuda"):"""初始化SAM分割器参数:model_type: 模型类型(vit_h/vit_l/vit_b)checkpoint_path: 模型权重路径device: 运行设备(cuda/cpu)"""self.device = torch.device(device if torch.cuda.is_available() else "cpu")self.model = sam_model_registry[model_type](checkpoint=checkpoint_path)self.model.to(self.device)self.predictor = SamPredictor(self.model)self.result_cache = {}def set_image(self, image_path):"""设置待分割图像"""image = cv2.imread(image_path)self.image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)self.predictor.set_image(self.image)self.result_cache.clear() # 清除之前的结果缓存def segment_with_prompt(self, prompt, multimask=True):"""根据提示进行分割参数:prompt: 可以是点(x,y)、框[x1,y1,x2,y2]或掩模multimask: 是否输出多个可能掩模返回:masks: 分割掩模数组(H,W,N)scores: 每个掩模的置信度logits: 低分辨率掩模logits(可用于细化)"""if isinstance(prompt, tuple): # 点提示input_point = np.array([prompt])input_label = np.array([1]) # 前景点masks, scores, logits = self.predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=multimask)elif isinstance(prompt, list): # 框提示input_box = np.array(prompt)masks, scores, logits = self.predictor.predict(box=input_box,multimask_output=multimask)else:raise ValueError("提示类型必须是点(x,y)或框[x1,y1,x2,y2]")# 缓存结果key = str(prompt)self.result_cache[key] = {"masks": masks,"scores": scores,"logits": logits}return masks, scores, logitsdef show_results(self, prompt, mask_index=0):"""可视化分割结果"""key = str(prompt)if key not in self.result_cache:raise ValueError("请先对当前提示执行分割")masks = self.result_cache[key]["masks"]scores = self.result_cache[key]["scores"]plt.figure(figsize=(15,10))plt.imshow(self.image)self._show_mask(masks[mask_index], plt.gca())if isinstance(prompt, tuple): # 点提示plt.scatter(prompt[0], prompt[1], color='red', marker='*', s=200, edgecolor='white')elif isinstance(prompt, list): # 框提示x1, y1, x2, y2 = promptplt.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], color='green', linewidth=2)plt.title(f"Mask {mask_index}, Score: {scores[mask_index]:.3f}", fontsize=16)plt.axis('off')plt.show()def _show_mask(self, mask, ax, random_color=False):"""在图像上叠加显示掩模"""color = np.array([30/255, 144/255, 255/255, 0.6])h, w = mask.shape[-2:]mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)ax.imshow(mask_image)def auto_segment(self, points_per_side=32, pred_iou_thresh=0.88):"""自动分割图像中的所有对象基于SAM的自动掩模生成功能参数:points_per_side: 采样的点数pred_iou_thresh: 掩模质量阈值返回:segments: 分割结果列表[{'segmentation':mask, 'area':int, ...}]"""from segment_anything import SamAutomaticMaskGeneratormask_generator = SamAutomaticMaskGenerator(model=self.model,points_per_side=points_per_side,pred_iou_thresh=pred_iou_thresh,stability_score_thresh=0.92,crop_n_layers=1,crop_n_points_downscale_factor=2,min_mask_region_area=100)segments = mask_generator.generate(self.image)segments = sorted(segments, key=lambda x: x['area'], reverse=True)# 可视化所有分割结果plt.figure(figsize=(15,15))plt.imshow(self.image)for seg in segments:self._show_mask(seg['segmentation'], plt.gca(), random_color=True)plt.axis('off')plt.show()return segments# 使用示例
if __name__ == "__main__":# 初始化分割器segmenter = SAMSegmenter()# 加载测试图像image_path = "example.jpg"segmenter.set_image(image_path)# 点提示分割point_prompt = (500, 300) # 图像中的(x,y)坐标masks, scores, _ = segmenter.segment_with_prompt(point_prompt)segmenter.show_results(point_prompt)# 框提示分割box_prompt = [100, 100, 800, 600] # [x1,y1,x2,y2]masks, scores, _ = segmenter.segment_with_prompt(box_prompt)segmenter.show_results(box_prompt)# 自动分割所有对象segments = segmenter.auto_segment()print(f"发现{len(segments)}个独立对象")
4.3 代码架构解析
-
SAMSegmenter类:封装了SAM的核心功能,提供简洁易用的接口
-
set_image():准备待分割图像 -
segment_with_prompt():基于交互提示执行分割 -
auto_segment():自动分割图像中所有显著对象
-
-
可视化工具:集成Matplotlib实现结果可视化
-
支持点、框提示的标注显示
-
掩模叠加显示与透明度控制
-
-
自动掩模生成:利用SAM的网格点采样策略,实现全自动分割
-
多掩模处理:支持同时处理并可视化多个候选掩模
5. 前沿论文与研究进展
5.1 奠基性论文
-
《Segment Anything》(Meta AI,ICCV 2023)
-
论文链接:[2304.02643] Segment Anything
-
代码仓库:https://github.com/facebookresearch/segment-anything
-
核心贡献:提出提示式分割范式,建立SA-1B数据集,实现零样本迁移能力
-
-
《Fast Segment Anything》(复旦大学,2023)
-
论文链接:[2306.12156] Fast Segment Anything
-
核心贡献:优化SAM架构,推理速度提升50倍,参数量减少100倍
-
5.2 领域应用论文
-
《Medical SAM Adapter》(清华大学,Nature Medicine 2023)
-
论文链接:Precise, pragmatic and inclusive: the modern era of oncology clinical trials | Nature Medicine
-
核心贡献:将SAM适配到医学影像分割,在20种CT/MRI模态上达到SOTA
-
-
《Track Anything》(中科院,NeurIPS 2023)
-
论文链接:https://arxiv.org/abs/2305.20651
-
核心贡献:结合SAM与视频目标跟踪,实现高效视频对象分割
-
5.3 改进方向论文
-
《Edge-SAM》(MIT,CVPR 2024)
-
论文链接:[2312.06660] EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM
-
核心贡献:专为边缘设备优化的SAM变体,内存占用减少80%
-
-
《Text2Seg》(Google Research,ICLR 2024)
-
论文链接:[2401.02320] Amplification of supersonic micro-jets by resonant inertial cavitation-bubble pair
-
核心贡献:增强SAM的文本提示能力,实现开放词汇分割
-
6. 实际应用场景
6.1 医学影像分析
SAM在医疗领域展现出惊人潜力:
-
放射影像分割:自动分割CT/MRI中的器官、病变区域
-
病理切片分析:精确标记癌细胞区域,辅助癌症诊断
-
手术导航:实时分割手术视野中的关键解剖结构
案例:在乳腺超声图像中,仅需点击肿块中心,SAM即可精确分割肿瘤边界,准确率超过90%。
6.2 遥感图像解译
地理信息系统(GIS)中的创新应用:
-
地物分类:自动提取建筑物、道路、水体等地表特征
-
变化检测:比对不同时期图像,识别地表变化
-
灾害评估:快速分割洪水、火灾等灾害影响区域
数据:在0.5米分辨率的卫星图像上,SAM对建筑物的IoU达到0.85。
6.3 工业质检
制造业中的质量控制系统:
-
缺陷检测:分割产品表面的划痕、凹陷等缺陷
-
零件定位:精确定位装配线上的关键部件
-
尺寸测量:基于分割结果进行非接触式精密测量
效益:某汽车厂采用SAM后,质检效率提升300%,误检率降低50%。
6.4 增强现实(AR)
交互体验提升:
-
实时对象分割:在AR眼镜中即时分离前景对象
-
虚拟试穿:精确分割身体部位实现服装虚拟展示
-
场景理解:识别并分割环境中的可交互元素
性能:在移动设备上实现30FPS的实时分割性能。
7. 未来研究方向
7.1 当前技术局限
尽管SAM表现卓越,仍存在以下挑战:
-
小物体分割:对小于图像面积1%的对象分割精度不足
-
透明/反光物体:对玻璃、金属等特殊材质分割效果差
-
计算资源需求:ViT-H模型需要16GB GPU内存才能流畅运行
-
语义理解有限:无法理解"分割第三排书架上的书本"这类复杂指令
-
视频时序一致性:帧间分割结果缺乏连续性
7.2 重点改进方向
-
轻量化架构设计
-
知识蒸馏:用大模型训练小模型
-
量化压缩:8/4-bit低精度推理
-
动态网络:根据输入复杂度调整计算量
-
-
多模态提示增强
-
文本提示:支持自然语言描述
-
语音交互:通过语音指令引导分割
-
手势识别:结合AR/VR的交互方式
-
-
时序一致性优化
-
光流引导:利用运动信息稳定视频分割
-
记忆机制:维护跨帧的对象表征
-
3D感知:结合深度信息提升空间一致性
-
-
领域自适应技术
-
小样本微调:使用少量标注数据适配特定领域
-
无监督域适应:解决训练-测试数据分布差异
-
测试时优化:在推理阶段动态调整模型
-
-
开放世界理解
-
属性识别:分割同时识别物体属性
-
关系推理:理解对象间空间/语义关系
-
常识整合:融入常识知识提升分割逻辑性
-
7.3 潜在突破点
-
神经符号结合:将深度学习的感知能力与符号系统的推理能力结合
-
物理引擎集成:利用物理规律约束分割结果合理性
-
终身学习框架:使模型能持续学习新概念而不遗忘旧知识
-
人机协作分割:设计更高效的交互式分割工作流
-
通用视觉系统:迈向统一的多任务视觉理解模型
8. 结语
Segment Anything Model的出现标志着计算机视觉领域的一个重要转折点,它首次实现了真正通用的图像分割能力。通过本文的技术剖析、代码实现和应用展望,我们可以看到SAM不仅是一个强大的工具,更为整个领域开辟了新的研究方向。
未来,随着模型轻量化、交互多元化和应用垂直化的发展,SAM及其衍生技术将深刻改变医疗诊断、工业质检、遥感分析等多个领域的工作方式。特别是在与大型语言模型(LLM)结合后,有望实现"以自然语言描述任何视觉任务"的终极目标。
对于研究者和开发者而言,现在正是探索SAM潜力的最佳时机。无论是改进其核心架构,还是开发垂直应用,亦或是探索其理论基础,都存在大量创新机会。让我们共同期待并参与这场由SAM引发的计算机视觉革命。
相关文章:
计算机视觉算法实现——SAM实例分割:原理、实现与应用全景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 实例分割领域概述 实例分割(Instance Segmentation)是计算机视觉领域最具挑战性的任务之一,…...
基于SpringBoot的宠物健康咨询系统(源码+数据库+万字文档)
502基于SpringBoot的宠物健康咨询系统,系统包含三种角色:管理员、用户,顾问主要功能如下。 【用户功能】 1. 首页:查看系统主要信息和最新动态。 2. 公告:浏览系统发布的公告信息。 3. 顾问:浏览可提供咨询…...
vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值
项目场景: <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …...
pgsql:关联查询union(并集)、except(差集)、intersect(交集)
pgsql:关联查询union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客...
CCF CSP 第35次(2024.09)(2_字符串变换_C++)(哈希表+getline)
CCF CSP 第35次(2024.09)(2_字符串变换_C) 解题思路:思路一(哈希表getline): 代码实现代码实现(思路一(哈希表getline)): …...
PostgreSQL 的 COPY 命令
PostgreSQL 的 COPY 命令 PostgreSQL 的 COPY 命令是高效数据导入导出的核心工具,性能远超常规 INSERT 语句。以下是 COPY 命令的深度解析: 一 COPY 命令基础 1.1 基本语法对比 命令类型语法示例执行位置文件访问权限服务器端COPYCOPY table FROM /p…...
Docker--利用dockerfile搭建mysql主从集群和redis集群
Docker镜像制作的命令 链接 Docker 镜像制作的注意事项 链接 搭建mysql主从集群 mysql主从同步的原理 MySQL主从同步(Replication)是一种实现数据冗余和高可用性的技术,通过将主数据库(Master)的变更操作同步到一个…...
Context的全面解析:在不同技术应用中的通用作用与差异
Context的全面解析:在不同技术应用中的通用作用与差异 引言: 在软件开发中,“Context”这个概念被广泛使用。它不仅限于某个特定的技术或编程语言,实际上,Context 作为一种抽象的设计模式,贯穿在许多开发领…...
蓝桥杯嵌入式考前模块总结
一.RTC 使用RTC直接再cubeMX中配置启动时钟和日历 如第六届省赛 想要让RTC的秒每隔一秒递增1需要在时钟树界面观察RTC的主频 由于RTC时钟主频为32KHZ将异步预分频计数器的值设为31,将同步预分频计数器的值设为999这样就可以将RTC的时钟信号分频为1HZ达到1秒自增的…...
关于举办“2025年第五届全国大学生技术创新创业大赛“的通知
赛事含金量 大赛获奖即可有机会为你的大学里的“创新创业”加分!这是每个大学要求必须修满的学分! 中国“互联网+”大学生创新创业大赛磨刀赛!“挑战杯”中国大学生创业计划大赛必参赛! 国赛获奖,“互联…...
spark安装过程问题
1. Spark-local模式 - 适用于单节点环境,无需启动Hadoop集群。 - 实验步骤包括解压文件、启动Local环境、运行命令行工具、提交测试应用等。 - 通过bin/spark-shell启动本地环境,通过sc.textFile等命令测试功能。 - 提交应用时使用--master loca…...
Ingress蓝绿发布
Ingress蓝绿发布 Ingress常用注解说明yaml资源清单绿色版本yml资源清单蓝色版本yaml资源清单 主Ingress金丝雀Ingress基于客户端请求头的流量切分结果验证 基于客户端来源IP的流量切分结果验证 基于服务权重的流量切分结果验证 基于IP来源区域来切分IP---方案未验证基于User-Ag…...
基于AOP+Log4Net+AutoFac日志框架
1.项目概述 这是一个基于 C# 的 WPF 项目 WpfApp12log4net,它综合运用了依赖注入、日志记录和接口实现等多种技术,同时使用了 Autofac、Castle.Core 和 log4net 等第三方库。 2.配置log4net 新建一个Log4Net.config,配置需要记录的日志信息…...
python推箱子游戏
,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…...
华为hcie证书的有效期怎么判断?
在ICT行业,华为HCIE证书堪称含金量极高的“敲门砖”,拥有它往往意味着在职场上更上一层楼。然而,很多人在辛苦考取HCIE证书后,却对其有效期相关事宜一知半解。今天,咱们就来好好唠唠华为HCIE证书的有效期怎么判断这个关…...
关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结
以下是关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结: 1. Docker 核心概念 概念描述关系镜像(Image)预定义的只读模板,包含运行环境和配置(…...
PowerBI 条形图显示数值和百分比
数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品,会被筛选,所以用ALLSELECTED来获取当前筛选条件下,Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…...
基于YOLOv8的火车轨道检测识别系统:技术实现与应用前景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言:火车轨道检测领域概述 铁路运输作为国民经济的大动脉,其安全运行至关重要…...
css使用mix-blend-mode的值difference实现内容和父节点反色
1. 使用场景 往往开发过程中,经常遇到产品说你这个背景图和文字颜色太接近了,能不能适配下背景图,让用户能够看清具体内容是啥。 这么说吧,这种需求场景非常合理,因为你做开发就是要给用户一个交代,给他们…...
【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘
对象的创建 1.类加载检查 虚拟机遇到一条new的指令,首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行类的加载过程。 2.分配内存 在类…...
Pytest多环境切换实战:测试框架配置的最佳实践!
你是否也遇到过这种情况:本地测试通过,一到测试环境就翻车?环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹,随时引爆你的测试流程! 测试人员每天都跟不同的环境打交道࿰…...
单细胞多组学及空间组学数据分析与应用
一、引言 生命科学研究正处于快速发展的阶段,随着技术的不断革新,对生物系统的理解也在逐步深入到单细胞和空间层面。单细胞多组学及空间组学技术应运而生,它们突破了传统研究手段在细胞异质性和空间结构解析上的局限,为我们打开…...
[ctfshow web入门] web39
信息收集 题目发生了微妙的变化,只过滤flag,include后固定跟上了.php。且没有了echo $flag;,虽说本来就没什么用 if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){include($c.".php");} }else{…...
HarmonyOS-ArkUI 装饰器V2 @ObservedV2与@Trace装饰器
参考文档: 文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-new-observedv2-and-trace-V14#trace%E8%A3%85%E9%A5%B0%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84由于V2的装饰器比V1的装饰器更加易用,尽管学习的过程中用到的都是V1的装饰器,但…...
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系 在Spring框架的演进长河中,配置方式始终是开发者需要掌握的核心技能。从早期XML一统天下的严谨规范,到注解驱动的敏捷开发,再到如今Java Config的优雅实践&am…...
基于ImGui+FFmpeg实现播放器
基于ImGuiFFmpeg实现播放器 演示: ImGui播放器 继续研究FFmpeg,之前做了一个SDL的播放器,发现SDL的可视化UI界面的功能稍微差了点,所以今天我们换了一个新的工具,也就是ImGui。 ImGui官方文档:https://g…...
python的web框架flask(hello,world版)
问题 最近需要基于一个开源项目进行二次开发,但是,现在的我主修java,从来没有接触过python的web开发。所以,我现在需要学习一下flask的hello,world。 python版本选择 通过这个Python版本状态页面Status of Python v…...
Java面试39-Zookeeper中的Watch机制的原理
Zookeeper是一个分布式协调组件,为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构,以节点的方式来管理存储在Zookeeper上的数据。 Zookeeper提供了一个Watch机制,可以让客户端感知到Zooke…...
同时打开多个Microchip MPLAB X IDE
0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具,使用的MCU是Microchip SAMD21J18A MCU…...
达梦数据库使用druid提示:dbType not support : dm
简单处理: 移除wall即可 (但是用druid那都希望能用上它的功能的,不然为什么不用其他没带检查的jdbc呢。) 中等复杂处理: druid 是阿里开源的项目,所以去github上找对应版本的源码下载:https:/…...
