news 2026/10/6 1:10:02

DeepSeek API联合调用实战:图像分析+文本生成构建多模态应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek API联合调用实战:图像分析+文本生成构建多模态应用

简介:面向多模态应用开发者的进阶实践资料,围绕DeepSeek图像分析API与文本生成API的联合调用展开,系统讲解如何打破单一模态数据处理局限,实现图像识别、特征提取与高质量文本生成的双通道协作。资源为一枚PDF文档,共21页,容量1.89MB,目录结构清晰完整,内容涵盖多模态开发概述、两个API的功能特性与参数说明、联合调用整体架构与工作流设计、代码实现、优化与性能调优等模块。方案设计了数据输入、图像分析、数据转换与整合、文本生成、结果输出五层架构,并给出异步调用、缓存机制、内存与网络资源管理等多种调优手段。文中共包含智能电商商品推荐、智能旅游导览、智能广告创作三个真实应用场景,配有API密钥获取、开发库安装、请求构建、数据传递错误排查与异常处理等完整排错思路,可直接对照落地。适合已掌握基础API调用、希望在图像理解与文本生成融合方向上进一步进阶的开发者,当前已有111人学习/浏览。

1. 多模态开发进阶的入口:为什么要把两个API拼在一起用

多模态开发这几年从概念走到了落地,而 DeepSeek 图像分析与文本生成 API 的联合调用,正是其中一条很典型的实践路径。单看图像分析,它能告诉你图里有什么;单看文本生成,它能根据一句话写出一段文案。可一旦把两者串起来——先让图像分析识别出一张商品图里的品类、场景和视觉元素,再把结果作为提示词喂给文本生成——你得到的就不只是一句描述,而是一段和图像内容严格对齐的推荐文案、导览解说或广告语。这个 PDF 方案讲的就是这条链路的完整设计,包含五层架构、两个 SDK 的调用细节、参数调优和异常处理。适合正在做电商推荐、智能导览、内容创作类应用的开发者,也适合刚接触 DeepSeek API、想找一个完整范例照着改的人。

2. DeepSeek 图像分析 API:从请求构造到结果解析的完整拆解

图像分析是整个联合调用的第一棒。这一棒跑不好,后面文本生成拿到的提示词就是空中楼阁。这一章我不打算只贴文档里的示例代码,而是把请求怎么构造、返回结果长什么样、哪些字段能直接用于拼接提示词,一个一个讲清楚。

2.1 功能边界:物体识别、场景分类与特征提取分别解决什么问题

DeepSeek 图像分析 API 对外暴露了三类能力:物体识别、场景分类和图像特征提取。这三者的定位完全不同,落到联合调用里的用途也各异。

物体识别返回的是图像中出现的具体实体,比如汽车、行人、树木,通常还会带上置信度和位置坐标。联合调用里最常用的是实体名称列表,因为它可以直接拼进提示词。场景分类则回答“这张图是在哪里拍的”这个问题,返回室内外、街道、海滩这类语义标签。场景信息对文本生成的风格影响很大——一个“办公室”场景和一个“海边日落”场景,生成的文案基调完全不一样。图像特征提取返回的是一组向量或矩阵,更适合做相似度检索或去重,在文本生成链路里用得不多,但如果你做的是商品推荐系统,特征向量可以作为辅助信号加入排序策略。

从调用成本看,三者也不同。analysis_type 参数决定了你实际触发哪些分析模块,如果业务只需要场景标签,就别把 object_recognition 和 feature_extraction 都带上,响应时间和费用都会增加。我一般建议先跑一次完整分析,看返回结果里哪些字段对下游提示词有实际增益,再裁剪 analysis_type 的取值。

2.2 环境准备与密钥管理:两个容易忽略的细节

安装 SDK 这一步文档里只给了一行 pip 命令,实际落地时有两个细节值得注意。

第一个是版本兼容。deepseek-image-analysis-sdk 依赖 requests 和 Pillow,如果你的环境里已经装了旧版 Pillow,可能会出现图像解码异常。常见做法是装完 SDK 后主动升级 Pillow,或者干脆在虚拟环境里重新装一套依赖,避免污染全局环境。

第二个是密钥管理。图像分析和文本生成虽然同属 DeepSeek 平台,但文档建议在开发者控制台分别为两个应用分配密钥。这样做的直接好处是调用量统计清晰——图像分析超限了不影响文本生成,反过来也一样。我在实际项目里还会把密钥写进环境变量而不是硬编码在源码里,部署到服务器后通过配置文件注入,避免代码仓库泄露密钥。

# 安装图像分析 SDK 及依赖库 pip install deepseek-image-analysis-sdk requests Pillow

安装完成后,导入并初始化客户端。注意核对 SDK 版本号,不同版本 Client 的初始化参数略有差异。

import os import deepseek_image_analysis_sdk # 从环境变量读取密钥,避免硬编码 api_key = os.environ.get("DEEPSEEK_IMAGE_API_KEY", "your_api_key") client = deepseek_image_analysis_sdk.Client(api_key=api_key)

这里把密钥读取从常量改成环境变量读取,部署时只需要在服务端设置环境变量,代码本身不携带敏感信息。如果 SDK 版本较老不支持环境变量注入,退一步的做法是在配置文件中单独管理密钥,并把配置文件加入 .gitignore。

2.3 构建请求与解析响应:一段能直接用的图像分析函数

文档里的请求构建是直接传 image_path,但真实项目里图像来源不止本地文件,还有用户上传的 Base64 数据和网络 URL。所以我把请求构建封装了一层,同时支持三种来源。

def analyze_image(image_source, source_type="path"): """ 构建图像分析请求并发送 :param image_source: 图像路径 / URL / Base64 字符串 :param source_type: path / url / base64 :return: 物体列表、场景类别、特征向量 """ # 根据来源类型构造请求参数 if source_type == "path": request = deepseek_image_analysis_sdk.ImageAnalysisRequest( image_path=image_source, analysis_type=["object_recognition", "scene_classification"] ) elif source_type == "url": request = deepseek_image_analysis_sdk.ImageAnalysisRequest( image_url=image_source, analysis_type=["object_recognition", "scene_classification"] ) elif source_type == "base64": request = deepseek_image_analysis_sdk.ImageAnalysisRequest( image_base64=image_source, analysis_type=["object_recognition", "scene_classification"] ) else: raise ValueError("source_type 仅支持 path/url/base64") try: response = client.analyze_image(request) if response.is_success(): result = response.get_result() # 物体识别结果通常是一个列表,每个元素含 name 和 confidence objects = [item.name for item in result.object_recognition if getattr(item, 'confidence', 1.0) > 0.5] # 场景分类结果通常是类别字符串 scene = result.scene_classification.category # 特征字段有些接口默认不返回,按需获取 features = getattr(result, 'image_features', None) return objects, scene, features else: print("图像分析请求失败:", response.get_error_message()) return [], "", None except Exception as e: print("图像分析异常:", str(e)) return [], "", None

这段代码做了几件文档示例里没做的事:按来源类型分支构造请求,适配本地路径、URL 和 Base64 三种输入形态;用置信度阈值过滤低置信度的识别结果,避免把置信度 0.3 的误检物体拼进提示词;对特征向量做了容错,因为不是所有套餐都返回该字段。

参数层面,analysis_type 传的是列表,列表里每个元素对应一个分析模块。如果你只需要场景分类,就把它写成["scene_classification"],响应时间和费用都会降下来。置信度阈值 0.5 是经验值,实际业务中建议先抽样看一批结果,根据误检率调整。

2.4 响应结构里最容易踩的坑:字段类型不一致

图像分析 API 的返回结构在不同版本里有差异,这是文档里没展开但实际最容易翻车的地方。老版本里object_recognition直接返回字符串列表,新版本返回的是对象列表,每个对象有name、confidence和position属性。

如果需要兼容两种版本,可以这样处理:

raw_objects = result.object_recognition if raw_objects and isinstance(raw_objects[0], str): # 老版本:直接是字符串列表 objects = [o for o in raw_objects] elif raw_objects: # 新版本:对象列表 objects = [o.name for o in raw_objects if getattr(o, 'confidence', 1.0) > 0.5] else: objects = []

这种兼容逻辑看起来不起眼,但在生产环境里能少接两个凌晨的报警电话。凡是解析第三方 SDK 的返回结构,我都建议先打印一次原始 JSON,看清楚字段类型再写解析逻辑。

3. DeepSeek 文本生成 API:提示词、温度与风格控制的权衡

图像分析把图像变成了结构化信息,文本生成则负责把结构化信息变成可读的内容。这一章的核心不是 API 怎么调,而是参数怎么配——同样的提示词,temperature 不同,生成结果可能判若两人。

3.1 四个核心参数:prompt、max_length、style、temperature 怎么配合

文本生成 API 的输入参数里,prompt 是唯一必填项,其余三个都是可调项,但它们的组合直接决定了输出质量。

max_length 控制生成内容的上限。注意它限制的是 token 数,不是汉字数。一个汉字在 DeepSeek 的 tokenizer 里大约占 1 到 2 个 token,如果你的需求是生成 200 字的商品描述,max_length 至少得设到 300,留出余量。设得太紧会出现一句话没说完就截断的情况,设得太宽又会拉长响应时间,增加计费。

style 控制的是语气和措辞方向。文档里给的是 formal、casual、humorous 三个取值。实际使用中我发现 formal 风格生成的文本偏书面化,适合商品详情页;casual 适合社交媒体的推广文案;humorous 要看具体场景,商品描述里用幽默风格是双刃剑,用不好会让文案显得轻浮。

temperature 是最需要精细调节的参数,取值范围 0.1 到 1.0。低温度适合事实性内容,比如景点介绍、产品参数说明,生成结果稳定但略显死板;高温度适合创意内容,比如广告语、故事开头,生成结果多样但可能偏离事实。在联合调用场景里,提示词来自图像分析结果,本身是事实性信息,我一般把 temperature 压在 0.4 到 0.6 之间,既能保证内容不跑偏,又保留一点措辞的灵活性。

3.2 调用实例:把图像结构化结果变成风格化文案

import os import deepseek_text_generation_sdk # 初始化文本生成客户端 text_client = deepseek_text_generation_sdk.Client( api_key=os.environ.get("DEEPSEEK_TEXT_API_KEY", "your_text_api_key") ) def generate_text(prompt, max_length=200, style="formal", temperature=0.5): """ 根据提示词生成文本 :param prompt: 输入提示词 :param max_length: 生成文本的最大 token 数 :param style: formal / casual / humorous :param temperature: 随机性控制,0.1~1.0 :return: 生成的文本字符串 """ request = deepseek_text_generation_sdk.TextGenerationRequest( prompt=prompt, max_length=max_length, style=style, temperature=temperature ) try: response = text_client.generate_text(request) if response.is_success(): return response.get_generated_text() else: print("文本生成请求失败:", response.get_error_message()) return "" except Exception as e: print("文本生成异常:", str(e)) return ""

这个函数把文档里的固定参数改成了入参,方便在联合调用时按业务场景动态调整。比如商品描述用 formal 风格、temperature 0.5;社交媒体推广用 casual 风格、temperature 0.7。

3.3 错误处理:从错误消息里定位根因

文本生成 API 的报错集中在三类:密钥无效、输入参数不合法、服务器繁忙。错误处理代码本身不复杂,关键在于不要只打印错误消息,要把请求参数也打印出来,方便回溯是哪一步出了问题。

response = text_client.generate_text(request) if not response.is_success(): error_msg = response.get_error_message() print(f"请求失败: {error_msg}") # 打印关键参数,便于定位问题 print(f"prompt 前50字: {prompt[:50]}") print(f"max_length: {max_length}, style: {style}, temperature: {temperature}")

补上参数回显后,如果报错信息里提到 invalid input parameter,你一眼就能看出是 style 传了枚举之外的取值,还是 temperature 超出了范围。这是排查效率的关键一步,文档里没有写,但生产环境里很实用。

4. 联合调用方案设计:五层架构与数据转换的边界

联合调用不是把两个 API 的代码前后一贴就完事。图像分析返回的是结构化数据,文本生成要的是自然语言提示词,中间这层转换决定了生成内容的质量上限。这一章讲清楚架构分层、提示词构造和异常处理。

4.1 五层架构:数据在这条链路里怎么流转

PDF 里的整体架构分了五层:数据输入层、图像分析层、数据转换与整合层、文本生成层、结果输出层。我按实际编码时的依赖关系重新梳理一遍。

数据输入层接收用户上传的图片或图片 URL,做格式校验和尺寸检查。图像分析层调用 DeepSeek 图像分析 API,把图像变成物体列表和场景标签。数据转换层把物体列表、场景标签组合成一段自然语言描述,这段描述就是后续文本生成的提示词。文本生成层拿到提示词后调用文本生成 API 输出文案。结果输出层做最后的格式包装,可能是 JSON 响应、HTML 片段或纯文本。

这里最关键的是第三层——数据转换与整合层。很多联合调用效果差,问题不在 API 本身,而在于拼接提示词的方式太生硬。比如识别出“桌子、苹果、书”,直接拼接成“在一个场景中有桌子、苹果、书,请描述这个场景”,生成的文本大概率是流水账。转换层要做的是把结构化信息重组为有语义关系的描述。

4.2 提示词构造:从结构化结果到自然语言输入的三种策略

第一种是模板拼接。把物体列表和场景类别嵌入固定模板,比如“在一个 {scene} 场景中,有 {objects},请围绕这些元素生成一段详细描述”。实现最简单,但生成内容千篇一律,适合快速验证链路。

第二种是语义重组。不直接罗列物体,而是按空间关系、主次顺序重新组织语言。比如识别结果是“客厅、沙发、茶几、书本”,重组后可以是“一间现代风格的客厅,沙发上放着一本翻开的书,茶几上散落着几页笔记”。这种提示词生成的文本质量明显更高,但需要额外写一段重组逻辑,或者调用文本生成 API 先把结构化信息扩写成自然语言再走主生成流程。

第三种是业务定制。针对具体场景设计提示词模板。电商场景下的模板可以是“为一张商品图撰写详情页文案,图中包含 {objects},场景为 {scene},文案需突出产品使用体验”;旅游导览场景则换成“基于景点照片中的 {objects} 元素,撰写 200 字的景点介绍”。

def build_prompt(objects, scene, biz_type="generic"): """ 根据业务类型构造提示词 :param objects: 物体名称列表 :param scene: 场景类别 :param biz_type: generic / ecommerce / travel :return: 提示词字符串 """ object_text = "、".join(objects) if objects else "未知元素" scene_text = scene if scene else "未识别场景" templates = { "generic": f"在一个{scene_text}场景中,包含{object_text},请详细描述这个场景。", "ecommerce": ( f"图中展示的是{scene_text}场景下的{object_text}," "请撰写一段商品详情页文案,突出使用场景和产品优势。" ), "travel": ( f"这张景点照片中包含{object_text},场景属于{scene_text}," "请撰写 200 字左右的景点导览介绍,语言生动有画面感。" ) } return templates.get(biz_type, templates["generic"])

这个函数把数据转换层的核心逻辑隔离了出来。后面如果要调整生成风格,只需要改模板,不需要动图像分析或文本生成的调用代码。提示词里的“200 字左右”是给模型的软约束,实际输出长度还要靠 max_length 兜底。

4.3 异常处理与容错机制:让链路在部分失败时不至于整体崩掉

联合调用比单 API 调用多了一层风险——图像分析成功了,但文本生成超时,用户看到的就是一个空响应。我处理这类问题的方式是分级容错。

第一级是重试。文本生成返回服务器繁忙时,等待 1 到 2 秒重试一次,最多重试两次。第二级是降级。文本生成连续失败时,检查图像分析结果是否可用,如果可用,就把模板拼接的提示词直接作为最终输出返回给用户。第三级是缓存。对同一张图片的重复请求,如果短时间内有成功的生成结果,直接返回缓存文本,不再重复调用两个 API。

import time def combined_call_with_retry(image_path, max_retries=2): """ 带重试和降级的联合调用 """ # 第一步:图像分析 objects, scene, _ = analyze_image(image_path) if not objects and not scene: return "图像分析失败,无法生成描述" # 第二步:构造提示词 prompt = build_prompt(objects, scene, biz_type="generic") # 第三步:文本生成,带重试 for attempt in range(max_retries + 1): result = generate_text(prompt, max_length=200, style="formal", temperature=0.5) if result: return result if attempt < max_retries: time.sleep(1.5) # 降级:直接用拼接文本兜底 return f"该场景中发现了{('、'.join(objects))},暂无法生成详细描述。"

降级策略的价值在于,用户至少能看到图像分析的结果,而不是面对一片空白。对面向 C 端的应用来说,一个不完美的回答远比“系统繁忙”更容易接受。

4.4 联合调用的时序与超时预算

两个 API 串行调用意味着整体响应时间是两者之和。图像分析通常需要 1 到 3 秒,文本生成 2 到 5 秒,加起来可能到 8 秒。这在同步请求模式下用户体验会比较差,所以要在架构层面留出超时预算。

我的做法是给每一步设置独立的超时时间,图像分析设 5 秒,文本生成设 8 秒,整体用异步任务包裹。如果总耗时超过 10 秒,先返回一个中间状态给前端,等文本生成完成后再通过轮询或 WebSocket 推送结果。这种设计把长耗时从用户感知里剥离出去,体验会好很多。

5. 联合调用避坑指南:四个高频翻车场景的处理记录

联合调用场景比单 API 调用多了数据转换环节,翻车点也更隐蔽。这一章把我在实际调试中遇到的高频问题按“现象、原因、解决”整理了出来。

5.1 图像分析成功但 objects 列表为空

现象:响应返回 success,但 objects 列表是空的,导致提示词里没有物体信息。

原因:最常见的有两种。一是 analysis_type 没有传 object_recognition,只做了场景分类,所以物体识别结果为空;二是置信度阈值设得太高,真实物体被过滤掉了。

解决:先检查请求参数,确认 analysis_type 包含所需模块;再看置信度阈值,把 0.5 降到 0.3 或 0.4 试试,同时观察识别结果里有没有明显误检的物体。阈值不是越高越好,我一般会抽样 50 张业务图片,统计置信度分布后取一个平衡点。

5.2 文本生成结果与图像内容对不上

现象:图像里是办公场景,生成的文案里出现了沙滩和棕榈树。

原因:提示词只用了物体名称和场景标签,生成模型在低 temperature 下依然出现了语义漂移。本质是提示词里的信息密度不够,模型在“自由发挥”时偏离了约束。

解决:提高提示词的信息约束。一是给提示词加上“严格基于以下信息”的前缀;二是在提示词末尾追加“不要添加图中未出现的元素”;三是把 temperature 从 0.6 降到 0.4。这三步按顺序试,通常第一步就能见效。

5.3 联合调用整体超时

现象:单个 API 响应正常,但联合调用时间超过 10 秒,前端超时。

原因:两个串行请求的耗时累加,加上网络波动,延迟被放大。

解决:分两层处理。在调用层,给每个 API 请求单独设置超时时间,用timeout参数断开长尾请求。在架构层,改为异步执行,主接口先返回处理中状态,后台完成后回调通知前端。降级策略兜底,保证用户不会空手而归。

5.4 同一张图片重复请求导致 API 配额耗尽

现象:测试阶段同一个图片 URL 被反复提交,API 调用量消耗异常快,触发限流。

原因:缺少请求去重和缓存机制。测试脚本或用户频繁点击都会重复触发联合调用,两个 API 的配额都在消耗。

解决:在应用层加缓存,以图片的 MD5 或 URL 为 key,把联合调用的结果缓存到内存或 Redis。对于已缓存的结果直接返回,跳过两个 API 调用。这个优化对生产环境非常关键,既省钱又降低延迟。

import hashlib import redis cache = redis.Redis(host="localhost", port=6379, db=0) def combined_call_cached(image_path, cache_ttl=86400): """ 带缓存的联合调用,减少重复 API 请求 """ # 计算图像内容的哈希值作为缓存 key with open(image_path, "rb") as f: image_hash = hashlib.md5(f.read()).hexdigest() # 检查缓存 cached = cache.get(image_hash) if cached: return cached.decode("utf-8") # 未命中,执行联合调用 objects, scene, _ = analyze_image(image_path) if not objects and not scene: return "" prompt = build_prompt(objects, scene, biz_type="generic") result = generate_text(prompt, max_length=200, style="formal", temperature=0.5) # 写入缓存,默认缓存 24 小时 if result: cache.setex(image_hash, cache_ttl, result) return result

缓存 key 用图像内容的 MD5,而不是文件路径。同一张图即使文件名不同,只要内容一致就能命中缓存。生产环境里如果图片量大,Redis key 要注意设置过期时间,避免缓存膨胀。

6. 从 Demo 到可用:异步改造与批量场景的落地技巧

联合调用代码跑通只是第一步,让它扛住真实流量才是进阶的关键。我自己第一次把这套方案接到电商场景时,最大的教训就是同步调用撑不住并发。

异步改造是首先要做的事。Python 里可以用asyncio把图像分析和文本生成改成异步任务,两个 API 虽然逻辑上有先后(需要先用图像分析结果构造提示词),但分析阶段的请求可以并发处理多张图片。比如一次需要处理 10 张商品图,同步方案需要 10 倍的单张耗时,异步方案可以把这个时间压缩到接近单张耗时的 1.5 倍。

import asyncio async def process_batch(image_paths): """ 批量异步处理图片,图像分析并发执行 """ tasks = [asyncio.to_thread(analyze_image, path) for path in image_paths] results = await asyncio.gather(*tasks) outputs = [] for image_path, (objects, scene, _) in zip(image_paths, results): prompt = build_prompt(objects, scene, biz_type="ecommerce") text = await asyncio.to_thread( generate_text, prompt, 200, "formal", 0.5 ) outputs.append({"image": image_path, "text": text}) return outputs

批量场景下,文本生成请求会集中打到 API 上,要注意限流。我的习惯是加一个简单的信号量控制并发数,控制在 5 到 10 个并发请求以内,超过就排队。信号量的值根据 DeepSeek 接口的限流策略调整,保守一点总没错。

缓存策略在批量场景里收益更明显。同一批商品图里经常有重复元素,图像内容的 MD5 缓存能过滤掉大量重复请求。我把缓存逻辑从单张扩展到了批量场景,先查缓存,再对未命中的图片执行异步联合调用。

从那以后,我每次接到新的多模态联调需求,都会强制走一遍这个流程:先确认返回结构,再构造提示词模板,然后加超时和重试,最后评估缓存和并发。每一步都在给这条链路加固,而不是等到线上报警了才想起来补。希望这套思路对你也有帮助。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 1:09:29

STM32F103与AT24C02的I2C通信详解:从时序到代码实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:09:22

算法题总结274:面试前的高频题库与刷题攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:07:40

如何用好CCNA中文版试题分析PDF:考点拆解与实验复现指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:06:41

基于DeepSeek语义理解的电子病历挖掘与DRG控费实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:05:51

VCC、VDD、VSS、VEE、GND电路电源标识详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:05:49

FPGA实现MIPI CSI-2摄像头图像采集与调试实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华