OpenCV烟丝图像分割与轮廓统计实践
简介这是一套基于Python与OpenCV的烟丝检测分割项目代码面向计算机视觉初学者及烟草行业质检场景解决图像中烟丝自动识别、轮廓提取与面积宽度测量等问题。项目涵盖图像读取、颜色空间转换、滤波去噪、Canny边缘检测、轮廓发现、形态学优化及区域特征统计等典型流程适合学习OpenCV图像处理管线的人对照练习。包体共12个文件以Python主脚本为核心附带多张示例图像、轮廓结果图及开发环境配置文件压缩包约13.32MB结构紧凑便于直接运行。已有591人学习下载。代码内置了多种场景的图像样本可直观对比检测分割效果并借助轮廓面积、周长计算等函数对烟丝区域做量化分析为烟丝宽度、面积统计提供可扩展基础。整个实现既涵盖传统图像处理的关键步骤又具备实际工业质检的迁移价值适合作为计算机视觉项目的入门参考与二次开发起点。1. 烟丝检测分割用 OpenCV 把细长条物体从照片里单独拎出来拿到cut_tobacco.zip这个压缩包的时候我第一反应是烟草行业的质检场景又来了。质检线上拍摄的烟丝图像普遍有个特点背景纹理杂、单根烟丝细长且相互交叠靠人工目检效率低靠深度学习标注成本又高。这个项目走的是经典计算机视觉路线用 Python OpenCV 把烟丝从图像里自动分割出来再统计每根烟丝的面积、周长和宽度。包里main.py是完整处理链路train.jpg、test.jpg是不同批次的待测样本contoursImage2.jpg是轮廓可视化结果bee.jpg则用来验证算法在非烟丝场景下的泛化能力。如果你手头也有细长条物体的检测需求——纤维、毛发、短线缆这套代码的思路可以直接平移过去。2. 图像预处理为什么灰度化之后要先滤波再二值化2.1 三个关键 CV 操作的选型理由烟丝图像处理的第一步不是直接找轮廓而是把图像调整到适合做分割的状态。使用cv2.imread()读取到的原始图像是 BGR 三通道格式烟丝通常是黄褐色背景可能是深色托盘或传送带两者在灰度空间里已经能拉开差距。此时用cv2.cvtColor()转灰度比在彩色空间里分割省掉大量计算量。灰度化之后图像里仍然有噪声典型来源是传送带表面的细微纹理和拍摄时产生的传感器噪点。噪声如果不处理会让后续 Canny 边缘检测多出一圈假边界。常见做法是先用cv2.GaussianBlur()做高斯滤波使用 5x5 的核sigma 取 0。高斯滤波对高斯噪声抑制效果最好而且不会像中值滤波那样把烟丝的细长结构磨掉。滤波完进入二值化环节。固定阈值cv2.threshold()在这个场景下不好使因为不同批次烟丝的颜色深度和光线条件有差异。用大津法OTSU自动求阈值更稳它能根据图像灰度分布算出最优分割阈值相当于省掉了每次调参的过程。这个项目里二值化的结果直接决定了后续轮廓检测的质量二值化做得干净轮廓提取就成功了一半。2.2 main.py 预处理链路的实际代码与参数说明import cv2 import numpy as np # 读取测试图像IMREAD_COLOR 是默认模式保留原始色彩信息 img cv2.imread(train.jpg, cv2.IMREAD_COLOR) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 5x5 高斯核sigmaX 设为 0 表示由核尺寸自动计算 blurred cv2.GaussianBlur(gray, (5, 5), 0) # OTSU 自动阈值返回值为阈值本身和二值化结果 thresh_val, binary cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) print(fOTSU 自动计算出的阈值为: {thresh_val})这段代码是预处理链路的骨架。GaussianBlur的核尺寸如果设成(3, 3)会保留更多细节但噪声抑制能力弱设成(7, 7)则过度平滑烟丝边缘会被抹掉一部分。实际操作中(5, 5)是烟丝这类中等纹理目标的上限——比它大就容易让细长物体断成碎片。cv2.threshold()的 OTSU 模式要求传入的第二个参数随意填0只是占位真正的阈值由算法计算。注意THRESH_BINARY THRESH_OTSU是标志位相加不能只写一个。二值化图像里烟丝为白色前景背景为黑色这是 OpenCV 轮廓检测的默认预期格式。调试时我建议加一行cv2.imwrite(binary_debug.jpg, binary)把二值化结果存下来看。如果烟丝大面积断线说明滤波核太大把细节抹平了如果背景上还有大量白点说明 OTSU 在这种光照下失效需要退回手动阈值或改用自适应阈值cv2.adaptiveThreshold()。3. 轮廓提取与筛选findContours 的参数一错结果全乱3.1 RETR_EXTERNAL 与 CHAIN_APPROX_SIMPLE 到底怎么选预处理做完核心环节是用cv2.findContours()提取烟丝轮廓。这个函数有三个关键参数轮廓检索模式、近似方法和偏移量。检索模式里最常用的是RETR_EXTERNAL和RETR_TREE。RETR_EXTERNAL只取最外层轮廓适合目标物体互不嵌套的场景RETR_TREE会提取全部层级关系适合有内外结构的物体。烟丝场景取RETR_EXTERNAL就够。烟丝之间即便相互交叠在二值化图像里也是并排的独立连通域没有嵌套关系。如果误用RETR_TREE轮廓数量会爆炸一根烟丝可能被拆成多段后续面积统计全部失真。近似方法选CHAIN_APPROX_SIMPLE它只保留轮廓的端点把直线段压缩掉极大减少内存占用。对烟丝这种细长轮廓来说端点信息已经足够描述形状。CHAIN_APPROX_NONE虽然保留全部点但轮廓数组会大好几倍处理大图时内存压力明显。3.2 用 contourArea 和 arcLength 把噪点挡在门外# 提取轮廓注意 OpenCV 版本差异返回值可能是 2 个也可能是 3 个 contours, hierarchy cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) valid_contours [] area_list [] perimeter_list [] for cnt in contours: area cv2.contourArea(cnt) perimeter cv2.arcLength(cnt, True) # 面积阈值过滤掉小噪点周长阈值过滤掉零散短线 if area 50 or perimeter 20: continue # 计算外接矩形宽高比烟丝是细长条宽高比通常大于 3 x, y, w, h cv2.boundingRect(cnt) aspect_ratio float(w) / h if h 0 else 0 if aspect_ratio 3 or aspect_ratio 0.33: valid_contours.append(cnt) area_list.append(area) perimeter_list.append(perimeter) print(f烟丝候选: 面积{area:.1f}, 周长{perimeter:.1f}, 宽高比{aspect_ratio:.2f})这段筛选逻辑里三个参数的物理意义要搞清楚。面积阈值 50 是像素平方单位如果你的图像分辨率是 4000x3000这个阈值可以往上调到 200分辨率只有 640x480 时50 反而可能误杀真实烟丝。阈值应该是图像分辨率的函数不建议一把尺子量所有图。周长阈值过滤的是那些面积达标但形状零碎的轮廓。周长过短意味着这个连通域不够完整大概率是噪声聚集。宽高比过滤是烟丝检测里最关键的几何约束——烟丝本质是细长条外接矩形必然是一边远大于另一边。如果检测目标是碎烟末而非完整烟丝这个宽高比条件可以放宽甚至删除。另一个常见做法是把面积和周长组合成一个圆形度指标4 * pi * area / (perimeter ** 2)。烟丝的圆形度远小于 1而圆形颗粒噪声的圆形度接近 1用这个指标能很好地区分两者。cv2.arcLength()的第二个参数True表示轮廓是闭合的。如果你在处理的是开放轮廓这个参数要改成False否则计算结果会偏大不少。我在实际项目里就吃过这个亏统计周长偏大 10% 以上。4. 形态学优化与分割结果可视化如何把断裂的烟丝接回去4.1 闭运算补缺口、开运算去毛刺的先后顺序二值化图像里的烟丝常有断裂原因包括烟丝本身纹理不均匀、光照在边缘产生阴影、高斯滤波过度平滑等。直接用cv2.findContours()会把一根烟丝拆成两三段。这时候形态学操作就派上用场了。cv2.morphologyEx()支持四种常见操作腐蚀、膨胀、开运算、闭运算。腐蚀去掉小凸起膨胀填充小凹陷开运算是先腐蚀后膨胀闭运算是先膨胀后腐蚀。烟丝断裂处通常是几个像素宽的缝隙用闭运算正好能把它接上。核尺寸(3, 3)起步如果断口超过 5 个像素(5, 5)的核更合适。相反如果二值化之后背景残留细小噪点开运算先把这些噪点腐蚀掉再膨胀回来效果比直接面积过滤更彻底。我在这个项目里推荐的顺序是先开运算去噪点再闭运算接断口。顺序反了的话闭运算会把噪点也连进烟丝主体后续面积统计虚高。形态学核的形状用椭圆形cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))比矩形核更贴合烟丝的圆形截面不会在边缘产生方形突出。4.2 轮廓填充与结果标注的常见做法# 生成形态学核MORPH_ELLIPSE 椭圆核适合细长条目标 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) opening cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations1) closing cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel, iterations2) # 形态学处理后再提取一次轮廓 contours, _ cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 创建一个全黑画布用于填充烟丝区域 mask np.zeros_like(gray) cv2.drawContours(mask, contours, -1, 255, thicknesscv2.FILLED) # 在原图上绘制彩色轮廓便于人工核对 result img.copy() cv2.drawContours(result, contours, -1, (0, 255, 0), 2)注意这段代码里cv2.morphologyEx的iterations参数。闭运算迭代 2 次意味着膨胀和腐蚀各执行两轮断口的连接效果更强但代价是烟丝轮廓轻微膨胀变粗。迭代次数超过 3 后两根平行烟丝之间的缝隙可能被闭运算误连成一根这个度要自己把握。cv2.drawContours()的thicknesscv2.FILLED是填充模式它生成的mask是逐像素标记的分割结果。如果你只需要轮廓线做展示把thickness改成2就行。这里有个细节填充用的mask是单通道 8 位图像像素值为 0 或 255后续可以用cv2.bitwise_and()把背景抠掉只保留烟丝区域。轮廓绘制完成后建议把原图和结果图拼接在一起做对比cv2.hconcat()或np.hstack()都可以。项目里的contoursImage2.jpg就是这种可视化产物它存在的意义是让工程师一眼看出有没有漏检或误检比直接看数据更直观。5. 避坑清单烟丝检测最容易翻车的五个位置5.1 OpenCV 版本差异导致 findContours 返回值不一致现象代码在本地运行正常部署到服务器上直接报ValueError: not enough values to unpack。原因OpenCV 4.x 之前的版本cv2.findContours()返回 3 个值4.x 之后返回 2 个值。很多旧教程写的image, contours, hierarchy cv2.findContours(...)拿到新版本上必然炸。解决用contours, hierarchy cv2.findContours(...)统一接收。如果确实需要兼容旧环境用try判断返回值长度或者固定写死要求部署环境 OpenCV 版本不低于 4.2。版本号在requirements.txt里写清楚比在代码里做兼容更省事。5.2 contourArea 突然报未定义标识符现象cv2.contourArea(cnt)在执行时报AttributeError: module cv2 has no attribute contourArea。原因多数情况是cv2被其他同名的 Python 模块覆盖了或者是安装的 opencv-python 不完整只装上了cv2的头文件底层 C 扩展没编译成功。我在一个项目里遇到过 pip 安装 opencv-python 时网络中断包体不完整部分函数缺失。解决pip uninstall opencv-python后重新安装pip install opencv-python --no-cache-dir。如果还不行去 Python 交互环境里打印cv2.__version__和cv2.__file__确认实际加载的是哪个路径下的模块。5.3 二值化后烟丝大面积断裂findContours 数量爆炸现象处理test.jpg时轮廓数量超过 500 个但肉眼数下烟丝顶多 30 根面积统计完全失真。原因预处理阶段的高斯滤波核太大加上二值化阈值偏低烟丝内部出现大量空洞。烟丝本身的颜色是不均匀的同一根烟丝上可能有深色段和浅色段固定阈值会把这些色差直接切碎。解决把GaussianBlur核降到(3, 3)或者干脆换用cv2.adaptiveThreshold()自适应阈值它会对局部区域分别计算阈值烟丝内部的均匀区域不会被打散。形态学闭运算的iterations提高到 2 或 3能把小碎段重新连上。5.4 imshow 在无显示器服务器上直接崩溃现象代码执行到cv2.imshow()时抛出cv2.error: ... GUI error或者直接显示段错误退出。原因服务器上没有 X Server 或 Windows 图形环境OpenCV 的高层 GUI 接口无处渲染窗口。很多接手这个项目的同事把调试代码原封不动丢到生产环境就在这一步翻车。解决用cv2.imwrite()代替cv2.imshow()把结果写到磁盘再查看。如果确实需要实时预览用cv2.namedWindow(result, cv2.WINDOW_NORMAL)配合cv2.resizeWindow()但前提是系统得有图形环境。5.5 形态学核尺寸纯靠玄学过度调参浪费时间现象闭运算核从(3, 3)调到(7, 7)再到(11, 11)结果不是断口没接上就是两根烟丝粘连成一根。原因核尺寸应该由图像里烟丝的最小宽度决定。如果烟丝最细处是 5 个像素宽核超过(7, 7)就会把相邻烟丝之间的空隙也填上。解决在调试前先量一下目标物体的像素宽度用cv2.getStructuringElement()生成略小于目标宽度的核。这是一个物理约束问题不是调参玄学。我从那以后每次做形态学先量目标尺寸省下至少两小时的盲目试参。6. 面积与宽度统计把分割结果变成能写进质检报告的数据得到各烟丝的contourArea和arcLength之后很多初学者会直接把这两个数输出但这些原始数据对质检报告没用。烟丝面积受到拍摄距离、分辨率、光照角度影响不同批次的图像之间不能直接比较。真正有用的是相对分布和归一化指标。第一类统计是面积直方图。用numpy.histogram()把area_list分成 20 个区间看烟丝面积分布是单峰还是多峰。单峰说明这批烟丝粗细均匀双峰说明存在两个粗细等级在生产上这意味着切丝机可能需要调整。这个分析可以用matplotlib.pyplot.hist()画出来不画图的话直接打印频数分布也可以。第二类统计是单根烟丝的宽度估算。常见做法是用面积除以轮廓骨架长度骨架可以用cv2.ximgproc.thinning()提取这个函数在 OpenCV 贡献库里需要pip install opencv-contrib-python才能用。没有贡献库的环境下退而求其次用面积除以周长再乘以 2得到的宽度估计误差在 15% 以内足够做趋势判断。第三类是离散度指标。计算所有烟丝面积的标准差和变异系数 CV即标准差除以均值这是衡量批次均匀性的核心指标。如果 CV 超过 0.3说明烟丝尺寸差异大需要回看预处理阶段是否漏检了碎末。最后把结果整合成 CSV 文件输出方便和 MES 系统对接。import csv import numpy as np # 统计特征计算 areas np.array(area_list, dtypenp.float64) perimeters np.array(perimeter_list, dtypenp.float64) mean_area np.mean(areas) std_area np.std(areas) cv_value std_area / mean_area if mean_area 0 else 0 width_estimate 2 * areas / perimeters # 写入 CSV保留原始轮廓信息用于后续追溯 with open(tobacco_stats.csv, w, newline) as f: writer csv.writer(f) writer.writerow([index, area, perimeter, estimated_width]) for i in range(len(areas)): writer.writerow([i, round(areas[i], 2), round(perimeters[i], 2), round(width_estimate[i], 2)]) print(f烟丝数量: {len(areas)}, 平均面积: {mean_area:.1f}, CV: {cv_value:.3f}) print(统计结果已保存到 tobacco_stats.csv)在代码运行完后我建议把不同批次的 CV 值画在一张折线图上这个趋势比单批次数值更能说明设备稳定性。我在类似项目里的习惯是每次跑完数据把图片路径、处理参数、统计结果三样绑在一起存档参数改了哪些在文件名里标注好如果后续质检反馈有误检回溯起来十分钟就能定位到是哪一步处理出了问题。此前的项目里我吃过不少没记录参数就改代码的亏从那以后每次跑烟丝检测都会强制走一遍这套记录流程。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

警情数据可视化分析系统:Python+Flask+ECharts大屏实战教程

警情数据可视化分析系统:Python+Flask+ECharts大屏实战教程

做警情数据可视化分析系统,绕不开一个问题:数据都有了,但怎么看?怎么让一组组冷冰冰的字段变成有说服力的趋势、占比和分布?这个项目的核心就是把警情记录从MySQL数据库里捞出来,用Python做清洗和统计聚合&…

2026/10/1 17:30:30 阅读更多 →
Flutter强类型网络层实战:chopper+built_value鸿蒙适配全攻略

Flutter强类型网络层实战:chopper+built_value鸿蒙适配全攻略

做 Flutter 开发这几年,最让我心态爆炸的不是复杂 UI 布局,而是网络层的数据模型。每接一个接口就要手写一遍fromJson、toJson,字段一多就出笔误,key 拼错等到运行时才炸,nullable 字段稍不注意直接崩给用户看。后来切…

2026/10/1 7:32:54 阅读更多 →
300款H5小游戏合集整理实战:从单文件HTML到部署全攻略

300款H5小游戏合集整理实战:从单文件HTML到部署全攻略

前阵子整理完一个300款H5小游戏的合集资源包,朋友圈发了个截图,结果一下午有十几个朋友来问怎么做的、在哪下载、怎么部署到自己的网站。说实话,这活儿看起来就是“收集网页游戏再打包”,但真正动手之后才发现,从选游戏…

2026/9/30 23:34:00 阅读更多 →

最新新闻

毕设工具怎么选?横向对比后,我最终选择 Okbiye

毕设工具怎么选?横向对比后,我最终选择 Okbiye

前言 临近毕业季,大量同学开始疯狂寻找各类 AI 论文辅助工具。网上工具五花八门,单点翻译、独立绘图、AI 写作、查重网站层出不穷。很多人踩坑之后才发现,单一工具只能解决某一个小问题,想要走完完整毕设流程,需要同时…

2026/10/1 21:05:07 阅读更多 →
六西格玛考试科目全解析:绿带黑带题型分值与考点权重(2026报考季)

六西格玛考试科目全解析:绿带黑带题型分值与考点权重(2026报考季)

内容提要:中质协六西格玛考试按等级统考,不分科目——绿带80题(满分100分,60分及格)、黑带90题(满分120分,80分及格,另需项目答辩),考试内容围绕DMAIC方法论展…

2026/10/1 21:05:07 阅读更多 →
苏州做GEO营销的有经验的外贸服务商有啥:口碑公司汇总与选择指南

苏州做GEO营销的有经验的外贸服务商有啥:口碑公司汇总与选择指南

先搞懂:GEO营销到底是什么,外贸企业为什么绕不开GEO,全称生成式引擎优化,简单说就是让品牌在AI的回答里被看见、被引用、被推荐。过去海外买家找供应商的路径很清晰:在Google输入关键词,打开前十的网页&…

2026/10/1 21:05:07 阅读更多 →
国产之光 GP232RL USB转串口芯片完全兼容替代FT232RL

国产之光 GP232RL USB转串口芯片完全兼容替代FT232RL

GP232RL是最新加入 ftdi 系列 usb 接口集成电路设备的设备。232r是一个 usb 到串行 uart 接口,带有可选的时钟发生器输出,以及新的 ftdichip-idTM 安全加密器特性。此外,还提供了异步和同步位崩接口模式。通过将外部 eeprom、时钟电路和 usb …

2026/10/1 21:05:07 阅读更多 →
ThingsBoard Edge Ubuntu 升级指南:基于 .deb 包的升级流程与实现原理

ThingsBoard Edge Ubuntu 升级指南:基于 .deb 包的升级流程与实现原理

物联网后端数据可视化消息队列 【免费下载链接】thingsboard All-in-one IoT Platform - Device management, data collection, processing and visualization. 项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard 点击查看 免费下载 本篇技术指南围绕…

2026/10/1 21:04:06 阅读更多 →
Qt5.12 + MSVC2017 环境搭建:我重装了三次才顺,这 8 个坑你不用再踩

Qt5.12 + MSVC2017 环境搭建:我重装了三次才顺,这 8 个坑你不用再踩

插件化那 20 天写的是"程序内部怎么长"。这个专栏换个角度——从一堆源码到一个能交给别人用的安装包,中间那些把人卡住的事。 开篇先解决最前面的一步:环境。去年我接手一个老项目,硬性要求 Qt 5.12.11 MSVC2017。照着网上的教程…

2026/10/1 21:04:06 阅读更多 →

日新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05: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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →