Haar特征计算过程详解:从积分图原理到手算示例与代码实战
Haar特征计算过程是我在参加某个开源学习小组时收获最大的一段内容。很多人刚接触计算机视觉时第一反应是深度学习、卷积神经网络一听到Haar特征就会问“这玩意儿是不是早过时了”。其实恰恰相反如果你去面试图像算法岗十有八九会被问到“Haar特征是怎么算的积分图是什么”哪怕你平时做的全是深度学习项目这两个问题也经常被用来考察基础。更实在的是Haar特征配合积分图的思路一旦真正理解了很多图像处理问题都会打开新路子。这篇文章就把Haar特征计算过程从头到尾拆开讲一遍从定义、数学原理、积分图加速到手算示例和Python代码再附上我实操时踩过的坑希望帮你一次性弄明白。1. 先把概念理清楚Haar特征到底在算什么1.1 一条边、一块亮斑怎么变成数字Haar特征最早来自小波分析里的Haar基函数思想后来被用到了图像领域专门用来描述局部的明暗对比模式。它不关心像素的具体颜色更关心“这块区域是不是比旁边那块区域亮/暗”用大白话说就是通过相邻矩形区域的像素和差异把“这里有一条边界”“这里有一块亮斑”这样的视觉模式转换成数值。具体怎么转先定义几种矩形模板最基础的有两类两矩形特征和三矩形特征。两矩形特征由一个白色矩形和一个黑色矩形组成特征值就是白色区域像素总和减去黑色区域像素总和。三矩形特征通常中间是白色、两边是黑色或者反过来特征值变成两侧黑色区域的像素和减去中间白色区域的像素和。到了四矩形特征就比较复杂比如中心区域与外围区域的差异这个常用在检测眼睛、鼻梁周围那种中心暗、四周亮的对称结构。下面我按常见分类整理一下模板类型结构示意典型用途边缘特征两矩形左右/上下两块黑白检测垂直或水平边缘线性特征三矩形中间一块亮两边暗检测细长条状结构比如鼻梁中心环绕特征中心亮/暗四周相反检测对称的暗斑或亮斑对角线特征对角分成两块黑白相间检测对角线方向纹理就这么一个简单定义为什么它能代表“特征”你想想人脸眼睛区域的像素通常比脸颊暗鼻梁比两侧暗嘴巴区域和周围肤色有明显分界——这些结构虽然复杂但归根结底都可以拆成长宽不等的矩形对比。Haar特征做的就是把这些结构用“哪个框里像素值加起来大、哪个框里加起来小”来描述。值是正的说明白色区域更亮值是负的说明黑色区域更亮。这个符号不是重点重点是这个差值的大小和分布模式具备区分能力。1.2 一个窗口到底能生成多少Haar特征你可能想问既然模板种类就这么几种那特征数量应该不多吧错了Haar特征最大的问题就是数量爆炸。假设检测窗口固定大小比如24×24一个横向二矩形特征模板尺寸可以伸缩位置可以滑动。基本计算方式是这样如果模板基础宽度是w、高度是h窗口宽度是W、高度是H那么在一个固定尺寸下水平方向可以有W - w 1个合法位置垂直方向有H - h 1个合法位置而模板尺寸本身又可以按整数倍缩放。把所有模板、所有尺度、所有位置全部枚举一遍24×24窗口内的Haar特征总数量会超过18万个。这个“18万”不是一个可以忽略的数字。如果每个特征都要对原图直接计算一遍矩形区域像素和即便用很快的遍历方式检测一个窗口也会慢到没法用。也正因如此后面才会有积分图这种神级加速手段而且在训练阶段18万个特征不可能全部用上必须靠后面提到的提升算法去挑一小部分有效特征。理解这一点很重要Haar特征本身只是提供了一个巨大的候选池真正让它发挥作用的是“快速计算”和“特征筛选”这两件事。2. 积分图让特征计算从“慢悠悠”变“秒算”2.1 积分图是什么先做一张“累计账本”积分图这个思路特别像记账的时候先记累计金额。假设你想知道一个月里任何一小段时间花了多少钱最笨的方法是每天翻流水账把这段时间逐天相加聪明一点的做法是平时就记一个“到今天为止一共花了多少钱”那么任意时段的花费只需要用“到结束日的累计金额 - 到开始日前一天的累计金额”就够了。图像里的积分图就是这个记账本。定义很简单积分图在某个位置上的值等于原始图像左上角到该位置这个矩形区域内所有像素的灰度值之和。用公式表达ii(x, y) sum(I(i, j))其中i从1到xj从1到y。这样一张积分图尺寸和原图一样大实现时通常多一圈padding后面会讲但每个位置都存的是一个累计和。构建积分图有现成递推公式不需要每个位置重新从左上角遍历一遍ii(x, y) I(x, y) ii(x-1, y) ii(x, y-1) - ii(x-1, y-1)第一次看到这个公式的人往往会懵为什么要减掉一个ii(x-1, y-1)因为ii(x-1, y)已经包含了左上方区域的和ii(x, y-1)也包含了左上方区域的和两者相加会把左上角那块重叠部分加两遍必须减掉一次。这就是积分图递推公式的精髓也是后面矩形求和公式里“加回重叠”操作的镜像。2.2 任意矩形区域求和只要查四次表有了积分图计算原始图像中任意一个矩形区域的像素和变成了四次数组访问和三次加减法sum(x1, y1, x2, y2) ii(x2, y2) - ii(x1-1, y2) - ii(x2, y1-1) ii(x1-1, y1-1)这里(x1, y1)是矩形左上角坐标(x2, y2)是右下角坐标。为什么要加上最后那一项因为把右上角ii(x1-1, y2)和左下角ii(x2, y1-1)都减掉时左上角重叠区域ii(x1-1, y1-1)被减了两次所以得加回来一次。这个逻辑和递推公式完全对称。实际操作中为了处理边界方便很多人会把积分图做成比原图大一圈的数组第0行和第0列全部是0。这样原来公式里的负索引就全变成0代码里不需要写一堆if x1-1 0的判断实现起来干净利落。下面代码实现时就按这个方式做。2.3 用积分图计算Haar特征值现在我们回到Haar特征本身。一个二矩形Haar特征就是白色区域像素和减去黑色区域像素和。既然任意矩形区域都能用四次积分图查表获得那么一个二矩形特征就只需要算白色矩形像素和4次查表算黑色矩形像素和4次查表做一次减法。总共8次查表、几次加减法跟特征模板的尺寸完全无关。换句话说不管这个特征是1×1还是20×20只要积分图构建好了计算成本都一样这是Haar特征能实用化的关键。这也是为什么VJ那个时代的人脸检测器能跑到每帧15fps以上的原因之一窗口滑动、尺寸缩放都不需要重新统计原图全部查表解决。构建积分图本身也是一次全图扫描对每张图只需要做一次。如果同时对一个图像金字塔做检测每层都需要单独构建积分图但每层构建成本也只是单次O(图像面积)相比原来每个尺度都要遍历全部窗口、每个窗口都要算几十上百个矩形和提升不是一个数量级的。3. 从零手算一次Haar特征完整流程拆解3.1 准备一张小图和一组模板理论讲再多不如手算一次。我拿一个5×5的灰度矩阵做例子像素值我编得尽量简单方便口算验证列0 列1 列2 列3 列4 行0 1 2 1 2 1 行1 3 1 3 1 3 行2 1 2 1 2 1 行3 2 1 2 1 2 行4 1 3 1 3 1假设我要用一个横向二矩形特征左边两块当作白色区域右边两块当作黑色区域。具体来说白色区域第0列到第1列第0行到第4行坐标为(x0, y0)到(x1, y4)黑色区域第2列到第3列第0行到第4行坐标为(x2, y0)到(x3, y4)这里要注意Haar特征的矩形不一定刚好是上下两半或者左右两半你可以定义任意宽度比例比如白区两列、黑区两列模板整体宽4列、高5行。只要矩形之间不重叠就是一个合理特征。3.2 构建积分图再查表算特征值先把这张5×5矩阵的积分图算出来。我采用大一圈的6×6数组第0行、第0列为0第一个位置ii(1,1)等于原图(0,0)的像素值1。然后按递推公式慢慢填。最终积分图应该是这个形状0 0 0 0 0 0 0 0 1 3 4 6 7 0 0 4 8 15 18 28 0 0 5 11 19 24 37 0 0 7 14 24 29 46 0 0 8 19 29 38 61你随便挑一个格子验证比如ii(3,3)按定义应该是原图前3行前3列像素之和12131312115表格里第3行第3列确实是15说明填表过程没问题。然后用前面矩形求和公式白色区域像素和 ii(2,5) - ii(0,5) - ii(2,0) ii(0,0)。从表里查ii(2,5)是原图第0行到第4行、第0列到第1列的和按定义应该是71178841等等我重新核对一下表格数据。其实用手写5×5表直接累加更稳妥。白色区域第0列和第1列所有行加起来第0行123第1行314第2行123第3行213第4行134总和3433417。黑色区域第2列和第3列第0行123第1行314第2行123第3行213第4行134总和3433417。这样一来特征值 17 - 17 0。这个结果会让人有点疑惑怎么算出来是0因为这张图的行模式周期性太强左右两半确实完全对称特征值当然为0。这恰好说明一个很重要的事实特征值不是越大或者越小就越好它只是描述了一块区域内明暗对比的数值。如果特征正好覆盖在颜色分布均匀的区域结果就是0左右的小值。AdaBoost后面要做的就是给每个特征找一个阈值比如“当特征值大于某个值时判为前景否则判为背景”。0本身没有优劣之分。为了让例子更直观我可以把原矩阵改一下让白色区域整体偏亮一些。假设把第0列和第1列每个像素都加5其他不变。那白色区域总和变成17 5×10 67黑色区域仍是17特征值 50。正数说明白色区域更亮方向就出来了。3.3 特征归一化光照一变什么都没意义了直接算出的特征值有一个隐患光照敏感。假设同一张人脸白天和晚上拍的像素值整体偏亮或偏暗计算出来的特征值会整体变化同一个检测器的阈值就不稳定了。经典的检测方案里会做一步方差归一化原理是先计算整个检测窗口的均值和方差然后用它对特征值做归一化。一个简化的做法计算出整个窗口像素的标准差把每次特征值除以标准差。由于标准差本身也随光照同尺度变化除法就能抵消大部分光照影响。在实际工程中更常见的方式是构建积分图和平方积分图窗口均值用积分图算窗口标准差用平方积分图算这样归一化过程同样可以快速完成。平方积分图理解起来也不难就是原始图像先每个像素平方再构建积分图查询方式和普通积分图完全一样。3.4 一段能跑的参考代码下面是刚才手算过程的代码实现从灰度图到积分图再到特征值的完整链条。注意我用的是numpy数组为了方便演示没有加复杂的边界判断而是采用大一圈的padding方式import numpy as np def build_integral_image(gray): 构建积分图返回比原图多一行一列的二维数组 h, w gray.shape ii np.zeros((h 1, w 1), dtypenp.int64) for i in range(1, h 1): for j in range(1, w 1): ii[i, j] (gray[i - 1, j - 1] ii[i - 1, j] ii[i, j - 1] - ii[i - 1, j - 1]) return ii def rect_sum(ii, x1, y1, x2, y2): 计算原图坐标 (x1,y1) 到 (x2,y2) 矩形内像素和坐标从0开始 return (ii[y2 1, x2 1] - ii[y1, x2 1] - ii[y2 1, x1] ii[y1, x1]) def haar_two_rect(ii, white_rect, black_rect): white_rect/black_rect 格式: (x1, y1, x2, y2) return rect_sum(ii, *white_rect) - rect_sum(ii, *black_rect) gray np.array([ [1, 2, 1, 2, 1], [3, 1, 3, 1, 3], [1, 2, 1, 2, 1], [2, 1, 2, 1, 2], [1, 3, 1, 3, 1] ], dtypenp.uint8) ii build_integral_image(gray) white (0, 0, 1, 4) black (2, 0, 3, 4) value haar_two_rect(ii, white, black) print(特征值:, value) # 输出 0如果你把原图像素改一下再跑就能直观看到特征值怎样随宽度变化。输入一张真实灰度图也可以直接复用上面的代码只要把gray cv2.imread(...)读进来再转灰度就行。如果图像比较大纯Python双循环构建积分图会有点慢可以改用OpenCV的cv2.integral它内部做了优化速度会快非常多而且支持不同的输出精度类型。4. 实操中的常见坑与排查心得4.1 积分图会溢出吗别用太小的整数类型这是我最开始踩过的一个坑。一张分辨率稍微大一点的图比如1920×1080灰度图像素值按0到255算积分图里最大位置的累计值可能达到1920×1080×255约5.3亿。如果你用uint16存最大值只有65535直接溢出后面所有特征值计算全部是错的而且错得毫无规律排查起来非常头疼。所以构建积分图时内存类型至少要int32最保险的是int64。用OpenCV时也要明确指定sdepth参数默认情况下可能是已知精度但强烈建议显式写成cv2.CV_32S或cv2.CV_64F。如果做方差归一化还需要平方积分图平方之后的累计值更大尤其要用大的整数类型不然分分钟溢出。4.2 矩形坐标越界要么越界要么算错位置特征模板在窗口里枚举时最容易犯的错误是坐标算错。积分图的查询公式里面x1-1这种索引减1的操作一旦你直接实现而没有padding在矩形贴着左边界或上边界时会出现负索引。我建议统一采用“积分图比原图多一圈”的方案坐标从0开始转换到积分图索引时都加1这样边界情况全部自动消解代码里不用写一堆条件判断。另外矩形右边界和底边界也要检查枚举缩放尺寸的时候x2不能大于窗口宽度减1y2不能大于高度减1。实战中最好先把所有合法特征的位置、尺寸全部枚举出来生成一个列表再去计算对应特征值不要边算边判断否则逻辑容易乱。4.3 白色区域和黑色区域搞反了特征值会变号吗会变号但通常不是问题。Haar特征值本身可正可负同一个特征你把白色和黑色对调数值就从正变负。在训练阶段提升算法在选弱分类器时本来就要同时考虑正负两个方向它会尝试特征值 阈值判正也尝试特征值 阈值判正选出错误率更小的那个方向。所以不需要你自己去规定哪个区域必须亮哪个区域必须暗。不少开源实现为了直观会在训练前算完所有特征后取绝对值这样做能省一半的阈值搜索方向但也会丢失一些微妙的信息建议刚开始学习时保留正负号不要盲目加绝对值。4.4 特征数量太多怎么办别试图全部算一遍18万个特征如果全部显式计算训练时内存占用会非常夸张。很多初学者会把每个特征全算一遍存在numpy数组里算到后面计算机直接卡死。我的建议是如果目标是学习和理解只挑几个典型模板在几张图上可视化它们的响应重点看特征图和原图的结构对应关系如果想跑一个完整的检测Demo直接用OpenCV内置的训练结果不要自己从头训练如果确实要自己训练一个小模型尽量用能增量更新的方法比如构建一个生成器每次从特征池中随机采样一部分特征做弱分类器选择而不是一次性把全部特征矩阵放到内存里。4.5 用OpenCV的integral函数时候注意返回类型和通道顺序OpenCV的cv2.integral(src, sum, sdepth)用法很简洁但它返回的积分图数组维度是(H1, W1)首行首列是全0这个和手写版本一致。但有一点要留意如果你的图像是彩色图或者没有预先转成灰度OpenCV会默认按通道分别计算积分图返回的就不是单通道二维数组而是多通道三维数组后面你取特征值时就会踩坑。务必先转灰度再积分。5. 学完之后往哪延伸更值5.1 Haar特征不是孤立的它在经典检测框架里只是第一棒算完一个Haar特征只是整个过程的第一步。经典的目标检测框架通常把整件事拆成三步首先从一个检测窗口里穷举生成海量Haar特征其次用提升方法从这些特征中挑选少数几个高区分度的特征组合成一个强分类器最后多个强分类器级联起来先快速拒绝大部分不含目标的窗口再对剩下的少数窗口做精细判断。这里我推荐一个很实用的理解方式把Haar特征当成一个“候选池”AdaBoost负责在这个池子里打捞金矿。单个Haar特征太弱单独拿出来当分类器准确率可能只比随机好一点点但它计算极快AdaBoost每轮都会挑一个在当时区分度最高的特征并且给分错的样本加权下一轮就更容易选出和上一轮互补的特征。最后组合起来的强分类器往往只用几十个特征就能达到很高的准确率而且推理时只用算这几十个特征不是把18万个全算一遍。5.2 手工特征和深度学习特征的关系别站错队现在很多人一提到传统视觉特征就摇头觉得都是过去式。但你在实际项目里可能会遇到这样的场景硬件资源有限模型太大部署不上或者需要极低延迟深度学习还没有压缩到足够快又或者整个系统里只是需要在固定位置判断一个窗口里有没有某种小目标完全没必要拖一个大模型上去。这时候Haar、LBP这类手工特征依然能打。再看现在几乎成为默认方案的卷积神经网络它本质上也在学特征只不过特征是在训练时自动从数据中总结出来的而不是手动定义矩形模板。理解Haar特征能帮你更好地理解“特征”这件事的本质不管手工还是自动都要捕捉局部结构的统计规律。另外Haar特征那种用积分图做快速区域聚合的思想在深度学习里也有变体比如一些快速池化方法会预计算累计和来加速任意区域特征聚合底层思路是共通的学完不亏。我个人建议入门计算机视觉不要一上来就只泡在深度学习框架里花半天时间把Haar特征手推一遍再做点小实验对图像的局部纹理、区域统计、特征筛选、光照鲁棒性这些概念的体感会强很多。积累下来的积分图套路后面你写滑动窗口算法、做区域聚合、搞感兴趣区域统计时都能用到这笔账怎么算都不亏。

