水星工业相机开发实战:从SDK配置到稳定采集的完整指南
接到这个开发任务的时候我其实有点懵——对方只丢给我一台水星系列工业相机说“你把它接入系统能采图就行”。等我把相机真正跑起来才发现工业相机和消费级摄像头完全是两个物种。这个系列因体积小、接口丰富在很多视觉项目里都能看到。如果你正准备用这类相机做图像采集或者已经在开发中反复横跳这篇记录应该能帮你少走不少弯路。水星相机本质上是一台工业相机它的开发思路和看视频流的USB摄像头完全不同不是插上就出画面而是需要SDK驱动的枚举、连接、参数配置、取流、释放一整套流程。这篇文章会把我从零开始接到相机、到最终稳定运行项目中间的所有关键步骤、踩坑经历和性能优化思路完整列出来希望对做视觉集成、自动化检测或者实验成像的朋友有实际参考价值。1. 水星相机到底特殊在哪开发前先把这些概念理顺1.1 工业相机 vs 普通摄像头差的不是画质是控制力很多人第一次拿到水星相机会用消费级摄像头的思维去试结果发现插上电脑根本不出图。这是因为工业相机默认没有“即插即用”的UVC协议它需要自己的SDK去枚举设备、设置参数、抓取图像。和手机摄像头比工业相机最大的差异在于触发能力支持外部硬触发信号可以和PLC、传感器联动做到“一有信号就拍一张”而不是无脑连续出图。帧率稳定性在机器视觉里帧率必须均匀掉帧意味着检测结果不可信。工业相机的数据链路和缓冲机制都围绕这个目标设计。像素格式和深度冲像不是简单的RGB可能输出Raw、Mono8、Mono12、Bayer等格式需要开发者自己处理。精确曝光控制曝光时间不是“自动”那么简单而是精确到微秒级方便配合光源频闪。1.2 水星相机常见的接口与选型判断水星系列最常见的接口是GigE千兆以太网和USB3.0也有少数带着CameraLink等特殊接口的但普通项目里基本是前两者。我这次拿到的是GigE接口型号所以后面大部分经验都围绕它展开。在选择接口时你需要根据实际使用场景判断接口类型优点缺点典型场景GigE传输距离长可达100米布线方便支持多相机组网依赖网卡性能和网络配置带宽受限于千兆/万兆工厂产线、分散布局USB3.0即插即用价格相对低带宽比千兆稍高一点线缆长度受限一般5米以内多相机占用多通道桌面级视觉、实验台、移动设备如果你要在实验室里快速验证算法USB3.0会更省心。但如果要上产线GigE几乎是标配因为可以拉很长的线也不容易接触不良。1.3 为什么选水星做项目前我也对比过其他方案市场上的工业相机品牌很多选定水星系列我主要考虑了几个点SDK完整度水星的SDK覆盖C、C、C#、Python等主流语言对二次开发比较友好。资料中文居多工业相机领域很多资料是英文的但国产系列容易找到中文示例遇到问题可以快速搜到解决方案。性价比在同样靶面、同样分辨率条件下水星系列的价格比进口品牌低不少对成本敏感的项目很友好。一致性同一系列不同型号的SDK接口基本一致后续从几十万像素升级到几百万像素代码改动很小。当然这把不是绝对的。如果你的项目对稳定性要求极高且供应链完全不设限也可以考虑其他进口方案。但如果你需要快速落地水星会是很好的起步选择。2. 环境准备驱动、SDK、网络配置一步错步步错2.1 软件环境搭建这些坑你大概率会碰到Windows系统环境下最稳妥的办法是直接装厂家提供的完整SDK驱动包。注意安装时要把所有组件都装上尤其是“Runtime”和“Device Driver”有些精简安装会漏掉GigE相机的网卡驱动导致相机死活枚举不到。开发语言我建议优先选C或PythonC适合做产线级应用运行效率高和图像处理库如OpenCV衔接方便。Python适合原型验证、算法调试开发速度快。但要注意Python调用SDK时图像数据需要做内存拷贝吞吐量大的时候可能成为瓶颈。我这次先用Python验证了整套流程再用C#封装成服务给上位机调用。如果你刚开始建议也按这个思路先用脚本跑通流程再用编译型语言做正式版本。2.2 GigE相机的网络配置枚举不到设备时的第一检查点GigE相机和电脑直连时最容易出的问题是IP地址不在同一网段。水星相机的默认IP有可能是192.168.x.x而你的电脑网卡配置的是自动获取或者是另一个网段。这时候SDK枚举设备列表会一片空白。具体配置我按下面的步骤做用网线连接相机和电脑先在“网络连接”里查看网卡状态。将网卡IP设为和相机同网段的固定IP。比如相机默认是192.168.0.2就把电脑设成192.168.0.10。子网掩码保持一致一般填255.255.255.0。如果你不确定相机IP可以用SDK自带的“相机搜索”工具它会广播包找到相机然后你根据找到的IP修改电脑网卡的地址。除了IP还有一个隐蔽的问题巨型帧Jumbo Frame。千兆网卡默认MTU是1500字节工业相机传输大图像时会拆包如果网卡开启了巨型帧但设置不一致会导致丢包。建议先统一设为1500或者最大帧不要自动协商。2.3 首次连接相机我需要确认三件事新相机到手我不会直接写程序而是先打开官方调试工具做三件事确认设备能稳定枚举重启几次相机都能找到。手动出图把曝光设为固定值观察是否有图像。查看固件版本有必要的话升级固件但升级前一定确认不停电、不断网。这一步非常重要能帮我提前区分“硬件问题”还是“代码问题”。如果手动工具里都出不了图那可能是相机、线缆或者驱动的问题如果手动工具正常只是我们自己代码枚举不到那就是调用姿势不对。3. 从设备列表到第一帧核心API调用流程详解3.1 SDK的对象模型枚举、句柄、错误码水星SDK的核心思路是“枚举-连接-操作-释放”和很多工业相机SDK类似。你要理解几个关键概念设备信息SDK枚举得到的不是句柄而是设备描述符包含IP、MAC、型号、序列号等。句柄Handle打开某个设备后得到的操作指针后续所有操作都通过它。错误码每个API都返回错误码0通常代表成功。调试时一定要打印错误码别忽略。我第一次写代码时犯过一个低级错误直接调用打开函数结果失败返回负值我没理会继续往下执行最后程序崩溃。后来我把每个关键调用都封装了一层出错就把错误码翻译成字符串打出来问题瞬间就容易排查了。3.2 采集图片的标准流程一帧都不能漏整个流程分为初始化SDK、枚举设备、打开设备、配置参数、开始采集、获取图像并处理、停止采集、关闭设备、销毁SDK。我用Python简单写了一个示例import cam_sdk as sdk # 1. 初始化SDK ret sdk.init() if ret ! sdk.SUCCESS: raise RuntimeError(fSDK初始化失败: {ret}) # 2. 枚举相机 devices sdk.enum_devices() print(f找到 {len(devices)} 台相机) if len(devices) 0: raise RuntimeError(没有找到相机请检查网络或驱动) # 3. 打开第一台相机 dev sdk.open_device(devices[0][key]) if dev is None: raise RuntimeError(打开相机失败) # 4. 设置关键参数不同型号可能略有差异 dev.set_param(Width, 2448) dev.set_param(Height, 2048) dev.set_param(PixelFormat, Mono8) dev.set_param(ExposureTime, 1000.0) # 微秒 dev.set_param(TriggerMode, Off) # 关闭触发先自由运行 dev.set_param(TriggerSource, Software) # 5. 开始采集 ret dev.start_grabbing() if ret ! sdk.SUCCESS: raise RuntimeError(f开始采图失败: {ret}) # 6. 循环取帧 for i in range(100): frame dev.retrieve_frame(timeout2000) if frame is not None: # frame.image_data 是Numpy数组如果SDK有绑定的转换 image frame.as_array() # 这里可以交给OpenCV处理 # cv2.imwrite(fframe_{i}.png, image) frame.release() # 切记释放 else: print(f第{i}帧超时) # 7. 停止采集并关闭 dev.stop_grabbing() dev.close() sdk.shutdown()这段代码里最容易被忽略的是frame.release()。很多SDK在retrieve_frame时会分配内存缓冲区如果一直取帧不释放内存会不断增长最终整个系统卡死。这就是网上经常说的“长时间运行内存爆掉”的根源。3.3 参数配置别再被“自动曝光”坑了工业相机的参数很多但核心就是曝光时间、增益、白平衡彩色机、ROI感兴趣区域和像素格式。下面是我常用的参数组合逻辑# 固定曝光模式 dev.set_param(ExposureAuto, Off) dev.set_param(ExposureTime, 500.0) # 500微秒 # 增益控制 dev.set_param(GainAuto, Off) dev.set_param(Gain, 10.0) # 单位是dB # 彩色相机白平衡先手动调一次 dev.set_param(BalanceWhiteAuto, Off) dev.set_param(BalanceRatio, [1.2, 1.0, 0.9])参数设置的要害在于**“先关自动再设手动”**。如果你开着自动曝光、自动增益图像亮度会一直抖后面做算法处理时阈值就很难固定。机器视觉项目里90%的情况都需要手动固定曝光和增益让外界光源来调节亮度。4. 我踩过的几个坑从黑屏到内存疯涨的排查过程4.1 图像全黑先查触发模式和曝光时间我最初调试时图像一直是全黑的。排查顺序如下先用官方工具截图发现也是黑的说明代码没问题。检查镜头盖发现已经摘了排除物理遮挡。检查曝光时间发现被设置成了50微秒室内光线下肯定不够需要加大到几千微秒。检查触发模式发现相机默认是“硬件触发”没有外部信号时就不会拍图自然一直是黑的。这是工业相机新手最常遇到的坑相机默认可能处于硬触发模式且曝光时间极短。解决办法很简单初始化时先把触发模式设为Off或软件触发再把曝光时间调到合适的范围。曾经我以为只要通过帧率就能判断相机在工作后来发现相机在硬触发模式下start_grabbing会一直阻塞根本没有帧输出。你得留意软件回调是否长时间未触发。4.2 图像花屏或撕裂像素格式和Buffer分配不匹配第二次踩坑是我把解析图像数据用的数组大小写错了。比如相机输出的是Mono8每个像素1字节但代码里按RGB8883字节去解析图像自然就是花的。类似的错误还包括没有根据payload_size分配缓冲区直接写死某个数值。采集回调里开了一个较小的数组然后SDK把长数据写进来溢出后又破坏了别的内存。多线程访问同一个图像缓冲区生产者还没写完整消费者就去读。这种问题最好的排查方式是把图像直接保存成BMP或PNG看内容不要一出图就送进深度学习模型。图像数据有问题时原始格式比特征图更容易看出规律。4.3 长时间运行内存疯涨回调里的资源不被释放程序刚跑起来的时候一切正常但运行两三个小时后内存占用从几百MB涨到几个GB最后可能崩溃。这是我做这个项目时最头疼的问题。后来我用内存分析工具跟踪问题出在采集回调里def grab_callback(frame): # 错误示范把frame对象丢进队列不释放 frames_queue.put(frame)frame对象内部持有图像缓冲区如果你只是把它放进队列而不做任何释放或深拷贝处理SDK可能不会自动回收这个缓冲区。正确的做法是def grab_callback(frame): img_copy frame.as_array().copy() frames_queue.put(img_copy) frame.release()这样取出的Numpy数组是独立内存frame.release()会把SDK缓冲区释放掉。如果你需要在多线程之间传递图像这一步绝对不要省。此外还有人会犯“不停地start_grabbing和stop_grabbing”的错误。每次开始/停止采集SDK都可能重新分配一大块缓冲区高频开关之下内存碎片会越来越严重。不如一直采集通过参数开关或者丢帧策略来控制。4.4 GigE相机经常掉线网卡节电和缓冲深度是幕后黑手产线上调试时相机每隔几分钟就断一次重连又能拉回来但过一会儿又断。这问题的根源通常是下面两个网卡的电源管理系统默认开启了“允许计算机关闭此设备以节约电源”。网卡会在一段时间没有大流量时进入节能状态但是相机仍在持续传图于是链路就断了。解决的方案是在设备管理器的网卡属性里把“电源管理”里的节能选项取消勾选。接收缓冲区不足网卡的中断调整和接收缓冲区不够导致大量丢包相机侧检测不到ACK就会重新传输时间久了连接超时。你可以把网卡的“Receive Buffers”调到最大并开启“Jumbo Packet”。排查这类问题的通用步骤先用相机SDK自带的网络连接测试工具做连续丢包测试确定是链路问题还是代码问题再尝试更换屏蔽性能更好的网线。5. 在水星相机上做提速和稳定化的几个技巧5.1 触发模式从软件触发到硬触发的升级之路如果你的相机只是连续采集视频那软件触发就够了。但在工业检测场景里通常需要被检测物体经过传感器时传感器给出一个高电平信号告诉相机“立刻拍一张”这就是硬件触发。水星GigE相机的硬触发接口一般是外部航空插头里的Line0/Line1。要通过代码配置dev.set_param(TriggerMode, On) dev.set_param(TriggerSource, Line0) dev.set_param(TriggerActivation, RisingEdge) dev.set_param(TriggerDelay, 100.0) # 可选的延迟单位微秒这里有三个注意点触发电平有的传感器常开、常闭信号不一样要根据实际情况配置成上升沿或下降沿。曝光时间要小于帧周期在硬触发模式下如果传感器触发频率高于相机最大帧率会丢失触发如果曝光时间太长像机会还没就绪下一次触发直接忽略。触发延迟如果被检对象在传输带上运动曝光开始的时刻和触发时刻有时间差需要微调TriggerDelay。我最开始设置触发延迟为0发现拍到的物体永远偏一边。后来根据传送带速度和物品位置算了个大约100微秒的延迟才把目标定在图像中心。这类参数必须现场调不能靠猜。5.2 多相机同步与带宽管理一条网线别拖太多相机多相机场景下如果两三个相机的数据流同时走一张千兆网卡带宽很容易打满。比如一个200万像素、10bit的相机跑30帧数据量大约是200万×2字节×30帧120MB/s已经非常接近千兆网卡的传输上限约125MB/s。再叠加第二个相机必然丢包。处理思路有三种给每个相机或者每两个相机分配独立的网卡。降低单台相机的帧率或者我们只用ROI把传输区域缩小。在SDK里开启“帧间包间隔”InterPacketDelay调整传输优先级。我实际操作的经验是多相机最好分成多网卡不要试图在一张千兆网卡上同时跑超过1台200万像素以上的高速相机。如果你的相机支持802.3az节能以太网也要把它关掉否则传输可能不稳定。5.3 处理性能优化不要每个像素都过一遍CPU光从相机取到图像还不够真正吃CPU的是后面的图像处理。比如做模板匹配、OCR或者深度学习推理。我们的目标是让“取流”和“处理”不互相拖累。我常用的流水线是取流线程把图像放进一个固定长度的环形队列队列里保存的是Numpy数组的内存引用或者指向共享缓冲区的指针。处理线程从队列取图做算法。如果队列满就丢掉最旧的一帧保证实时性。这样即使算法处理慢也不会阻塞取流线程。只要你记得把frame.release()放在取流线程里就能持续稳定运行。另外一个更暴力的方案是使用GPU解码或利用相机SDK自带的图像格式转换比如把Bayer转RGB直接放在相机端或GPU端做释放CPU给控制逻辑。6. 如果让我重做这个项目我会怎么安排整个开发节奏经过这一个项目我把不少开发习惯做了调整。如果以后还有水星相机的项目我会按照下面的顺序做第一先用SDK工具验证整套硬件。包括相机、镜头、光源、触发信号、线缆。这个验证最好在买其他配件之前完成避免相机没问题但光源和镜头不配套导致图像效果很差。第二选好开发语言和架构再动手。如果只是做算法验证Python最合适。但正式工程建议用C或C#因为Python的GIL在多线程取流处理时可能拖后腿。可以Python和C混合把取流和处理模块用C封装成接口上层用Python调。第三把参数配置做成配置文件而不是硬编码在代码里。工业相机参数有太多变量曝光、增益、ROI、触发延迟、IP地址、帧率。我后来把所有参数都抽到了JSON配置文件里现场调试的时候改文件就行不需要重新编译程序。这一个小改动省下了大量联调时间。第四对相机的SDK版本和固件版本做严格记录。我遇到过一个非常诡异的问题同一套代码换了一台同型号相机图像数据反了。后来发现是固件版本不同某个参数默认值不一样。所以在项目启动时把每台相机的固件版本、SDK版本、配置参数全部导出存档后面出问题还能对比。最后提出一个小小的建议尽量给相机做一个独立诊断界面。哪怕是最简单的Demo窗口只要能显示当前相机状态、帧率、丢包率、内存占用到了现场排查问题的速度会快很多。我一直习惯在每个项目里保留一个“隐藏的调试面板”把所有关键信息都显示出来。很多看似无解的问题看到丢包率飙升或者内存不断上升原因立马就能定位到具体环节。这篇文章写到这里基本把我做水星相机开发前前后后能想到的细节都聊了一遍。从环境配置、API调用流程到几个最典型的坑和处理优化思路都是我正在项目里真实遇到并解决的。如果你也正在接触这台相机只要照着链路一步步排查很多问题会比你想的简单。

相关新闻

具身智能老股交易活跃背后:估值逻辑切换与退出博弈解析

具身智能老股交易活跃背后:估值逻辑切换与退出博弈解析

具身智能跨过分水岭,遍地都是想卖老股的投资人。这句话最近在我们这个圈子里流传很广,说得直白,却也点破了当前一级市场最拧巴的状态。我从2016年前后开始接触硬科技项目,在具身智能这条赛道上看过上百个早期项目,也亲…

2026/10/17 14:52:34 阅读更多 →
.chess顶级域申请:DNS解析、邮件配置与域名迁移开发者指南

.chess顶级域申请:DNS解析、邮件配置与域名迁移开发者指南

很多做国际象棋平台、对局网站和赛事系统的开发者,可能已经看到了这样一条新闻:FIDE(国际棋联)和 World Chess 联合申请 .chess 顶级域名扩展。 如果只看题目,这似乎是一条纯粹的“域名行业新闻”,和普通程…

2026/10/17 14:52:34 阅读更多 →
ThinkSystem SR650安装指南:XCC初始化、RAID配置与系统部署

ThinkSystem SR650安装指南:XCC初始化、RAID配置与系统部署

简介:面向联想ThinkSystem SR650服务器(7X05、7X06机型)的官方安装指南,适合服务器管理员、IT运维与硬件集成人员参考,用于完成服务器上架、硬件扩充与基础系统配置。资源为单个PDF文件,大小21.41MB&#x…

