Mean shift目标跟踪算法全解析:从原理到Python实现
做视觉跟踪的同行估计都有过这种纠结项目预算不够上不了带深度学习加速卡的设备给的CPU算力也就够跑实时视频流需求却明明白白写着“对选定目标进行持续跟踪”。我几次在这种处境下回头翻老算法最后都落到了Mean shift目标跟踪算法上。它在人脸、车辆、运动目标的跟踪场景里表现稳定单帧耗时可以压到几毫秒到几十毫秒而且不依赖任何训练数据。这篇文章我会把Mean shift目标跟踪算法从原理到实现完整拆一遍包含可以直接复现的Python代码以及我实际调试中总结出的避坑经验。不管是学生做课题还是工程师做边缘设备部署都可以参考。1. Mean shift目标跟踪到底在做什么1.1 从“跟着人群走”理解均值漂移Mean shift直译过来就是“均值漂移”整个算法做的事非常形象反复把当前估计位置向邻域内样本的均值方向移动直到收敛到概率密度的局部极大值点。可以类比成“跟着人群走”——你在一个广场上周围行走的人群就是样本点你不知道市中心在哪里但每次向周围人群最密集的中心挪一步走几步之后就会发现周围的人越来越多最终把位置定在人群最密集的区块。在目标跟踪任务里Mean shift做的事情非常类似。我们要跟踪的目标可以看作一个由大量像素点构成的样本集这些像素的颜色分布就是它的“身份特征”。每帧开始时以上一帧目标中心作为起点在画面中找到一个颜色分布和目标模型最相似的区域那么这个区域的中心就是目标的新位置。帧与帧之间目标移动距离通常不大所以这个“从旧位置起步找重心”的策略非常顺理成章。1.2 为什么这项老技术至今不过时我自己的体会是Mean shift虽然不是最精确的跟踪方法但在很多受限场景下依然是首选核心原因有这么几条无需训练。不给任何标注样本也不需要离线训练分类器用户在第一帧框选目标之后直接开工。计算量小且收敛快。每帧只做一次直方图统计、权重计算和加权重心更新迭代次数通常不超过5次。对目标轻微形变和旋转有容忍度。因为匹配的是颜色分布而不是像素模板目标转身、表情变化、局部遮挡都不会立刻导致跟丢。代码量小、跨语言容易。从Python到C再到嵌入式C都很好移植不依赖庞大的依赖库。当然算法也有明显短板窗口尺寸固定目标一旦出现较大尺度变化就容易失效遇到与目标颜色相近的背景区域时可能产生漂移被完全遮挡后基本无法自行恢复。这些并不是劝退理由恰恰是做工程的人更需要提前知道的地方。1.3 两个关键数学式子帮你吃透核密度估计与漂移向量Mean shift的推导起点是核密度估计。假设目标区域内有n个像素样本x_i我们想估计它们背后隐含的概率密度分布。核密度估计的基本想法是用一个平滑的核函数对每个样本附近“加一个鼓包”鼓包的形状由核函数决定所有鼓包叠加起来就是估计的密度函数。在这个框架下密度的梯度方向可以转化为一个简洁的均值漂移向量。若采用Epanechnikov核计算量还会进一步简化。Epanechnikov核的形式是K(r) max(0, 1 - r^2)其中r表示样本点到当前估计位置的距离。这个核的特点是中间高、四周低且导数正好是常数这让最终迭代公式异常简洁。Mean shift向量写为M(y) (Σ w_i (x_i - y)) / (Σ w_i)这里w_i是第i个样本点的权重y是当前估计位置。向量M(y)指向密度增加最快的方向。把它加到当前位置上就得到新位置y ← y M(y) Σ w_i x_i / Σ w_i换句话说新位置恰好就是邻域内所有样本的加权质心。每次迭代只是在“找这堆像素的加权重心”不断拿到新的重心持续移动直到重心不再明显变化。目标跟踪里的Mean shift本质上就是每一帧都在重复这个“找重心”的过程。2. 三大核心模块逐个拆解2.1 目标模型加权颜色直方图的构建逻辑目标跟踪的第一步是在第一帧框选目标之后把目标“翻译”成一个可计算的数学模型。Mean shift目标跟踪采用颜色直方图作为目标模型。为什么选用颜色直方图而不是边缘特征或者像素模板因为直方图统计的是颜色分布不依赖像素的精确排列对跟踪过程中不可避免的微小形变、旋转、部分遮挡都有一定的容忍度。颜色空间的选择直接影响效果。常见做法是把图像从BGR转到HSV并且只使用H和S两个通道。我自己的习惯是H通道分成16个binS通道分成8个bin两个通道联合得到128维特征向量。这样做的原因很实用H分量代表色调S代表饱和度把它们和亮度V分离后目标受光照亮度变化的影响明显减小。如果用RGB直接做直方图只要一点点光照变化整条直方图就会剧烈抖动跟踪稳定性自然跟着崩。但仅仅统计颜色还不够一个特别容易被忽略的细节是加权。想象你框选的目标边缘混入了一点背景色或者框稍微画大了把周围的栏杆、树叶包含进来。普通直方图把每个像素等权处理这些背景色会直接污染目标模型。加权直方图的处理方式是越靠近目标中心权重越大越靠近边缘权重越小。权重由核函数赋予用的就是上一节提到的Epanechnikov核。当像素在中心时r0权重为1当像素在边缘时r1权重为0。目标模型的主要能量集中在中心区域边缘像素只是辅助修正。这个细节做没做直接决定算法在复杂背景下的表现。2.2 候选区域匹配Bhattacharyya系数为什么有效处理每一帧时我们需要在上一帧目标位置附近框出一个候选区域用同样的方式计算候选区域的加权颜色直方图p(y)。注意候选区域的中心和大小都取自上一次跟踪结果所以问题被简化成在当前帧找到一个位置y让候选直方图p(y)和目标直方图q最相似。衡量两个直方图相似度Mean shift采用的是Bhattacharyya系数rho(p, q) Σ_u sqrt(p_u(y) * q_u)其中u遍历直方图的每一个bin索引。这个系数取值在0到1之间越大越相似完全相同的直方图系数为1完全不重叠为0。为什么不用更常见的欧氏距离或者余弦相似度我理解有两个原因。第一Bhattacharyya系数从信息论角度看度量的是两个概率分布的重叠程度对直方图的稀疏性不像欧氏距离那么敏感第二它的计算只需要一次开方和一次求和非常快完全符合实时跟踪需求。实际使用中候选区域与目标位置匹配良好时系数通常能到0.6以上如果某一段连续帧里系数掉到0.3以下基本可以判断目标已经跟丢或者被严重遮挡了。2.3 像素权重与迭代公式一句话讲透机制有了目标模型q和候选模型p(y)后我们要为候选区域里的每一个像素计算一个权重w_i。这个权重决定了Mean shift迭代时每个位置的像素会把中心往自己这边拉多大的力量。公式如下w_i Σ_u sqrt(q_u / p_u(y)) * δ[b(x_i) - u]这里b(x_i)是像素x_i所属的直方图bin索引δ是克罗内克函数仅当索引一致时取1否则取0。用大白话解释如果某个颜色在目标直方图里占比高但在当前候选区域里占比低那么拥有这个颜色的像素权重就大反之权重就小。换句话说候选区域里哪些颜色更像目标哪些像素就更用力地把中心拉向自己。整个迭代更新过程可以总结为四步以上一帧位置y0为圆心取候选区域计算候选直方图p(y0)。根据公式计算每个像素的权重w_i。代入加权重心公式y_new Σ w_i x_i / Σ w_i得到新位置。如果||y_new - y0||小于阈值通常取半像素到1像素停止迭代否则把y0更新为y_new回到第1步。实测下来正常情况下每一帧迭代3到5次就会收敛。相比遍历整张图做模板匹配的做法这相当于把位置搜索限定在一个局部邻域计算量小了一个数量级。3. 从零实现一个可运行的Mean shift跟踪器3.1 环境准备与工程结构设计为了把算法每一步讲明白我这里直接用Python从零实现核心模块只依赖两个基础库numpy负责矩阵运算OpenCV负责读视频和绘制结果。你可以把代码直接跑起来再逐步拆解每一块在干什么。整体工程结构分三层工具层读取视频帧、接收初始目标框。算法层加权直方图计算、Bhattacharyya系数、Mean shift迭代函数。应用层视频主循环、跟踪框维护和绘制。算法层是本体的核心也是接下来要重点展开的代码。3.2 加权直方图计算代码与要点先实现加权直方图计算函数。它接收一帧图像、目标中心、半径和色调饱和度bin数输出一个归一化后的128维直方图向量。import numpy as np import cv2 def compute_weighted_hist(frame, cx, cy, radius, h_bins16, s_bins8): h, w frame.shape[:2] x0, x1 max(0, int(cx - radius)), min(w, int(cx radius 1)) y0, y1 max(0, int(cy - radius)), min(h, int(cy radius 1)) if x1 x0 or y1 y0: return None patch frame[y0:y1, x0:x1] ys, xs np.meshgrid(np.arange(y0, y1), np.arange(x0, x1), indexingij) dx xs - cx dy ys - cy dist2 dx * dx dy * dy mask dist2 radius * radius if not mask.any(): return None r np.sqrt(dist2[mask]) / radius kernel_weights 1.0 - r * r hsv cv2.cvtColor(patch, cv2.COLOR_BGR2HSV) h_ch hsv[:, :, 0].astype(np.float64) s_ch hsv[:, :, 1].astype(np.float64) h_bin np.clip((h_ch * h_bins / 180.0).astype(np.int32), 0, h_bins - 1) s_bin np.clip((s_ch * s_bins / 256.0).astype(np.int32), 0, s_bins - 1) bin_idx h_bin * s_bins s_bin hist np.bincount(bin_idx[mask], weightskernel_weights, minlengthh_bins * s_bins).astype(np.float64) total hist.sum() if total 1e-6: hist / total return hist几个容易出错的细节我一个个说。第一bin_idx是对整个patch区域计算的但只有mask以内的像素才进入直方图边缘以外的像素不做统计因为它们已经不在核函数支持范围内。第二np.bincount的minlength参数很重要如果不设置当某些bin没有任何像素时返回的向量长度会小于h_bins*s_bins后面计算会遇到维度不匹配错误。第三直方图最后要除以权重总和让所有bin之和等于1这样才能作为概率分布参与后续的Bhattacharyya系数计算。3.3 迭代跟踪主循环与收敛判断接下来是Mean shift迭代函数。它接收一帧图像、当前中心、半径以及目标直方图返回一次迭代后的新中心位置和位移量。def bhattacharyya(p, q): return float(np.sum(np.sqrt(p * q))) def mean_shift_iter(frame, cx, cy, radius, target_hist, h_bins16, s_bins8): h, w frame.shape[:2] x0, x1 max(0, int(cx - radius)), min(w, int(cx radius 1)) y0, y1 max(0, int(cy - radius)), min(h, int(cy radius 1)) if x1 x0 or y1 y0: return (cx, cy), 0.0 patch frame[y0:y1, x0:x1] ys, xs np.meshgrid(np.arange(y0, y1), np.arange(x0, x1), indexingij) dx xs - cx dy ys - cy dist2 dx * dx dy * dy mask dist2 radius * radius if not mask.any(): return (cx, cy), 0.0 r np.sqrt(dist2[mask]) / radius kernel_weights 1.0 - r * r hsv cv2.cvtColor(patch, cv2.COLOR_BGR2HSV) h_ch hsv[:, :, 0].astype(np.float64) s_ch hsv[:, :, 1].astype(np.float64) h_bin np.clip((h_ch * h_bins / 180.0).astype(np.int32), 0, h_bins - 1) s_bin np.clip((s_ch * s_bins / 256.0).astype(np.int32), 0, s_bins - 1) bin_idx h_bin * s_bins s_bin cand_hist np.bincount(bin_idx[mask], weightskernel_weights, minlengthh_bins * s_bins).astype(np.float64) total cand_hist.sum() if total 1e-6: cand_hist / total rho bhattacharyya(cand_hist, target_hist) if rho 1e-6: return (cx, cy), 0.0 ratio np.sqrt(target_hist / (cand_hist 1e-6)) pixel_weights ratio[bin_idx[mask]] * kernel_weights valid_x xs[mask] valid_y ys[mask] w_sum pixel_weights.sum() if w_sum 1e-6: return (cx, cy), 0.0 new_cx float(np.sum(valid_x * pixel_weights) / w_sum) new_cy float(np.sum(valid_y * pixel_weights) / w_sum) shift np.sqrt((new_cx - cx) ** 2 (new_cy - cy) ** 2) return (new_cx, new_cy), shift主循环部分每帧先从上一次的位置开始迭代直到位移小于阈值或者达到最大迭代次数。def run_tracker(video_path, init_box, max_frames300): cap cv2.VideoCapture(video_path) ok, frame cap.read() if not ok: return cx, cy, w, h init_box radius max(w, h) / 2.0 target_hist compute_weighted_hist(frame, cx, cy, radius) while ok: cx, cy int(cx), int(cy) for _ in range(10): (cx, cy), shift mean_shift_iter( frame, cx, cy, radius, target_hist) if shift 0.5: break cv2.circle(frame, (int(cx), int(cy)), int(radius), (0, 255, 0), 2) cv2.imshow(mean_shift_tracker, frame) if cv2.waitKey(30) 0xFF ord(q): break ok, frame cap.read() cap.release() cv2.destroyAllWindows()注意我在候选直方图的分母上加了一个1e-6这是为了防止某些bin取值为0导致除零。实际调试中没少被这个问题坑过。3.4 调参经验bin数、核半径、迭代阈值代码跑通之后调参会直接影响跟踪效果。我整理几个关键参数的实际经验参数我的推荐值说明H bin数16太小区分度不足太大直方图稀疏S bin数8与H联合使用S单独维度太低核半径目标初始宽高的0.5倍反映目标实际大小的一半迭代阈值0.5像素小于0.5像素收益很小只会增加计算最大迭代次数10正常3到5次就够10次作为保护上限bin数量和核半径是最值得花时间调的两个参数。目标颜色本身比较纯净时可以适当减少S bin数背景中有大量相似色调时适当增加H bin数可以提高区分能力。核半径如果设得太小目标稍微移动就会丢出搜索范围设得太大候选区域包含大量背景直方图被背景污染位置更新会被背景颜色带偏。4. 实战排查那些年跟踪器踩过的坑4.1 目标漂移与相似背景干扰目标漂移是Mean shift被吐槽最多的问题也是最常见的失效模式。典型场景是目标穿着红色上衣画面里有一块同样偏红色的背景广告牌跟踪框会逐渐被广告牌“吸”过去。原因很好解释——目标模型和候选区域的Bhattacharyya系数在真实目标和相似背景之间出现了两个局部极大值迭代会滑向其中一个。排查思路我一般按几步走。第一步提高直方图的bin数量提升颜色区分度。第二步适当缩小核半径减少背景像素进入候选区域。第三步在直方图中降低权重占比过高的bin因为目标模型里如果某一种颜色占比异常大相似背景一旦出现吸引力就会非常大。第四步给跟踪结果加一个运动约束比如连续帧中心位移不能超过某个像素距离超了就抛出异常触发重新初始化。4.2 尺度变化与窗口自适应标准Mean shift的核半径是固定的但真实目标不会一直停在原地一动不动。人走近摄像头会变大走远会变小车辆转弯会改变外轮廓。固定半径的结果有两类目标变大时跟踪框只覆盖局部目标变小时跟踪框包含大量背景。我实际用得最多的方案是多尺度搜索。每帧迭代收敛后再把半径乘以0.8、0.9、1.1、1.2这几个系数各算一次候选直方图和Bhattacharyya系数取系数最高的那个尺度作为当前帧结果。这个做法只增加了几次直方图统计的代价却能明显延长跟踪的寿命。需要注意尺度变化不宜太大否则直方图的粒度不匹配反而容易跟丢。4.3 性能优化思路与实测对比初版实现通常跑在逐像素循环上Python写出来一眼就明白但速度惨不忍睹。我在本机用一段720p视频做过对比纯两层for循环处理一帧候选区域要130毫秒左右完全不具备实时性。改成numpy向量化之后单帧降到12到20毫秒。如果再上积分直方图做预计算单帧可以压到6毫秒附近。实现方式单帧耗时720p备注纯Python双层循环约130ms只适合教学演示numpy向量化约15ms常规Python方案够用积分直方图预计算约6msC部署常用方案向量化的关键是把像素坐标网格、距离计算和直方图统计全部转成数组运算。上面的代码已经用了这个思路。如果你的项目对性能还有更高要求建议在C实现里把HSV转换和直方图统计合并成一遍扫描并用积分图计算任意矩形区域的加权直方图能进一步省掉重复扫描的开销。4.4 现场调试技巧把中间过程可视化调试跟踪算法不能只盯着最终框看很多时候框没丢但实际已经在漂移靠肉眼看框很难察觉。我习惯在调试模式下把几类中间结果画出来。第一类每帧的Bhattacharyya系数直接打印成曲线如果系数持续下降说明目标特征正在退化。第二类候选区域里每个像素的权重w_i用热力图显示能直观看到是背景区域还是目标区域在主导重心位移。第三类迭代轨迹每次更新的中心用不同颜色的点画出来收敛过程一目了然。有一次我用这套可视化手段排查一个夜间场景漂移问题发现问题出在目标衣着颜色被路灯照得发黄HSV的H分量发生了偏移Bhattacharyya系数从0.8掉到0.4。后来在预处理环节对H通道做了简单归一化稳定了很多。这个经验说明任何调参都不如把算法内部过程打开看一眼来得直接。最后再分享一个小技巧Mean shift迭代权重计算时如果你发现目标反复横跳、每帧中心都在剧烈抖动可以先检查一下是否忘记把直方图归一化。未归一化的直方图会导致Bhattacharyya系数和权重比例全部失真这是我见过最隐蔽的低级错误之一。把直方图归一化这个点印在脑子里后续几乎所有跟踪问题的排查都能少走弯路。

相关新闻

CC Workflow Studio Skill 节点集成:从需求规范到可视化工作流实战

CC Workflow Studio Skill 节点集成:从需求规范到可视化工作流实战

AI 应用Agent 工作流开发工具MCP 服务 【免费下载链接】cc-wf-studio CC Workflow Studio 项目地址: https://gitcode.com/gh_mirrors/cc/cc-wf-studio 点击查看 免费下载 导读:本文围绕 CC Workflow Studio(cc-wf-studio)仓库中…

2026/10/13 6:06:41 阅读更多 →
Wing vs Pulumi:同一款云应用,7 行 Wing 对比 98 行 Pulumi 的完整差异解析

Wing vs Pulumi:同一款云应用,7 行 Wing 对比 98 行 Pulumi 的完整差异解析

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/13 6:06:41 阅读更多 →
SystemUI定制实战:从架构原理到状态栏修改与崩溃排查

SystemUI定制实战:从架构原理到状态栏修改与崩溃排查

四十九天这个节点,我终于把SystemUI这块硬骨头啃到能动手改东西的程度了。说实话,SystemUI可能是整个Android FrameWork体系里最“日常”、但也最容易劝退新人的模块。你现在手机屏幕上看到的状态栏、下拉通知面板、快捷开关、锁屏、音量条,甚…

2026/10/13 6:06:41 阅读更多 →

最新新闻

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

本文基于作者上百场大模型面试经验,提炼出2026年大模型面试的核心考察点,包括Agent方向岗位增多、简历价值变化、准备时机等。文章强调“为可靠付钱”的行业趋势,建议候选人关注Agentic与推理能力、业务链路闭环、项目深度和评价维度变化。此…

2026/10/13 10:16:45 阅读更多 →
Windows Terminal 定制全攻略:配色、字体与提示符打造专属控制台

Windows Terminal 定制全攻略:配色、字体与提示符打造专属控制台

各位用 Windows 的朋友应该都有过这样的经历:每天打开系统自带的 CMD 或者 PowerShell 窗口,黑底白字,一条条命令敲下去,总觉得少了点什么。直到我第一次接触 Windows Terminal,才意识到原来控制台也可以玩出这么多花样…

2026/10/13 10:16:45 阅读更多 →
液压伺服电动机状态空间建模与控制器设计仿真

液压伺服电动机状态空间建模与控制器设计仿真

这个题目我太熟了,控制类和机电类专业做课设、毕设,十个里有八个会碰到“液压伺服电动机的状态空间设计与仿真”这种组合。对象是电液伺服系统,方法是现代控制理论的状态空间法,工具是Matlab。这套源程序迭代到14900期&#xff0c…

2026/10/13 10:16:45 阅读更多 →
Qt xcb插件加载失败原因与修复指南

Qt xcb插件加载失败原因与修复指南

1. 问题本质:这不是Qt程序崩溃,而是图形系统“失联”了你看到这行报错——This application failed to start because it could not find or load the Qt platform plugin xcb——第一反应可能是“Qt坏了”“程序编译错了”“Linux系统不兼容”。但实话讲…

2026/10/13 10:16:45 阅读更多 →
蓝屏0x10E显存管理内部错误:从驱动到BIOS的笔记本排查实战

蓝屏0x10E显存管理内部错误:从驱动到BIOS的笔记本排查实战

最近手头碰到一台新到的某品牌笔记本,配置是 Ultra X7 358H 处理器加独立显卡的组合,系统装好没两天就开始出问题。现象很典型:浏览网页或者看视频的时候突然画面卡住,随后屏幕一黑,直接蓝屏,错误代码0x10E…

2026/10/13 10:16:45 阅读更多 →
FFMpeg 4.1音频检测实战:命令详解与批处理自动化

FFMpeg 4.1音频检测实战:命令详解与批处理自动化

做内容生产这一年多,我处理过最多的活儿不是剪辑,而是给一堆音频素材做体检。尤其是接手播客剪辑、视频课程批量转码这类项目时,几十个甚至上百个文件摆在面前,里面哪个有静音、哪个音量忽大忽小、哪个爆音了,光靠耳朵…

2026/10/13 10:15:43 阅读更多 →

日新闻

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

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

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

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 阅读更多 →