相关新闻

AliFlutter:超大型App的Flutter工程化底盘与规模化治理实践

AliFlutter:超大型App的Flutter工程化底盘与规模化治理实践

/* 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 6:16:51 阅读更多 →
储能电池被动均衡方案:MP2642GR-Z与PIC32MZ2048EFH144选型与实现

储能电池被动均衡方案:MP2642GR-Z与PIC32MZ2048EFH144选型与实现

/* 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 6:16:51 阅读更多 →
Carthage编译静态库实战:iOS二进制化改造完整指南

Carthage编译静态库实战:iOS二进制化改造完整指南

/* 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 6:16:51 阅读更多 →

最新新闻

Windows高DPI缩放导致软件模糊的完整排查与修复指南

Windows高DPI缩放导致软件模糊的完整排查与修复指南

1. 模糊问题的根源:高DPI缩放下,程序到底发生了什么你现在很可能正遇到这样一个场景:刚换上 2K 或 4K 显示器,系统为了让界面看得清,把缩放比例调到了 125% 或 150%。Windows 自带的设置界面很锐利,可双击某…

2026/10/16 6:49:57 阅读更多 →
Linux pthread线程控制实战:生命周期、同步与死锁排查

Linux pthread线程控制实战:生命周期、同步与死锁排查

编写 Thread 的目的,绝不只是"让函数并行跑起来"。实际开发中,真正让人头疼的往往是:线程怎么退出才安全?主线程怎么知道子线程干完了?栈空间设多大不死锁?多线程访问同一份数据时怎么保证不出错…

2026/10/16 6:49:57 阅读更多 →
CMake 中将 .c 文件当 C++ 编译:方法、链接坑与迁移建议

CMake 中将 .c 文件当 C++ 编译:方法、链接坑与迁移建议

Windows 上用 CMake 做 C/C 混合项目,这个问题隔三岔五就会有人问一次:.c文件到底能不能在 CMake 里直接编译成 C 代码。我最初遇到它,是接手一个遗留算法库的时候,核心文件全是一堆.c,主程序却早就全面 C 化了&#x…

2026/10/16 6:49:57 阅读更多 →
CAT12+SPM实战:VBM灰质体积分析全流程与避坑指南

CAT12+SPM实战:VBM灰质体积分析全流程与避坑指南

简介:这是基于MATLAB的CAT12工具箱,专为神经影像领域的体素形态计量学(VBM)分析设计,面向需要处理结构磁共振数据、比较不同个体或群体脑灰质/白质形态差异的研究者。压缩包共518个文件,约124MB&#xff0c…

2026/10/16 6:49:57 阅读更多 →
Linux用户与组管理实战:从配置文件到权限联动全解析

Linux用户与组管理实战:从配置文件到权限联动全解析

做Linux运维这些年,Linux用户与组管理是让我觉得最基础、也最容易被忽视的一块。很多新手一上来就折腾各种服务部署,等碰到权限报错、用户冲突、文件归属混乱时,才发现当初没把这套体系吃透。这篇文章不打算讲虚的,就当作一次完整…

2026/10/16 6:49:57 阅读更多 →
卡牌随机生成方案:加权随机算法与词缀池设计实战(含Java示例)

卡牌随机生成方案:加权随机算法与词缀池设计实战(含Java示例)

最近在做一个卡牌玩法原型时,遇到一个挺有意思的需求:能不能让卡牌真正意义上“全部随机生成”,而不是靠策划手动一张张配数值?于是我把整套逻辑拆成了卡牌词缀池、随机算法、稀有度权重、生成校验四层结构来设计。本文整理了一套…

2026/10/16 6:48:57 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* 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 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

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

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →