富士康金属件自动化尺寸测量:OpenCV像素到毫米的产线替换逻辑
简介本资源面向计算机视觉与工业自动化方向的开发者及学生提供一套基于 OpenCV 与深度学习实现富士康金属件自动化尺寸测量的完整项目源码与配套数据。项目核心思路是先定位目标位置再统计其像素面积结合比例尺换算实际尺寸涵盖图像匹配、特征提取、角度测量等典型难点并附有 0/4/7 号位置的识别测量结果供对照验证。压缩包共 88 个文件以 44 个 png 与 9 个 jpg 图像样本、20 个 py 源码脚本为主另含 json 配置、mov/mp4 演示视频、md 说明文档及 ipynb 实验笔记整体约 47.56MB目录按 code、data、docs、dataset 等模块组织便于按流程检索。目前已有 147 人学习下载。读者可获取从图像预处理、目标定位到尺寸换算的完整算法链路以及针对小尺寸实物、工业相机放大受限等问题的排错思路与实验记录适合作为工业视觉测量项目的参考方案。1. 富士康金属件尺寸测量从卡尺到相机的产线替换逻辑一条手机中框从冲压线下来质检工位上的老手会拿数显卡尺量长宽、用塞尺测段差、再拿投影仪抽检几个关键孔位。这套流程单件耗时几十秒抽检率上不去漏检的件流到组装段才被发现返工成本直接翻倍。基于计算机视觉的富士康金属件自动化尺寸测量算法要解决的就是把这道工位从「人眼加卡尺」换成「相机加算法」——用工业相机拍一张金属件正投影图通过 OpenCV 做边缘提取和亚像素定位把像素坐标换算成毫米输出长、宽、孔径、孔距、段差这些尺寸和公差带比对后判定 OK/NG。这套方案适合三类人一是做 3C 结构件质检的自动化工程师手上有产线但抽检率卡在瓶颈二是计算机视觉方向的学生或转行者想找一个有明确物理意义、能跑通全流程的实战项目而不是只调分类模型三是产线设备集成商需要一套可复现的 Python 尺寸测量基线再往 Halcon 或专用测量机方向做精度升级。它不追求微米级计量室精度目标是在产线节拍内做到 ±0.02mm 级别的重复性把全检变成可能。2. 像素到毫米尺寸测量算法的四个核心环节2.1 标定先行为什么没有标定就没有尺寸视觉测量的第一性原理是相机看到的是像素不是毫米。像素和毫米之间的换算关系必须通过标定建立。最常见的做法是使用棋盘格标定板用cv2.findChessboardCorners找到角点再用cv2.calibrateCamera解出内参矩阵和畸变系数。内参矩阵里的焦距fx, fy和主点cx, cy决定了像素与物理尺寸的映射比例畸变系数则用来校正镜头带来的桶形或枕形变形。对于产线测量我一般会做两步标定先做相机内参标定消除镜头畸变再在测量平面上放一个已知尺寸的标准件比如 50mm 量块拍图后计算「像素/毫米」比例这个比例就是后续所有尺寸换算的基准。如果只做内参标定不做平面比例标定测量结果会随工件在视野中的位置漂移这是新手最容易翻车的地方。import cv2 import numpy as np # 棋盘格内角点数量例如 9x6 pattern_size (9, 6) # 棋盘格方格实际边长单位 mm square_size 5.0 # 生成棋盘格世界坐标 objp np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) objp * square_size obj_points [] # 3D 点 img_points [] # 2D 点 # 读取多张不同角度的标定图 for fname in [calib_01.jpg, calib_02.jpg, calib_03.jpg]: img cv2.imread(fname) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners cv2.findChessboardCorners(gray, pattern_size, None) if ret: # 亚像素角点优化提升标定精度 corners_refined cv2.cornerSubPix( gray, corners, (11, 11), (-1, -1), criteria(cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) ) obj_points.append(objp) img_points.append(corners_refined) # 相机标定 ret, mtx, dist, rvecs, tvecs cv2.calibrateCamera( obj_points, img_points, gray.shape[::-1], None, None ) print(内参矩阵:\n, mtx) print(畸变系数:\n, dist)这段代码的关键参数是pattern_size和square_size必须和实际标定板一致填错会导致标定结果整体缩放错误。cornerSubPix的窗口大小(11, 11)是经验值太小对噪声敏感太大在角点密集时容易把邻近角点算进来。标定图建议拍 10 到 15 张覆盖视野的四个角和中心标定重投影误差控制在 0.1 像素以内再进入下一步。2.2 边缘提取与亚像素定位Canny 之后还要做什么金属件在背光或同轴光下成像边缘对比度高Canny 是最常用的边缘检测算子。但 Canny 输出的是像素级边缘直接拿来做尺寸测量重复性大概在 ±1 像素换算到 0.05mm/像素的分辨率就是 ±0.05mm达不到产线要求。所以必须做亚像素边缘定位。常见做法有两种一是用cv2.cornerSubPix的思路对边缘点做梯度方向的亚像素插值二是用卡尺工具Caliper沿一条搜索线找灰度梯度极值点再做抛物线拟合。OpenCV 本身没有现成的卡尺函数但可以用cv2.Sobel算梯度再沿搜索线找极值。def subpixel_edge(gray, p1, p2, search_width20): 沿 p1-p2 方向搜索亚像素边缘点 # 在 p1-p2 连线上采样 num int(np.linalg.norm(np.array(p2) - np.array(p1))) xs np.linspace(p1[0], p2[0], num) ys np.linspace(p1[1], p2[1], num) # 双线性插值取灰度 vals [] for x, y in zip(xs, ys): vals.append(cv2.getRectSubPix(gray, (1, 1), (float(x), float(y)))[0, 0]) vals np.array(vals, dtypenp.float32) # 一阶差分找梯度极值 grad np.abs(np.diff(vals)) idx np.argmax(grad) # 抛物线拟合求亚像素位置 if 0 idx len(grad) - 1: y0, y1, y2 grad[idx - 1], grad[idx], grad[idx 1] delta 0.5 * (y0 - y2) / (y0 - 2 * y1 y2) sub_idx idx delta else: sub_idx idx # 映射回坐标 t sub_idx / (num - 1) return p1[0] t * (p2[0] - p1[0]), p1[1] t * (p2[1] - p1[1])search_width控制搜索范围太宽会把邻近边缘算进来太窄可能找不到真实边缘。抛物线拟合的假设是边缘附近梯度分布近似二次曲线对高斯型边缘成立对阶跃型边缘会有偏差。如果金属件边缘有毛刺或反光建议先做高斯滤波再算梯度滤波核大小取 3 或 5太大边缘会糊。2.3 尺寸换算与公差判定像素比例怎么用拿到亚像素边缘点后两个边缘点之间的像素距离乘以「毫米/像素」比例就是物理尺寸。这个比例来自 2.1 节的平面标定。如果工件有厚度正投影测量的是上表面轮廓段差测量需要另做方案比如用激光三角测量或结构光纯 2D 视觉测不了 Z 向尺寸。公差判定就是拿测量值和图纸公差带比对。这里有个细节测量值本身有不确定度如果公差带很窄比如 ±0.01mm而你的测量重复性是 ±0.02mm那判定结果没有意义。所以先做 GRR量具重复性与再现性分析确认测量系统能力足够再上线判定逻辑。# 假设已标定出 mm_per_pixel mm_per_pixel 0.05 def measure_distance(edge1, edge2): 计算两个亚像素边缘点之间的物理距离 px_dist np.sqrt((edge1[0] - edge2[0])**2 (edge1[1] - edge2[1])**2) return px_dist * mm_per_pixel def judge(value, nominal, tol_plus, tol_minus): 公差判定 if nominal - tol_minus value nominal tol_plus: return OK return NGmm_per_pixel的精度直接决定测量精度标定时标准件的尺寸要用更高一级的量具测准比如用千分尺测 50mm 量块的实际值而不是信标称值。公差判定函数里tol_plus和tol_minus分开传是因为很多金属件公差不对称比如 0.02/-0.01。2.4 多工件批量处理从单张图到产线节拍产线上相机是连续采图的算法要能批量处理并输出结构化结果。常见做法是用一个主循环读图、测量、写结果结果存 CSV 或直接通过串口/PLC 发给执行机构。如果节拍要求高可以把测量逻辑封装成函数用多进程或 C 加速Python 层只做调度。import glob import csv results [] for fname in sorted(glob.glob(prod_*.jpg)): img cv2.imread(fname) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 这里调用前面的边缘提取和测量函数 # edge_left subpixel_edge(gray, (100, 300), (100, 500)) # edge_right subpixel_edge(gray, (900, 300), (900, 500)) # width measure_distance(edge_left, edge_right) # status judge(width, nominal50.0, tol_plus0.02, tol_minus0.01) # results.append([fname, width, status]) pass with open(measure_result.csv, w, newline) as f: writer csv.writer(f) writer.writerow([file, width_mm, status]) writer.writerows(results)批量处理时要注意图像命名排序sorted按字符串排如果文件名是prod_1.jpg到prod_10.jpg会出现prod_10排在prod_2前面建议文件名补零。结果 CSV 的字段设计要包含原始文件名、测量值、判定结果和测量时间戳方便追溯。3. 环境搭建与最小可跑通流程3.1 Python 与 OpenCV 安装避开 ModuleNotFoundError新手最常遇到的报错是ModuleNotFoundError: No module named opencv和cv2.error: OpenCV(4.4.0) ...。前者是没装 opencv-python后者多半是版本不匹配或安装不完整。我一般用 conda 建虚拟环境再 pip 装 opencv-python 和 opencv-contrib-pythoncontrib 包里有一些额外算法虽然尺寸测量用不到但后续扩展方便。conda create -n measure python3.9 -y conda activate measure pip install opencv-python4.8.0.74 opencv-contrib-python4.8.0.74 pip install numpy pandas装完后验证import cv2 print(cv2.__version__)如果import cv2报错但 pip 显示已安装检查是不是在错误的 Python 环境里执行。VS Code 里要选对解释器PyCharm 里要确认项目解释器路径。树莓派上装 OpenCV 建议用pip install opencv-python-headless省掉 GUI 依赖编译时间也短。3.2 从一张图到一组尺寸最小测量脚本下面是一个最小可跑通的测量脚本假设图像里有一个矩形金属件背景是背光板边缘清晰。脚本做三件事读图、Canny 找边缘、霍夫直线拟合出四条边再算长宽。import cv2 import numpy as np img cv2.imread(metal_part.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯滤波降噪 blur cv2.GaussianBlur(gray, (5, 5), 0) # Canny 边缘检测阈值根据实际图像调整 edges cv2.Canny(blur, 50, 150) # 霍夫直线检测 lines cv2.HoughLinesP(edges, 1, np.pi / 180, threshold100, minLineLength200, maxLineGap10) # 按角度分组找水平和垂直方向的主边 horizontal, vertical [], [] for line in lines: x1, y1, x2, y2 line[0] angle np.degrees(np.arctan2(y2 - y1, x2 - x1)) if abs(angle) 10: horizontal.append(line[0]) elif abs(abs(angle) - 90) 10: vertical.append(line[0]) # 取最外侧的边计算尺寸简化处理 if horizontal and vertical: ys [p[1] for l in horizontal for p in [(l[0], l[1]), (l[2], l[3])]] xs [p[0] for l in vertical for p in [(l[0], l[1]), (l[2], l[3])]] height_px max(ys) - min(ys) width_px max(xs) - min(xs) mm_per_pixel 0.05 # 需根据标定替换 print(f宽度: {width_px * mm_per_pixel:.3f} mm) print(f高度: {height_px * mm_per_pixel:.3f} mm)HoughLinesP的threshold是累加器阈值值越大检出的线越少但越可靠minLineLength过滤短线段金属件边缘长可以设大一点maxLineGap允许线段中间断开适合有倒角或圆角的边。这个脚本只是基线实际产线要用亚像素边缘和卡尺工具替换霍夫直线精度才能上去。3.3 标定文件与测量脚本的对接标定得到的mtx和dist要存成文件测量脚本启动时加载避免每次重新标定。常见做法是存成.npz或.yaml。# 保存标定结果 np.savez(calib.npz, mtxmtx, distdist, mm_per_pixel0.05) # 测量脚本加载 calib np.load(calib.npz) mtx calib[mtx] dist calib[dist] mm_per_pixel float(calib[mm_per_pixel])mm_per_pixel建议单独存一个标量不要从内参矩阵反推因为平面比例还和相机高度、镜头焦距有关直接标定更可靠。如果产线换镜头或调了相机高度必须重新标定并更新这个文件。4. 避坑与排查金属件测量常见的五个翻车点4.1 边缘反光导致测量值跳变现象同一工件连续拍十张宽度测量值在 0.05mm 范围内跳动偶尔跳 0.1mm 以上。原因金属件表面反光边缘附近灰度梯度不稳定Canny 阈值固定时反光区域会产生伪边缘或漏检。解决改用背光或同轴光让工件呈剪影如果必须用表面光加偏振片压反光同时把 Canny 阈值改成自适应用cv2.threshold的 Otsu 方法先二值化再找轮廓。4.2 镜头畸变没校正边缘位置随工件移动变化现象工件放在视野中心时测量准移到边缘就偏 0.1mm 以上。原因镜头畸变没校正或者只做了内参标定没做畸变校正。解决用cv2.undistort对每张图先做畸变校正再测量。校正后的图会损失一部分视野边缘相机选型时要把这个余量算进去。4.3 标定板不平或标定图太少现象标定重投影误差看着很小但实际测量就是不准。原因标定板没放平或者标定图角度太单一解出的参数过拟合。解决标定板用陶瓷或玻璃基板别用打印纸标定图至少 10 张覆盖视野四角和中心倾斜角度在 ±30 度内变化。4.4 像素比例用错尺寸整体缩放现象所有测量值都偏大或偏小同一个比例。原因mm_per_pixel算错比如标定件实际 50mm 但代码里写了 5mm或者单位混了。解决标定件尺寸用千分尺实测代码里单位统一用毫米标定后拿一个已知尺寸的工件验证偏差超过 0.01mm 就查比例。4.5 多线程读图导致结果错乱现象批量处理时结果和文件名对不上或者程序偶尔崩溃。原因多线程读图时共享了全局变量或者 OpenCV 的imread在多线程下不是线程安全的。解决读图用单线程测量逻辑可以并行但每个线程用独立的图像副本别共享numpy数组。5. 精度再往上走亚像素卡尺工具与 GRR 验证如果产线要求 ±0.01mm 的重复性前面那套 Canny 加霍夫直线的方案就不够了。我一般会自己写一个卡尺工具在边缘附近沿搜索线取灰度剖面做高斯拟合求极值点再把多个搜索线的结果取平均。这样单边边缘的定位重复性能到 0.1 像素以内换算到 0.02mm/像素的分辨率就是 ±0.002mm。def caliper_edge(gray, start, end, num_lines10, search_len30): 卡尺工具多条搜索线取平均 points [] for i in range(num_lines): t i / (num_lines - 1) cx start[0] t * (end[0] - start[0]) cy start[1] t * (end[1] - start[1]) # 沿垂直方向搜索 p1 (cx - search_len / 2, cy) p2 (cx search_len / 2, cy) edge subpixel_edge(gray, p1, p2) points.append(edge) # 取平均 xs [p[0] for p in points] ys [p[1] for p in points] return np.mean(xs), np.mean(ys)num_lines越多平均效果越好但计算量也越大。产线节拍允许的话取 20 到 30 条。search_len要覆盖边缘可能的漂移范围一般取 20 到 50 像素。验证测量系统能力用 GRR选 10 个工件每个工件测 3 次换 2 个操作员各测一轮算重复性和再现性。%GRR 低于 10% 说明测量系统合格10% 到 30% 可接受但要看应用场景超过 30% 就得改方案。这个分析用 Python 的pandas和numpy就能算不需要专门软件。我自己踩过的坑是标定完觉得万事大吉直接上线结果夜班灯光变化导致边缘阈值失效一批件全判 NG。后来养成习惯每次换班先拿标准件跑一遍确认测量值在公差中值附近再开线。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

open-code-review实战:如何搭建高效的代码评审体系

open-code-review实战:如何搭建高效的代码评审体系

1. 从“open-code-review”这个名字说起:它到底想解决什么问题第一次看到open-code-review这个标题,我脑子里蹦出来的不是某个具体工具,而是一类非常典型的工程痛点:代码评审这件事,喊了这么多年,真正做得顺…

2026/10/13 0:18:49 阅读更多 →
LSTM财务因子选股模型:数据对齐与回测防泄漏实战

LSTM财务因子选股模型:数据对齐与回测防泄漏实战

简介:毕业设计专用的LSTM财务因子预测选股模型源码包,基于Python实现,适合计算机、AI、通信、自动化、电子信息等专业学生完成毕业设计、课程设计或课内作业,也可作为量化金融与深度学习入门者的进阶练习。包内共14个文件&#xf…

2026/10/13 0:18:49 阅读更多 →
代码评审自动化流程搭建指南:从零实现工程化评审

代码评审自动化流程搭建指南:从零实现工程化评审

1. 从零搭建一套代码评审自动化流程的完整思路第一次听到“open-code-review”这个词,很多人会以为它只是某个开源工具的代号。实际上,它代表的是一类非常务实的需求:把代码评审这件事从“靠人盯、靠自觉”变成“有流程、有工具、有记录、可追…

2026/10/13 0:18:49 阅读更多 →

最新新闻

Python+Django+Vue实现流浪狗救助捐赠平台全栈开发实战

Python+Django+Vue实现流浪狗救助捐赠平台全栈开发实战

从接到这个项目需求的第一天起,我就很清楚它要解决的不只是"给流浪狗一个展示页面"这么简单。真正的痛点在信息不对称:救助站有狗没人领、有需求找不到稳定的捐赠来源,热心市民想帮忙却不知道钱和物具体用到了哪里。所以这个基于Py…

2026/10/13 4:03:59 阅读更多 →
m3u8直链解析源码实战:HLS分片地址提取与避坑指南

m3u8直链解析源码实战:HLS分片地址提取与避坑指南

简介:这份资源是一套m3u8直链解析源码,面向需要为视频站点或自建播放器接入m3u8解析能力的开发者,尤其适合使用ckplayer播放器、希望快速实现直链播放与解析整合的技术人员。压缩包共33个文件,约453KB,以png、jpg图片素…

2026/10/13 4:03:59 阅读更多 →
Linux Socket编程预备知识:从网络分层到字节序实战

Linux Socket编程预备知识:从网络分层到字节序实战

套接字Socket编程这块,很多人一上来就打开编辑器写代码,结果被各种编译错误、段错误、连接失败搞得一头雾水。其实问题多半不是出在代码上,而是预备知识没补齐。这篇东西就是写给那些正准备接触Linux网络编程的人,先从预备阶段把网络分层、地址结构、字节序、端口这些底层逻辑理…

2026/10/13 4:03:59 阅读更多 →
Cisco ASA防火墙9.5(2)综合配置实战:NAT、ACL与双出口切换详解

Cisco ASA防火墙9.5(2)综合配置实战:NAT、ACL与双出口切换详解

做网络这行的,肯定绕不开Cisco ASA防火墙9.5(2)这个版本。它不像新平台那么抢眼,但在中低端安全接入场景里,稳定性和资料完整度绝对算得上老牌选手。很多兄弟接手一台设备,翻来覆去就那几条命令,可一旦要动NAT、ACL、双…

2026/10/13 4:03:59 阅读更多 →
GTC 2026深度解读:从五层蛋糕框架看懂GPU技术版图

GTC 2026深度解读:从五层蛋糕框架看懂GPU技术版图

这几年只要圈里聊起 GPU 技术大会,大家嘴里多半都会蹦出一个词:五层蛋糕。我第一次听到这个比喻时也愣了一下,后来把历年的技术发布、生态发展和行业落地串在一起看,才发现这个说法虽然听起来像甜品店菜单,其实正好把整…

2026/10/13 4:03:59 阅读更多 →
darknet运行报错libopencv_highgui.so.3.2缺失?动态库排查与解决全攻略

darknet运行报错libopencv_highgui.so.3.2缺失?动态库排查与解决全攻略

直接跑./darknet就报错error while loading shared libraries: libopencv_highgui.so.3.2,这种动态库缺失的问题,估计每个搞深度学习目标检测的人都被它堵过一阵子。明明编译都过了,运行却翻车,查了半天也不知道到底哪里没对上。如…

2026/10/13 4:02:58 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →