OpenCV车道线检测从入门到避坑:五步流程与参数调优
简介面向自动驾驶与智能交通方向学习者的PythonOpenCV车道线检测实践资源以简易实现为主线讲解如何通过Canny边缘检测获取边缘信息、霍夫变换寻找直线、绘制梯形感兴趣区域提取车前范围并按斜率进行线性拟合与过滤最终绘制出左右车道线。资源将完整思路、效果图与代码实现整理为一份PDF文档便于对照学习和快速上手。压缩包共1个PDF文件大小仅168KB内容紧凑但覆盖了从图像预处理到车道线绘制的核心流程。目前已有7267人学习浏览适合具备Python和OpenCV基础、希望快速入门车道线检测或完成相关课程设计的读者。通过这份资料可掌握边缘检测、霍夫变换、ROI掩膜、斜率筛选与直线拟合等关键技巧并理解从基础版到改良版的实现差异。1. 车道线检测是入门OpenCV最好的“小项目”但随便抄代码很容易翻车如果你用 pythonopencv 做过车道线检测简易实现大概率会遇到这样的场景代码从网上抄下来车道上明明有白线检测结果却是一团乱麻或者静止画面看着还行一换到高速道路视频线直接消失。这不是 OpenCV 出了问题而是这个简易项目里藏着几个“看起来简单、实际很讲究”的环节。做车道线检测的第一性原理其实很直白路面颜色单调车道线是规则的几何线条通过边缘检测找出灰度突变区域再用直线拟合把“像车道线”的线段筛选出来。听起来三句话就能写完但真正落地的时候灰度化、高斯模糊、Canny 边缘检测、ROI 区域裁剪、霍夫变换直线检测这五个步骤各有各的脾气。这篇就按一条完整链路讲清楚先明白每一步为什么存在再给出一份可以直接跑通的最小实现最后把新手必踩的坑逐个拆开。新手能照着抄作业有一定经验的人也能在自己代码里找到几个值得改掉的坏习惯。2. 车道线检测的完整处理链路灰度、边缘、ROI 与霍夫变换为什么缺一不可2.1 灰度化与高斯模糊为什么要先去掉颜色信息摄像头拿到的原始帧是 BGR 三通道彩色图但车道线检测真正依赖的信息只有“亮度变化”。彩色图里每个像素有三个值运算量大而且颜色信息容易受到光照和阴影干扰——比如黄色车道线在夕阳下可能变成橙色白色车道线在树荫里可能变成灰色。直接对彩色图做边缘检测不仅慢还会把路面的颜色分界线误判成车道线。常见的做法是先用cv2.cvtColor把 BGR 转成灰度图把三通道压缩成一维亮度。这一步损失的信息对车道线来说几乎可以忽略车道线之所以能被看见本质上是它和路面之间存在明显的灰度差。灰度图还不够下一个步骤是高斯模糊。几乎所有入门教程都会加上cv2.GaussianBlur但很多人不理解为什么边缘检测之前反而要“模糊”。边缘检测本质上是对像素灰度求导对噪声极其敏感。路面上的颗粒、轮胎痕迹、反光点都会产生高频噪声如果不去掉Canny 会把它们全当成边缘。高斯模糊就是用邻域加权平均把那层高频噪声抹平让真正的车道线边缘保留下来。核大小一般取 5×5sigma 取 0OpenCV 会根据核大小自动计算。核太大细车道线也会被抹掉核太小噪声过滤不干净。2.2 Canny 边缘检测双阈值的直觉理解Canny 边缘检测是整个处理链路里“最玄学”的一步因为它的效果非常依赖两个阈值参数。Canny 的思路是找灰度变化剧烈的位置但如果只用单一阈值判断会出现两种情况阈值设高了真实边缘断裂阈值设低了路面纹理全变成边缘。OpenCV 的 Canny 用双阈值策略解决这个矛盾。像素梯度大于高阈值的确认是边缘小于低阈值的直接丢弃处在两个阈值之间的只有和已确认边缘相连才会被保留。这样做的价值在于车道线虽然偶有断点但只要整体连续性足够断点部分仍然能通过“连接”逻辑被找回。实际调试时的经验值是高阈值取低阈值的 2 到 3 倍。比如低阈值 50、高阈值 150这个组合在白天普通路面上表现稳定。如果你在逆光或者阴影较多的道路场景里做检测低阈值可以试着降到 30高阈值跟着降到 90但要注意边缘数量会增加后续霍夫变换的干扰也随之变大。2.3 ROI 遮罩把检测范围约束到有效区域车道线只会出现在画面下方、车辆前方的一定范围内而天空、路牌、护栏、对面来车都在画面里这些区域的边缘信息对车道线检测是纯噪声。ROIRegion of Interest遮罩的作用就是粗暴地把这些区域直接清零。这在工程上叫“先验约束”用已知的空间位置信息减少算法的搜索范围。对于固定安装在车辆上的摄像头车道线出现的区域相对固定所以可以手工画一个梯形或三角形的 ROI 区域。常见做法是用一个全黑 mask在 ROI 内填充白色再用cv2.bitwise_and将边缘图和 mask 重叠只保留 ROI 内的边缘。这里有一个新手容易忽略的细节ROI 的顶点坐标由画面尺寸换算而来不要把顶点值写死。不同分辨率的视频画面高度宽度不同ROI 形状就完全失效。应对方式很简单用frame.shape拿到高和宽按比例取顶点位置。2.4 HoughLinesP从直角坐标到极坐标的概率投票到了这一步我们已经得到一张干净的边缘图里面可能包含车道线、路沿和一些噪点。接下来要解决的问题是哪些边缘点应该被连接成直线并且是哪条直线。HoughLinesP 的核心思想是极坐标空间中的“投票”。直角坐标系里的一条直线可以表示为rho x * cos(theta) y * sin(theta)其中 rho 是原点到直线的垂直距离theta 是垂线与 x 轴的夹角。检测时每个前景像素点都会在参数空间里对应一条曲线多条曲线交汇的位置就代表“很多点在同一条直线上”交点得票数超过阈值时就被认定为一条直线。需要注意 HoughLinesP 的“P”代表 Probabilistic概率它并不是让所有点都参与投票而是随机抽样一部分点所以速度更快适合实时处理。但输出结果是一个个线段不是完整的直线方程。这意味着你需要拿到线段端点的坐标然后在代码里自己做延长、合并或分组处理。这也是后面很多坑的来源。3. 用 pythonopencv 跑通最小实现完整脚本与关键参数调优思路3.1 最小脚本框架从读入到绘制的四个函数下面这份代码是一个可以直接运行的最小版本结构上拆成了预处理、ROI 裁剪、直线检测、绘制四个函数。建议你先把它跑通再看后面的参数调整部分。import cv2 import numpy as np def preprocess(frame): # 转灰度 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 高斯模糊核大小5x5sigma取0由OpenCV自动计算 blurred cv2.GaussianBlur(gray, (5, 5), 0) # Canny边缘检测低阈值50高阈值150 edges cv2.Canny(blurred, 50, 150) return edges def region_of_interest(edges, vertices): mask np.zeros_like(edges) # 填充ROI区域为白色 cv2.fillPoly(mask, [vertices], 255) # 只保留ROI内的边缘 masked cv2.bitwise_and(edges, mask) return masked def detect_lines(masked): # 概率霍夫变换 lines cv2.HoughLinesP( masked, rho1, thetanp.pi / 180, threshold50, minLineLength50, maxLineGap80 ) return lines def draw_lines(frame, lines): line_img np.zeros_like(frame) if lines is not None: for line in lines: x1, y1, x2, y2 line[0] cv2.line(line_img, (x1, y1), (x2, y2), (0, 255, 0), 8) # 把车道线和原图叠加 result cv2.addWeighted(frame, 0.8, line_img, 1.0, 0.0) return result # 主流程 cap cv2.VideoCapture(0) # 0 表示摄像头也可以换成视频文件路径 while True: ret, frame cap.read() if not ret: break h, w frame.shape[:2] # ROI顶点梯形区域底部取全宽顶部取中间60%高度附近 vertices np.array([[ (0, h), (int(w * 0.45), int(h * 0.6)), (int(w * 0.55), int(h * 0.6)), (w, h) ]], dtypenp.int32) edges preprocess(frame) masked region_of_interest(edges, vertices) lines detect_lines(masked) result draw_lines(frame, lines) cv2.imshow(lane detection, result) # 按 q 退出 if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这份代码的逻辑很直接每读一帧先做灰度化和高斯模糊再用 Canny 提取边缘然后按预设的梯形 ROI 区域过滤掉无用边缘接着交给 HoughLinesP 找线段最后把线段画到黑色画布上和原图加权叠加。权重 0.8 和 1.0 的意思是原图保留 80% 亮度线图层以 100% 亮度覆盖上去视觉效果比较清晰又不会完全遮挡路面。3.2 必须搞懂的核心参数表下面这组参数是这份简易实现的“命门”每个参数单独拿出来调整效果差异都极大参数位置默认值作用与调节方向高斯核大小GaussianBlur(5, 5)核越大图像越模糊噪声越少但车道线边缘也会变粗Canny 低/高阈值Canny50 / 150低阈值决定边缘开始保留的梯度强度高阈值决定强边缘的判断线rhoHoughLinesP1极坐标系的距离分辨率单位是像素1 表示逐像素扫描thetaHoughLinesPnp.pi/180角度分辨率1 度扫描一个方向越小精度越高但计算量越大thresholdHoughLinesP50一条直线最少需要多少投票点越小越容易检测出短线minLineLengthHoughLinesP50小于该长度的线段直接丢弃单位像素maxLineGapHoughLinesP80同一条直线上两个线段之间的最大允许间隔用于连接断线实际操作中minLineLength和maxLineGap最需要根据你的视频分辨率调整。分辨率很高时比如 1920×108050 像素的线段可能只是一块路面上很小的碎片会产生大量短噪声分辨率低时比如 640×48050 像素又可能是半条车道线。我一般先把图片缩放到统一宽度再做检测这样参数不会跟着视频源变化。3.3 从单帧到视频流让检测真正“动”起来上面代码里的 while 循环就是视频流处理的标准结构。这里有个容易踩坑的点直接用cv2.VideoCapture(0)读摄像头时每帧的大小和帧率取决于摄像头驱动如果画面卡顿不一定是检测算法慢可能是imshow显示窗口阻塞了读取循环。这时候可以加一个队列或者直接用cap.grab()和cap.retrieve()分离读取与解码但对简易实现来说没必要过度设计。如果你用的是视频文件而不是摄像头构造VideoCapture时把文件路径传进去即可。注意很多路面视频是 30 帧每秒但代码里的waitKey(1)会以接近无限帧率的速度跑结果视频播放速度会明显偏快。想控制帧率可以改成waitKey(30)大约是 33 毫秒一帧接近 30 帧每秒的节奏这是入门阶段最容易忽略的细节。4. 车道线检测落地避坑五个新手必踩的坑与排查方法4.1 Canny 阈值乱给导致边缘断裂新手最常见的问题用了网上抄来的阈值在一条路况很好的视频里车道线断成一截一截霍夫变换检测出来的线段又短又碎画面像被撒了一地铁屑。原因是 Canny 的高阈值设得太高或者低阈值设得太低。高阈值过高会让真实边缘中被判定为“强边缘”的像素过少低阈值过低又会引入大量路噪但两者之间缺少一个合理的过渡。解决方式是回到灰度图上去观察先用cv2.imshow显示 Canny 的输出如果边缘图里车道线完整那就是霍夫参数问题如果边缘图本身就断那只调 Canny 阈值。一般建议在室内光照稳定的画面里先调出一组靠谱的阈值再跑室外视频而不是每换一个视频就盲目改阈值。4.2 ROI 区域写死在遮蔽了真正的车道线有些同学把 ROI 顶点写作(0, 480, 640, 480)这类绝对坐标换一个 1280×720 的视频车道线直接被裁掉一半检测结果自然一塌糊涂。这不是算法问题是坐标写死导致的。解决方式是始终用比例换算h, w frame.shape[:2]所有 ROI 顶点都用int(w * 0.45)这样的形式计算。另一个隐蔽问题是 ROI 太窄。摄像头画面里弯道路段的车道线会靠近画面边缘如果你的 ROI 梯形两侧收得太窄弯道上的线会被直接裁掉。建议把底部两个顶点放在画面的左右边界附近给弯道留出余量。4.3 HoughLinesP 检测不到长直线边缘图里车道线清晰可见线段也很完整但lines返回None或者只返回极少数线段。这多半是minLineLength或者threshold设得太大导致霍夫投票无法满足条件。具体排查方法把minLineLength降到 20threshold降到 20看看能不能检测到。如果降下来后出现大量短线段再逐步提高数值找到一个“检测到但不过于碎片化”的平衡点。这里有个血泪经验车道线是连续的长线条但 HoughLinesP 因为随机采样偶尔会把完整车道线拆成多段所以maxLineGap可以适当调大比如 100这样断线能重新连起来。但如果maxLineGap过大路肩和车道线也可能被误连成一条线。4.4 左右车道线被画成一条直线画面明明是两条中间隔着距离的车道线结果检测结果里出现一条横跨两条车道的线或者两条线在远处交叉。这是霍夫变换把所有方向视为平等的必然结果一个噪点群恰好在极坐标空间里形成高投票点就会被当成直线。常见做法是检测出所有线段后按斜率分组。用(y2 - y1) / (x2 - x1)计算每条线段的斜率斜率为正的归左侧候选线斜率为负的归右侧候选线再分别取平均。注意 OpenCV 的图像坐标系里 y 轴向下所以视觉上朝右上方延伸的线斜率计算出来是负值这个符号问题会让人调半天调不明白。4.5 OpenCV 4.x 下 HoughLinesP 的返回值变了吗很多老教程写的是lines cv2.HoughLinesP(...)然后直接for line in lines:但 OpenCV 4.x 对返回值的结构做了调整。老版本返回的是二维数组新版本里每一行是[x1, y1, x2, y2]而line[0]在遍历时会因为数组维度不同报错或者输出异常坐标。你手边如果出现“index 0 out of bounds”类似的报错可以在遍历前打印lines.shape看看维度。常见做法有两种一种是用for line in lines:后取line[0]适用于返回的数组最外层是线段列表另一种是for x1, y1, x2, y2 in lines[:, 0]:。写代码时最好加上if lines is not None的保护因为画面里没有任何符合条件的线段时HoughLinesP 会返回None直接遍历就是空指针。5. 从画直线到拟合真实车道帧间平滑、斜率筛选与透视变换的进阶思路当你把上面这些坑都踩过一遍检测的画面里大概率能稳定出现两条绿色直线了。但离“能用”还差一步单帧检测结果抖动非常明显弯道上直线会跳变而且画出来的线段在近处和远处会乱窜。解决抖动最有效的方法不是调参而是做帧间平滑。import collections left_slopes collections.deque(maxlen10) right_slopes collections.deque(maxlen10) # 对每条线段计算斜率 # 斜率接近0的线段直接丢弃水平噪声线 # 斜率0 的放到left_slopes斜率0 的放到right_slopes # 最终取队列的平均值作为当前帧的斜率基准 if len(left_slopes) 0: avg_left sum(left_slopes) / len(left_slopes)这段代码的思路很简单缓冲最近 10 帧的斜率值取平均作为当前帧的输出。效果是单帧突然出现的噪声线会被平均掉画面稳定程度会有质的提升。再进一步如果想要处理弯道简易的直线检测就不够用了。你需要把 ROI 区域内的图像做透视变换转成鸟瞰图再做二次曲线拟合。这个方向的工作量会翻倍但检测结果的可靠性也完全不同。直线检测适合高速路上的直道场景弯道多、车道线磨损严重的路况直接上曲线拟合才是正路。我自己在做这个项目时最大的教训是OpenCV 车道线检测的难点从来不在“检测”本身而在“取舍”。你需要明确场景是白天高速还是夜间城市道路摄像头装在挡风玻璃后还是车顶不同场景下 Canny 阈值、ROI 形状、Hough 参数的合理范围都不同。建议养成一个习惯每换一个测试视频先冻结所有参数只调 Canny 低阈值和高阈值观察边缘图变化边缘图稳定后再调 Hough 参数。这套排查顺序能帮你省掉大量“玄学调参”的时间。最后分享一个实在的做法把视频抽成图片序列写一个脚本批量处理图片文件夹只用一张图调参调好后再跑视频。不要一边播放视频一边改参数那样眼睛跟不上也很难判断到底是哪一步出了问题。按这个流程走一两天内把一个稳定的简易检测 demo 搭起来是完全可以实现的。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

SQL Server 2000 数据库深度压缩:DBCC 命令实战与避坑指南

SQL Server 2000 数据库深度压缩:DBCC 命令实战与避坑指南

简介:这份资源面向SQL Server 2000数据库管理员与运维人员,针对企业管理器“收缩数据库”效果不佳、删除数据后冗余空间难以彻底释放的问题,提供一套通过DBCC命令深度压缩数据库文件的实操方案。资源包共1个docx文档,约256KB&…

2026/10/11 14:33:36 阅读更多 →
卫宁电子病历表结构拆解:HIS对接与SQL查询实战指南

卫宁电子病历表结构拆解:HIS对接与SQL查询实战指南

简介:卫宁电子病历表结构文档面向医院信息管理者、IT技术人员及医疗信息化研究人员,系统梳理了卫宁EMR 5.0的数据库设计框架,帮助读者理解临床信息系统的数据模型与标准化规范。资源包内含1个doc文件,约13.92MB,完整收…

2026/10/11 14:33:36 阅读更多 →
VC6 SP6英文绿色版:Win10下逆向老旧固件与工业协议的必备工具

VC6 SP6英文绿色版:Win10下逆向老旧固件与工业协议的必备工具

简介:本资源是经典开发环境 Visual Studio C 6.0 SP6 的英文绿色免安装版本,专为在 Windows 10 系统下复用老旧 VC6 项目而优化,面向嵌入式底层开发、高校计算机专业课程实验及遗留 C 工程维护人员。资源已集成调试崩溃补丁与 Win10 兼容性修…

2026/10/11 14:33:36 阅读更多 →

最新新闻

Python unittest框架全解析:TestCase、Fixture与工程化实践

Python unittest框架全解析:TestCase、Fixture与工程化实践

聊到Python测试,很多人第一反应是pytest。但我今天想认真聊聊unittest——Python标准库自带的测试框架。我从写第一个单测起就在用它,后来项目里跑过几千条用例,我的体会是:它看着朴素,用对了非常稳。这篇就把unittest…

2026/10/11 15:23:03 阅读更多 →
机器学习算法在金融行业中的应用:从决策树到SVM的实战拆解

机器学习算法在金融行业中的应用:从决策树到SVM的实战拆解

简介:机器学习算法在金融行业中的应用方向日益受到关注,这份PDF面向金融从业者、高校师生及算法入门者,以专业视角梳理人工智能在金融场景落地的核心原理。文档首先厘清监督学习与无监督学习的基本范式,随后逐一讲解决策树与随机森…

2026/10/11 15:23:03 阅读更多 →
语音交互设计指南:决定Alexa能否听懂你的susi_alexa_skill两个关键文件

语音交互设计指南:决定Alexa能否听懂你的susi_alexa_skill两个关键文件

【免费下载链接】susi_alexa_skill An alexa skill which can be used to ask susi for answers: "Alexa, Ask Susi Who Are You" 项目地址: https://gitcode.com/gh_mirrors/su/susi_alexa_skill 点击查看 免费下载 susi_alexa_skill 是一个把 AI 聊天机…

2026/10/11 15:23:02 阅读更多 →
长录音一跑就 OOM:显存误判、时间轴偏移、标签串人——播客切片的三个鬼故事

长录音一跑就 OOM:显存误判、时间轴偏移、标签串人——播客切片的三个鬼故事

长录音一跑就 OOM:显存误判、时间轴偏移、标签串人——播客切片的三个鬼故事 【免费下载链接】speaker-diarization-community-1 项目地址: https://ai.gitcode.com/hf_mirrors/pyannote/speaker-diarization-community-1 把一期两小时的播客丢给说话人分离…

2026/10/11 15:23:02 阅读更多 →
autobind-decorator源码剖析(上):getter惰性绑定如何做到只bind一次?

autobind-decorator源码剖析(上):getter惰性绑定如何做到只bind一次?

【免费下载链接】autobind-decorator Decorator to automatically bind methods to class instances 项目地址: https://gitcode.com/gh_mirrors/au/autobind-decorator 点击查看 免费下载 autobind-decorator 是一个轻量级的 JS 装饰器库,用于自动绑定…

2026/10/11 15:23:02 阅读更多 →
NyaTerm加密云同步完全指南:用WebDAV、S3与Gist让配置在多设备无缝流转

NyaTerm加密云同步完全指南:用WebDAV、S3与Gist让配置在多设备无缝流转

【免费下载链接】nyaterm A modern remote terminal workspace 项目地址: https://gitcode.com/gh_mirrors/ny/nyaterm 点击查看 免费下载 NyaTerm 加密云同步让 SSH 连接、密钥、密码、OTP、代理隧道与快捷命令等配置自动加密上传到 WebDAV、S3 或 Gist 等远端存储…

2026/10/11 15:22:01 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →