五分钟读完一篇文章之仿射变换:从矩阵推导到代码实现
1. 仿射变换到底在算什么从矩阵推导到图像处理场景仿射变换Affine Transformation这个词听起来像线性代数课本里的老古董但只要你做过图像裁剪、人脸对齐、OCR 预处理、数据增强甚至只是用手机修图软件拉过一个透视矫正你就已经和它打过交道了。它描述的是二维坐标点之间的线性映射关系核心特征是保持图形的“平直性”和“平行性”——变换前是直线的变换后还是直线变换前平行的两条线变换后依然平行。这个性质决定了它在工程里特别好用因为你可以放心地对图像做旋转、缩放、平移、剪切、翻转而不用担心形状被“扭曲”成不可控的样子。从数学上看仿射变换可以分解成一个线性变换再接一个平移变换。写成公式就是x a*x b*y c y d*x e*y f这里 a、b、d、e 控制旋转、缩放和剪切c、f 控制平移。六个参数就是六个自由度。为了计算方便工程上普遍使用齐次坐标把二维点 (x, y) 扩展成 (x, y, 1)这样平移也能塞进矩阵乘法里[x] [a b c] [x] [y] [d e f] * [y] [1 ] [0 0 1] [1]这个 3x3 矩阵就是仿射变换矩阵。注意最后一行固定是 [0, 0, 1]所以真正需要求解的只有前两行的六个参数。这也解释了为什么三对不共线的对应点就能唯一确定一个仿射变换——每个点提供两个方程三对点就是六个方程刚好解六个未知数。如果对应点超过三对就变成超定方程组通常用最小二乘或 SVD 来求最优解。和透视变换的区别也值得说清楚。仿射变换是二维到二维的映射保持平行性透视变换是二维到三维再投影回二维平行线在变换后可能不再平行但直线仍然是直线。所以做文档扫描矫正时如果只是轻微倾斜仿射变换够用如果是拍摄角度导致的梯形畸变就得用透视变换。在实际工程里仿射变换最常见的落地场景包括图像旋转校正、人脸关键点对齐、数据增强中的随机缩放旋转、OCR 前的文本行矫正、以及批量图像预处理流水线。这些场景的共同点是你需要对大量图片做一致的几何变换而且变换参数往往需要根据每张图的内容动态计算。手动一张张处理不现实所以接下来我会演示怎么用代码实现矩阵运算再通过 TaoToken 统一 Key 调用 API 完成批量处理和结果校验。2. TaoToken 前置准备统一 Key 与 API 接入方式在开始写代码之前先把调用链路搭好。TaoToken 的作用是提供一个统一的 API 入口让你不用为每个模型单独配置 Key 和 Base URL。对于仿射变换这种需要批量处理图像、可能还要调用视觉模型做结果校验的场景统一 Key 能省掉很多切换成本。你需要先拿到一个 API Key。访问 https://taotoken.net/api-keys 创建注意这个页面是 deep link实际使用时建议从控制台进入。创建完成后你会得到一个以sk-开头的字符串这就是你的统一 Key。接下来是 Base URL。TaoToken 的 API 端点是https://taotoken.net/api注意这里不要加 UTM 参数直接使用这个地址作为 OpenAI 兼容接口的 base_url。如果你用的是 OpenAI SDK 或任何兼容 OpenAI 协议的客户端把 base_url 指向这个地址api_key 填你创建的 Key就可以调用支持的模型了。模型 ID 方面TaoToken 支持多种模型具体列表可以在模型对话页面查看https://taotoken.net/models 。对于图像处理相关的任务你可以选择支持视觉输入的模型来做结果校验比如判断变换后的图像是否保持了预期的几何关系。如果你打算长期做编码和 Agent 类任务可以了解一下 Coding Planhttps://taotoken.net/coding-plan 。它适合需要频繁调用 API 做批量处理的场景比按次计费更划算。配置方式有两种一种是在代码里直接写另一种是用环境变量。推荐用环境变量避免 Key 泄露export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用的是 Claude Code 或类似的编码工具可以在 settings 里配置{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key } }注意 Claude Code 使用的是 Anthropic 协议TaoToken 的 API 端点同时兼容 OpenAI 和 Anthropic 两种协议格式具体路径可以参考接入文档https://taotoken.net/doc 。如果你用的是 Cline 或 MCP 类工具配置方式类似核心就是三件套Base URL、Key、Model ID。这里要提醒一点不要把 Key 硬编码在提交到 Git 的代码里。我见过太多因为 Key 泄露导致额度被刷爆的案例。用.env文件加.gitignore是最基本的操作。配置完成后你可以先用一个简单的请求验证连通性import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL] ) response client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: ping}] ) print(response.choices[0].message.content)如果返回正常内容说明 Key 和 Base URL 都配置对了。如果报 401检查 Key 是否复制完整如果报连接错误检查 Base URL 是否写成了https://taotoken.net/api而不是其他路径。3. 可复制配置仿射变换矩阵运算与 API 调用参数这一节直接给可复制的代码和配置。先看仿射变换矩阵的构建和求解再看怎么通过 TaoToken 调用 API 做批量处理。3.1 仿射变换矩阵的构建用 NumPy 构建一个旋转加平移的仿射矩阵import numpy as np def get_rotation_matrix(angle_deg, scale1.0, tx0.0, ty0.0): theta np.deg2rad(angle_deg) cos_t, sin_t np.cos(theta), np.sin(theta) # 3x3 齐次坐标矩阵 M np.array([ [scale * cos_t, -scale * sin_t, tx], [scale * sin_t, scale * cos_t, ty], [0, 0, 1] ], dtypenp.float64) return M M get_rotation_matrix(30, scale1.2, tx50, ty-20) print(M)输出类似[[ 1.0392 -0.6 50. ] [ 0.6 1.0392 -20. ] [ 0. 0. 1. ]]这就是一个包含旋转、缩放、平移的复合仿射矩阵。注意矩阵的第三行始终是 [0, 0, 1]。3.2 从对应点求解仿射矩阵如果你有三对对应点可以直接求解def solve_affine(src_points, dst_points): src_points: [(x1,y1), (x2,y2), (x3,y3)] dst_points: [(x1,y1), (x2,y2), (x3,y3)] 返回 3x3 仿射矩阵 A [] b [] for (x, y), (xp, yp) in zip(src_points, dst_points): A.append([x, y, 1, 0, 0, 0]) b.append(xp) A.append([0, 0, 0, x, y, 1]) b.append(yp) A np.array(A, dtypenp.float64) b np.array(b, dtypenp.float64) # 最小二乘求解 params, _, _, _ np.linalg.lstsq(A, b, rcondNone) a, b_, c, d, e, f params M np.array([[a, b_, c], [d, e, f], [0, 0, 1]]) return M src [(0, 0), (100, 0), (0, 100)] dst [(10, 20), (120, 15), (5, 130)] M solve_affine(src, dst) print(M)这个函数用最小二乘求解即使对应点超过三对也能用。3.3 通过 TaoToken 调用 API 做批量处理假设你有一批图像需要做仿射变换并且想用视觉模型校验变换结果。可以这样组织请求import base64 import json import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL] ) def encode_image(image_path): with open(image_path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def verify_affine_result(image_path, expected_angle): b64 encode_image(image_path) response client.chat.completions.create( modelgpt-4o-mini, messages[ { role: user, content: [ {type: text, text: f这张图是否看起来旋转了大约{expected_angle}度只回答是或否。}, {type: image_url, image_url: {url: fdata:image/png;base64,{b64}}} ] } ], max_tokens10 ) return response.choices[0].message.content.strip()如果你用的是 Claude Code 或 Cline 这类工具可以在配置里指定模型 ID。比如在 Cline 的 MCP 配置中{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }注意这里的三件套Base URL 是https://taotoken.net/apiKey 是你的sk-开头字符串Model ID 根据你实际使用的模型填写。如果你用的是 Codex 的 auth.json 配置格式类似{ api_key: sk-你的Key, base_url: https://taotoken.net/api, model: gpt-4o-mini }配置完成后就可以在代码里批量调用 API 做图像校验了。建议把变换后的图像先保存到本地再逐张发送校验请求避免一次性发送太多导致超时。4. 验证请求与成功结果完整图像变换脚本这一节给一个完整的可运行脚本从读取图像、计算仿射矩阵、执行变换到调用 API 校验结果全部串起来。import cv2 import numpy as np import os import base64 from openai import OpenAI # 初始化 TaoToken 客户端 client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL] ) def get_affine_matrix(angle_deg, scale1.0, tx0.0, ty0.0): theta np.deg2rad(angle_deg) cos_t, sin_t np.cos(theta), np.sin(theta) return np.array([ [scale * cos_t, -scale * sin_t, tx], [scale * sin_t, scale * cos_t, ty] ], dtypenp.float64) def apply_affine(image_path, output_path, angle_deg, scale1.0, tx0.0, ty0.0): img cv2.imread(image_path) if img is None: raise FileNotFoundError(f无法读取图像: {image_path}) h, w img.shape[:2] M get_affine_matrix(angle_deg, scale, tx, ty) # 使用仿射变换输出尺寸保持不变 result cv2.warpAffine(img, M, (w, h), flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue(255, 255, 255)) cv2.imwrite(output_path, result) return output_path def verify_with_api(image_path, expected_angle): with open(image_path, rb) as f: b64 base64.b64encode(f.read()).decode(utf-8) response client.chat.completions.create( modelgpt-4o-mini, messages[ { role: user, content: [ {type: text, text: f这张图是否看起来旋转了大约{expected_angle}度只回答是或否。}, {type: image_url, image_url: {url: fdata:image/png;base64,{b64}}} ] } ], max_tokens10 ) return response.choices[0].message.content.strip() if __name__ __main__: input_img test.jpg output_img test_rotated.jpg angle 30 # 执行仿射变换 apply_affine(input_img, output_img, angle_degangle, scale1.0, tx0, ty0) print(f已生成变换后图像: {output_img}) # 调用 API 校验 result verify_with_api(output_img, angle) print(fAPI 校验结果: {result})运行这个脚本你会看到类似输出已生成变换后图像: test_rotated.jpg API 校验结果: 是如果 API 返回“是”说明变换结果符合预期。如果返回“否”可能是旋转角度计算有误或者图像内容本身不容易判断旋转。这时候可以调整角度参数重新测试。对于批量处理可以把上面的逻辑包一个循环import glob for img_path in glob.glob(images/*.jpg): out_path img_path.replace(images/, output/) apply_affine(img_path, out_path, angle_deg15, scale1.1, tx10, ty5) result verify_with_api(out_path, 15) print(f{img_path} - {result})这样就能一次性处理整个目录的图像并逐张校验。注意 API 调用有频率限制建议加一个time.sleep(0.5)避免触发限流。成功的关键标志是变换后的图像保持直线和平行线性质API 校验返回预期结果批量处理没有报错。如果中间某一步失败下一节会列出常见错误和排查方法。5. 本篇常见错误排查401、local proxy failed、reading choices、OAuth这一节对照真实报错给出排查路径。如果你在配置或调用过程中遇到问题先看这里。401 Unauthorized这是最常见的错误通常意味着 Key 无效或没有正确传递。检查步骤第一确认TAOTOKEN_API_KEY环境变量已经设置并且值是以sk-开头的完整字符串。可以在终端执行echo $TAOTOKEN_API_KEY确认。第二确认 Base URL 写的是https://taotoken.net/api不要多写斜杠或路径。有些客户端会自动拼接/v1如果 Base URL 已经包含了/api最终请求路径可能是https://taotoken.net/api/v1/chat/completions这是正确的。第三如果你用的是 Claude Code 或 Anthropic 协议客户端确认使用的是ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL而不是 OpenAI 的变量名。两者不能混用。local proxy failed这个错误通常出现在你本地配置了代理但代理没有启动或端口不对。TaoToken 的 API 端点可以直接访问不需要额外代理。如果你之前为了其他服务配置了代理检查环境变量HTTP_PROXY和HTTPS_PROXY是否指向了一个不可用的地址。可以临时取消unset HTTP_PROXY unset HTTPS_PROXY然后重新运行脚本。如果问题依旧检查你的网络环境是否能正常访问https://taotoken.net/api。reading choices 报错这个错误通常表现为KeyError: choices或AttributeError: NoneType object has no attribute choices。原因是 API 返回的 JSON 结构不符合预期可能是请求被拒绝或返回了错误信息。排查方法第一打印完整的 response 对象看看返回了什么。可以在代码里加print(response.model_dump_json(indent2))第二检查 model ID 是否正确。如果你填了一个不存在的模型名API 会返回错误而不是 choices。可以在模型对话页面确认可用的模型列表。第三检查请求体格式。OpenAI SDK 会自动处理格式但如果你手动构造 JSON确保messages字段是数组每个元素有role和content。OAuth 相关错误如果你用的是 Claude Code 或类似工具可能会遇到 OAuth 认证失败。TaoToken 使用的是 API Key 认证不需要 OAuth 流程。如果你在配置里看到了 OAuth 相关的选项把它关掉改用 API Key 方式。具体来说在 Claude Code 的 settings 里确保配置的是ANTHROPIC_API_KEY而不是 OAuth token。如果你之前登录过其他服务清除本地缓存的凭证rm -rf ~/.claude/credentials.json然后重新配置 API Key。图像变换结果不符合预期如果 API 校验返回“否”但你觉得变换应该是对的检查以下几点旋转角度是否用了弧度而不是角度图像的原点是在左上角还是左下角cv2.warpAffine的输出尺寸是否和输入一致。另外如果图像背景是白色旋转后边缘会出现白色填充这是正常的。如果希望填充黑色把borderValue改成(0, 0, 0)。批量处理时超时如果处理大量图像时出现超时建议把批量任务拆成小批次每批 10-20 张批次之间加time.sleep(1)。另外可以把图像先缩放到较小尺寸再发送校验请求减少传输时间。排查完这些常见问题大部分配置和调用障碍都能解决。如果还是不行可以查阅接入文档https://taotoken.net/doc 里面有更详细的协议说明和示例。6. 从矩阵到落地仿射变换的工程经验与 API 调用建议仿射变换的数学部分其实不复杂六个参数、三对点、最小二乘这些在 NumPy 里几行代码就能搞定。真正容易踩坑的是工程落地环节图像坐标系的方向、变换后的边界填充、批量处理时的 API 调用节奏、以及结果校验的可靠性。我自己的经验是先把矩阵运算在本地跑通用一张测试图验证旋转、缩放、平移的效果确认无误后再接入 API 做批量处理。API 调用部分建议把校验逻辑做成可开关的选项因为不是每次变换都需要模型校验——如果变换参数是确定的本地检查几个关键点就够了只有当变换参数来自不确定的来源比如用户上传的图片自动估计时才需要模型介入做语义级别的校验。另外TaoToken 的统一 Key 在批量场景下确实方便不用为每个模型单独管理凭证。如果你要做长期的图像处理流水线可以考虑把 API 调用封装成一个独立的服务用队列来管理请求避免并发过高导致限流。模型选择上校验任务用轻量模型就够了没必要上最贵的毕竟只是判断“是否旋转了大约 30 度”这种简单问题。最后提醒一点仿射变换保持平行性但不保持长度和角度。如果你需要保持角度那得用相似变换如果需要保持平行性但允许剪切仿射变换就是最合适的选择。理解这个边界能帮你在实际项目中选对工具。

相关新闻

COPY 顺序错一步,Docker build 缓存全失效:6 分钟重建到 40 秒

COPY 顺序错一步,Docker build 缓存全失效:6 分钟重建到 40 秒

本文摘要:改一行业务代码就触发依赖重装,本地与 CI 构建都要等上数分钟。把依赖清单 COPY 提前并缩小输入集,缓存只在依赖清单变动时才失效。该做法只对依赖清单稳定的项目有效,依赖频繁变动时收益有限。 一、问题与结论 一个 Fa…

2026/10/9 2:28:35 阅读更多 →
Windows 环境下把 skill.md 变成 Claude Code 写作 Skill 的完整路线:TaoToken 统一 Key 配置与 PowerShell 验证

Windows 环境下把 skill.md 变成 Claude Code 写作 Skill 的完整路线:TaoToken 统一 Key 配置与 PowerShell 验证

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

2026/10/9 2:28:35 阅读更多 →
Kubernetes 网关实现简单说明:从 Ingress 到 Gateway API 的落地路径

Kubernetes 网关实现简单说明:从 Ingress 到 Gateway API 的落地路径

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

2026/10/9 2:28:35 阅读更多 →

最新新闻

Java共享自习室系统实战:Spring Boot、MyBatis与座位并发管理

Java共享自习室系统实战:Spring Boot、MyBatis与座位并发管理

简介:基于Java的共享自习室系统是一份面向高校学生和Java初学者的毕业设计完整项目,聚焦自习室预约与资源管理,从用户注册登录、自习室信息维护、预约规则设计到提醒通知均有实现,覆盖需求分析、数据库设计、接口开发、前端交互和…

2026/10/9 3:01:51 阅读更多 →
IP改编剧本生成:深度思考模型提示词工程实战指南

IP改编剧本生成:深度思考模型提示词工程实战指南

简介:本资源是一份面向影视编剧、AI内容创作者及IP开发从业者的专业指南,聚焦深度思考模型(如DeepSeek)在文学、动漫、游戏等IP改编场景中的提示词工程实践。文档系统梳理了提示词设计原则、优化策略、自动化脚本开发、与剧本写作…

2026/10/9 3:01:51 阅读更多 →
Hermes Agent vs OpenClaw 深度对比:架构、记忆、安全与生态选型指南(TaoToken 视角)

Hermes Agent vs OpenClaw 深度对比:架构、记忆、安全与生态选型指南(TaoToken 视角)

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

2026/10/9 3:01:51 阅读更多 →
Zed 编辑器:当你的光标会「读心术」,还养了一只猫当 UI 设计师——用 TaoToken 统一 Key 打通 Cursor 与 Zed 的 AI 补全

Zed 编辑器:当你的光标会「读心术」,还养了一只猫当 UI 设计师——用 TaoToken 统一 Key 打通 Cursor 与 Zed 的 AI 补全

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

2026/10/9 3:01:51 阅读更多 →
starrtc-web私有云部署:WebRTC信令与媒体链路实践

starrtc-web私有云部署:WebRTC信令与媒体链路实践

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

2026/10/9 3:01:51 阅读更多 →
DeepSeek+Coze AI获客智能体实战:从意图识别到工作流编排

DeepSeek+Coze AI获客智能体实战:从意图识别到工作流编排

简介:这份资源围绕DeepSeek与Coze组合,系统讲解从0到1搭建AI获客智能体的完整流程,面向传统行业中小老板、创业者与个人IP、销售运营人员,帮助解决短视频创作与获客难题。内容涵盖智能体定位与目标、业务流程梳理与痛点分析、场景…

2026/10/9 3:00:51 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/7 13:34:55 阅读更多 →