2026/10/17 14:51:33 阅读更多 →

最新新闻

Transformer模型详解:从注意力公式到能跑通的极简实现

Transformer模型详解:从注意力公式到能跑通的极简实现

简介:这份《Transformer 模型详解》PDF 面向自然语言处理初学者、深度学习入门者及需要系统梳理注意力机制的算法工程师,帮助读者从零理解 Transformer 的整体架构与核心原理。资源为单个 PDF 文件,压缩包约 2.01MB,内容以图文结合…

2026/10/17 17:27:23 阅读更多 →
Vue项目三步部署指南:Ubuntu + Nginx从构建到线上发布

Vue项目三步部署指南:Ubuntu + Nginx从构建到线上发布

看到标题里的“ubnutu”,我先说个小事:这应该是 ubuntu 的笔误。不过这并不影响思路,下面我统一用 ubuntu 22.04 来讲。很多前端同学开发完 vue 项目,npm run build 一执行,dist 目录出来了,然后就卡住了—…

2026/10/17 17:27:23 阅读更多 →
内置ALC的音频前置放大器D2538A和D3308

内置ALC的音频前置放大器D2538A和D3308

应用领域D2538A和D3308是两款内置ALC(音频限幅器)的前置音频放大器芯片,其中D2538A为单通道,D3308为双通道,它特别适用于胎心仪、个人医疗防护、立体声收录机、盒式录音机等涉及音频放大与限幅的产品方案。功能介绍音频…

2026/10/17 17:26:23 阅读更多 →
FAIR风险量化实战:从模糊判断到可校准的年化损失建模

FAIR风险量化实战:从模糊判断到可校准的年化损失建模

简介:本资源是一份面向信息安全从业者、风控工程师与技术决策者的FAIR风险量化分析实战指南,聚焦解决企业级信息风险难以精准建模与量化评估的痛点。文档系统拆解FAIR框架核心要素(威胁源、脆弱性、资产、影响)、风险计算模型、蒙…

2026/10/17 17:26:23 阅读更多 →
CISSP 备考指南:八大知识域拆解与易错点复习清单

CISSP 备考指南:八大知识域拆解与易错点复习清单

简介:CISSP官方学习手册第九版是面向信息安全从业者及备考CISSP认证考生的权威参考资料,由信息安全领域专家编写,系统覆盖安全与风险管理、资产安全、安全工程、通信与网络安全、身份与访问管理、安全评估与测试、安全运营及软件开发安全等知…

2026/10/17 17:26:23 阅读更多 →
Flink + Iceberg 本地环境搭建实战:版本选型、Catalog 配置与常见问题排查

Flink + Iceberg 本地环境搭建实战:版本选型、Catalog 配置与常见问题排查

1. 为什么值得搭一套 Flink Iceberg 的本地环境大数据圈子里有个很现实的现象:很多团队用着 Hive 或者纯对象存储做数据湖,白天跑批还凑合,一到近实时场景就露馅——写入延迟高、小文件泛滥、Schema 变更要停服、回溯历史数据得全量重跑。Fl…

2026/10/17 17:26:23 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →